Поделиться через


/RTC (проверки ошибок во время выполнения)

Обновлен: Ноябрь 2007

Этот параметр используется вместе с прагма-директивой runtime_checks для включения или отключения функции проверки ошибок во время выполнения.

 /RTC1 /RTCc /RTCs /RTCu

Аргументы

  • 1
    Эквивалентен /RTCsu.

  • c
    Сообщает, когда значение преобразуется к типу данных меньшего размера, что приводит к потере данных. Пример такой ситуации — случай, в котором значение типа short 0x101 присваивается переменной типа char.

    Этот параметр выдает сообщение в ситуациях, в которых планируется усечение, например, когда первые восемь бит значения типа int требуется вернуть как значение типа char. Поскольку аргумент /RTCc приводит к возникновению ошибки во время выполнения, если при присваивании теряется какая-либо информация, можно замаскировать нужную информацию, чтобы избежать ошибки во время выполнения вследствие применения /RTCc. Например:

    #include <crtdbg.h>
    
    char get8bits(int value, int position) {
       _ASSERT(position < 32);
       return (char)(value >> position);
       // Try the following line instead:
       // return (char)((value >> position) && 0xff);
    }
    
    int main() {
       get8bits(12341235,3);
    }
    
  • s
    Включает проверку ошибок фрейма стека во время выполнения следующим образом:

    • Локальные переменные инициализируются ненулевыми значениями. Это помогает обнаружить ошибки, которые не появляются при выполнении в режиме отладки. В отладочном построении больше шансов на то, что стековые переменные будут иметь нулевые значения, чем в выпускном, поскольку компилятор оптимизирует стековые переменные в выпускном построении. После того, как программа использовала область стека, компилятор никогда не будет восстанавливать в нем нулевые значения. Следовательно, в дальнейшем неинициализированные стековые переменные, использующие ту же область стека, могут возвращать значения, оставшиеся после первого использования этой области стековой памяти.

    • Выявляются случаи переполнения и выхода за границы локальных переменных, например массивов. Параметр /RTCs не будет выявлять случаи переполнения при обращении к памяти, выделенной в результате использования вносимого компилятором заполнения внутри структур. Заполнение может возникать при использовании параметра align (C++), /Zp (Выравнивание члена структуры) или pack, или же в случае, когда элементы структуры упорядочиваются способом, при котором компилятору требуется внести заполнение.

    • Выполняется проверка указателя стека, при которой выявляется его повреждение. Повреждение указателя стека может произойти в результате несоответствия соглашений о вызовах. Пример такой ситуации — вызов функции из библиотеки DLL, экспортированной как __stdcall, с помощью указателя на функцию, объявленного как __cdecl.

  • u
    Сообщает об случаях использования неинициализированных переменных. Например, инструкция, приводящая к возникновению предупреждения компилятора Предупреждение компилятора (уровень 4) C4701, может также привести к ошибке во время выполнения при использовании параметра /RTCu. Любая инструкция, приводящая к возникновению Предупреждение компилятора (уровень 1 и уровень 4) C4700, при использовании параметра /RTCu будет создавать ошибку во время выполнения.

    Тем не менее, рассмотрим следующий фрагмент кода:

    int a, *b, c;
    if ( 1 )
    b = &a;
    c = a;  // No run-time error with /RTCu
    

    Если переменная могла быть инициализирована, то параметр /RTCu не сообщит о ней во время выполнения. Например, после создания указателя-псевдонима переменной компилятор не будет ее отслеживать и сообщать об ее использовании без инициализации. По сути, переменную можно инициализировать, получив ее адрес. В такой ситуации оператор "&" работает как оператор присваивания.

Заметки

Проверки ошибок во время выполнения — это способ обнаружения проблем в выполняющемся коде. Дополнительные сведения см. в разделе Практическое руководство. Настройка проверок во время выполнения машинного кода.

При компиляции программы из командной строки с помощью какого-либо из параметров компилятора /RTC выполнение всех прагма-директив optimize в коде будет прекращено без уведомления. Это происходит вследствие того, что проверки ошибок во время выполнения не действуют в выпускаемом (оптимизированном) построении.

Параметр /RTC следует использовать для разрабатываемых построений; /RTC не должен использоваться для окончательных построений. Параметр /RTC при компиляции нельзя использовать вместе с оптимизацией (см. раздел Параметры /O (оптимизация кода)). Образ программы, построенный с параметром /RTC, будет немного больше и немного медленнее, чем образ, построенный с параметром /Od (снижение скорости не превысит 5 процентов по сравнению с построением /Od).

При использовании любого параметра /RTC или параметра /GZ будет использована директива препроцессора __MSVC_RUNTIME_CHECKS.

Установка параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Открытие свойств страниц проекта.

  2. Выберите папку C/C++.

  3. Выберите страницу свойств Создание кода.

  4. Измените свойство Основные проверки времени выполнения, свойство Проверка на преобразование к меньшему типу, или же оба этих свойства.

Установка параметра компилятора программным способом

Примечания для разработчиков интеллектуальных устройств

В компиляторах устройств средство RTC поддерживается только в архитектуре x86 и не предоставляется в качестве значения свойства для проектов устройств Visual C++ в интегрированной среде разработки Visual Studio. Однако в случае, когда целевой платформой является x86, этот параметр можно установить в интегрированной среде разработки в области Дополнительные параметры страницы свойств Командная строка C/C++.

См. также

Задачи

Образец RTC: проверка ошибок во время выполнения

Ссылки

Параметры компилятора

Настройка параметров компилятора