В последней версии 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, чтобы увидеть, генерируются ли те же самые символы. Это может выявить только подмножество проблем: набор экземпляров шаблона в файле может быть идентичным, но их расположение в коде может измениться.