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


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

Этот параметр используется вместе с прагма-директивой 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
    Сообщает, когда используется неинициализированная переменная. Например, инструкция, приводящая к возникновению предупреждения компилятора 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 sample