/Qspectre-load-cf
Задает создание инструкций сериализации компилятора для каждой инструкции потока управления, содержащей нагрузку. Этот параметр выполняет подмножество мер, выполненных параметром /Qspectre-load .
Синтаксис
/Qspectre-load-cf
Замечания
/Qspectre-load-cf приводит компилятору обнаруживать JMP
инструкции RET
по потоку управления, которые загружаются из памяти, а CALL
также вставлять инструкции сериализации после загрузки. По возможности эти инструкции разделяются на нагрузку и передачу потока управления. За нагрузкой LFENCE
следует, чтобы обеспечить защиту нагрузки. Существуют случаи, когда компилятор не может разделить инструкции, например JMP
инструкцию, поэтому он использует альтернативный метод устранения рисков. Например, компилятор уменьшается jmp [rax]
путем добавления инструкций по загрузке целевого недеструктивного объекта перед вставкой LFENCE, как показано ниже:
xor rbx, [rax]
xor rbx, [rax] ; force a load of [rax]
lfence ; followed by an LFENCE
jmp [rax]
Поскольку /Qspectre-load-cf останавливает спекуляции всех загрузок в инструкциях по потоку управления, производительность высока. Устранение рисков не подходит везде. Если есть критически важные блоки кода, которые не требуют защиты, можно отключить эти способы устранения рисков с помощью __declspec(spectre(nomitigation))
.
Параметр /Qspectre-load-cf отключен по умолчанию и поддерживает все уровни оптимизации.
Qspectre-load-cf Параметр /доступен в Visual Studio 2019 версии 16.5 и более поздних версий. Этот параметр доступен только в компиляторах, предназначенных для процессоров x86 и x64. Он недоступен в компиляторах, предназначенных для процессоров ARM.
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Создание кода.
Выберите новое значение для свойства "Устранение рисков Spectre". Чтобы применить изменение, нажмите кнопку ОК.
Установка данного параметра компилятора программным способом
- См. раздел AdditionalOptions.
См. также
/Qspectre
/Qspectre-jmp
/Qspectre-load
/Q (низкоуровневые операции)
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC