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