Я как бы обошел дома здесь, и я думал, что нашел решение. Это, безусловно, правильно определяет проблемы, о которых я знаю, но также приводит к необъяснимым сбоям примерно в половине всех тестовых случаев системы.
Проблема в том, что наш код должен вызывать клиентский код как dll. У нас есть контроль над нашим кодом, но не у клиентов, и опыт показывает, что их код не всегда безупречен. Я защитился от ошибок сегментации, выйдя из программы с четким сообщением о том, что могло пойти не так, но у меня также было несколько исключений деления на ноль, исходящих из клиентского кода, которые я хотел бы идентифицировать и устранить. затем выйдите.
То, что я хотел сделать, это:
- Непосредственно перед запуском клиентской dll включите самоанализ с плавающей запятой.
- Запустите клиентский код.
- Проверьте наличие проблем.
- Отключите самоанализ ради скорости.
Теоретически существует несколько способов сделать это, но многие из них, похоже, не работают для VS2010.
Я пытался использовать прагму float_point:
#pragma float_control(except, on, push)
// run client code
#pragma float_control(pop)
__asm fwait; // This forces the floating point unit to synchronise
if (_statusfp() & _SW_ZERODIVIDE)
{
// abort the program
}
Это должно быть хорошо в теории, и на практике это работает хорошо в 50% случаев.
Я думаю, что проблема может заключаться в том, что элемент управления с плавающей запятой остается включенным и вызывает проблемы в другом месте кода.
По данным microsoft.com:
Переключатели /fp:precise, /fp:fast, /fp:strict и /fp:except управляют семантикой с плавающей запятой для каждого файла. Прагма float_control обеспечивает такой контроль для каждой функции. ."
Однако во время компиляции я получаю предупреждение:
предупреждение C4177: #pragma 'float_control' следует использовать только в глобальной области или области пространства имен
Что на первый взгляд является прямым противоречием.
Итак, мой вопрос:
- Верна ли документация или это предупреждение (держу пари на предупреждение)?
- Есть ли надежный и безопасный способ сделать это?
- Стоит ли вообще это делать, или это слишком опасно?