/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
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Открытие свойств страниц проекта.
Откройте папку C/C++.
Выберите страницу свойств Создание кода.
Измените свойство Основные проверки времени выполнения, свойство Проверка на преобразование к меньшему типу, или же оба этих свойства.
Установка данного параметра компилятора программным способом
- См. описание свойств BasicRuntimeChecks и SmallerTypeCheck.
См. также
Ссылки
Настройка параметров компилятора