Инструмент для проверки влияния переключателей соответствия Visual Studio на сгенерированный код - PullRequest
0 голосов
/ 27 августа 2018

В последней версии Visual Studio (15.7), выпущенной в минорном выпуске, реализован переключатель / permissive- компилятора, который, помимо прочих эффектов, включает двухфазный поиск имен для шаблонов (https://docs.microsoft.com/en-us/cpp/build/reference/permissive-standards-conformance).. Я бы хотел включить этот переключатель на нашей кодовой базе длиной около 4 млн. Проблема в том, что созданные экземпляры шаблонов могут измениться, если этот переключатель включен (см. первый пример на https://blogs.msdn.microsoft.com/vcblog/2017/09/11/two-phase-name-lookup-support-comes-to-msvc/),, который приводит к бесшумным изменениям поведения во время выполнения.

Есть ли способ проверить, идентичен ли код, сгенерированный с этим включенным переключателем соответствия, старому коду?

Я знаю, что правильный ответ - "ты запускаешь свои юнит-тесты, да!" К сожалению, из-за большого количества устаревшего кода это недостижимо в течение следующих нескольких лет, поэтому я ищу альтернативу.

Выполнение сравнения в двоичных файлах не помогает, поскольку существуют различия, связанные с изменениями метаданных. Новые ошибки компиляции на самом деле тоже не помогают: они раскрывают только несоответствующий синтаксис; Изменения в сгенерированном коде все еще могут быть скрыты. На самом деле видеть сгенерированный код не важно. Было бы достаточно инструмента, показывающего «эта строка будет компилироваться по-другому». Или что-то похожее на то, что «Preprocess to a File» делает для препроцессора.

Лучшее, что я могу придумать, - это проверить сгенерированные символы с помощью инструмента dumpbin для каждого файла .obj, чтобы увидеть, генерируются ли те же самые символы. Это может выявить только подмножество проблем: набор экземпляров шаблона в файле может быть идентичным, но их расположение в коде может измениться.

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете проанализировать выходные данные компилятора (на уровне сборки), чтобы проверить различия, сгенерированные с указанными вами двумя настройками компилятора.

Пожалуйста, посмотрите на этот связанный SO вопрос о компиляторах Visual C ++.

Кроме того, лучше подходит для относительно небольших частей кода,
вы можете использовать чудесный компилятор GodBolt ,
он выполняет ту же задачу, но с удобным веб-интерфейсом и распространяется на различные компиляторы (не только Microsoft Visual C ++).
Я уверен, что он станет одним из самых ценных инструментов в наборе инструментов вашего разработчика.

...