Microsoft добавила удобный /Qspectre
к своему компилятору MSVC (хотя, похоже, это только (пытается) смягчить Spectre v1 на данный момент), что они будут обновляться с течением времени. Это очень приятно с точки зрения пользователей, просто включите этот флаг, и вы получите последнее и самое большое смягчение, которое у них есть.
С LLVM и GCC это выглядит несколько иначе. Я не думаю, что их смягчения официально выпущены.
LLVM должен получить флаг -mretpoline
для компилятора, который смягчает Spectre v2 через возвратные батуты для косвенных вызовов.
GCC, с другой стороны, имеет исправления, которые добавляют три параметра компилятора для смягчения Spectre v2:
-
-mindirect-branch
, который может быть установлен наthunk
. Как я понимаю, это создает ретрополины для каждого косвенного вызова. -
-mfunction-return
, который может быть установлен наthunk
. Я предполагаю, что это использует эти retpolines для каждого возврата функции, что может потребоваться для Skylake, потому что эти процессоры также могут прогнозировать возврат? -
-mindirect-branch-register
Используется ли регистр вместо стека для хранения адреса косвенного вызова?
Итак, я очень смущен. Какая опция компилятора смягчает то, что и в каких сценариях они необходимы для приложения пользовательского пространства?
Хорошо ли вообще включить их? Будут ли они также генерировать эти retpolines, если они скомпилированы для архитектуры процессора, которая даже не имеет какого-либо спекулятивного исполнения (например, микропроцессоров)?
Как насчет Spectre v1?
UPDATE:
Позвольте мне задать более точные вопросы:
- Насколько я понимаю, что параметры компилятора исправляют?
- Используются ли опции GCC повсюду или только для процессоров со спекулятивным исполнением?
- Используются ли параметры LLVM повсюду или только для процессоров со спекулятивным исполнением?
- Что именно смягчают эти параметры (полностью ли они смягчают призрак v2)?
- Давайте рассмотрим все остальное, что я попросил, чтобы были дополнительные "бонусные" вопросы, которые хорошо знать, но не существенны для моего вопроса.