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