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


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

Используется для включения и отключения функции проверки ошибок во время выполнения вместе с runtime_checks pragma.

Синтаксис

/RTC1
/RTCc
/RTCs
/RTCu

Аргументы

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

/RTCc
Сообщает, когда значение назначается меньшему типу данных и приводит к потере данных. Например, он сообщает, назначается ли short значение 0x0101 типа переменной типа char.

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

#include <crtdbg.h>

char get8bits(unsigned 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);
}

Поскольку /RTCc отклоняет код, соответствующий стандарту, он не поддерживается стандартной библиотекой C++. Код, использующий /RTCc и стандартная библиотека C++, могут вызвать ошибку компилятора C1189. Вы можете определить _ALLOW_RTCc_IN_STL , чтобы замолчать предупреждение и использовать /RTCc этот параметр.

/RTCs
Включает проверку ошибок во время выполнения кадра стека, как показано ниже.

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

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

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

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

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

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

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

Замечания

Проверки ошибок во время выполнения — это способ поиска проблем в работающем коде; Дополнительные сведения см. в разделе "Практическое руководство. Использование собственных проверок во время выполнения".

В командной строке можно указать несколько /RTC вариантов. Аргументы параметров могут быть объединены; например, то же самое, /RTCcu что /RTCc /RTCuи .

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

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

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

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

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Создание кода.

  3. Измените одно или оба из следующих свойств: основные проверки среды выполнения или проверка меньшего типа.

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

См. также

Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC
Практическое руководство. Настройка проверок во время выполнения машинного кода