Ответ 1
Я не могу ответить на вопрос 1. Однако мне трудно представить, что использование этого слова должно означать, что правило было необязательным.
Что касается вопроса 2, вам потребуется поддержка от компилятора/компоновщика. Вы не можете рассчитывать на то, чтобы вернуться к этому с помощью инструмента редактирования пост-ссылок PE. Рассмотрим следующий код:
try
Beep;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Компилятор испускает следующее:
Project1.dpr.11: try
0041C3AA 33C0 xor eax,eax
0041C3AC 55 push ebp
0041C3AD 68C9C34100 push $0041c3c9 // exception handler is at $0041c3c9
0041C3B2 64FF30 push dword ptr fs:[eax]
0041C3B5 648920 mov fs:[eax],esp
Project1.dpr.12: Beep;
0041C3B8 6A00 push $00
0041C3BA E8E1CEFEFF call MessageBeep
0041C3BF 33C0 xor eax,eax
0041C3C1 5A pop edx
0041C3C2 59 pop ecx
0041C3C3 59 pop ecx
0041C3C4 648910 mov fs:[eax],edx
0041C3C7 EB59 jmp $0041c422
0041C3C9 E97291FEFF jmp @HandleOnException
0041C3CE 0100 add [eax],eax
0041C3D0 0000 add [eax],al
0041C3D2 E42F in al,$2f
0041C3D4 41 inc ecx
0041C3D5 00DA add dl,bl
0041C3D7 C3 ret
0041C3D8 41 inc ecx
0041C3D9 00A3D83E4200 add [ebx+$00423ed8],ah
Project1.dpr.15: Writeln(E.ClassName, ': ', E.Message);
........
Теперь реальный обработчик исключений HandleOnException
, реализованный в System.pas
. Но адрес, вставленный в стек, - это $0041c3c9
, адрес, локальный для кода, содержащего блок try/except
. Это означает, что для создания раздела SafeSEH PE вам необходимо найти все try/except
в вашем коде. Хотя это, очевидно, возможно, я не думаю, что это сносно.
Я скорее предположил, что обработчики исключений SEH для компилятора x86 будут просто функциями _HandleXXX
, объявленными в System.pas
. В этом случае было бы легко добавить раздел PE, в котором перечислены только эти функции как шаг после ссылки. Однако, поскольку каждый try/except
имеет свой собственный локальный обработчик исключений, теперь я считаю, что только автор компилятора может реально надеяться добавить раздел SafeSEH PE.
Есть, насколько я вижу, отчет о QC, который запрашивает поддержку SafeSEH
для компилятора Windows x86. Я предлагаю вам зарегистрировать отчет о контроле качества и официальное подтверждение.
Обновление: Хорошо сделано для @haimg для успеха, когда я потерпел неудачу и сумел найти отчет QC: QС# 106781.