Для получения триального ключа
заполните форму ниже
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Бесплатная лицензия PVS-Studio для специалистов Microsoft MVP
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Мне интересно попробовать плагин на:
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте папку
Spam/Junk и нажмите на письме кнопку "Не спам".
Так Вы не пропустите ответы от нашей команды.

>
>
Перестал анализироваться файл с директи…

Перестал анализироваться файл с директивой 'import' (compiler internal error 'msc1.cpp'). Что делать?

28 Фев 2019

Несколько раз нам писали пользователи, у которых перестал работать анализ части проектов. Общей особенностью было использование директивы '#import' в проблемных файлах. В данной заметке будет кратно описано, с чем связана проблема, и что делать для возобновления работы анализа.

Примечание. Данная заметка актуальна только для Windows при использовании компилятора 'cl.exe' для препроцессирования.

Проблема

Для поиска ошибок в коде, написанном на языках C, C++, PVS-Studio использует препроцессированные файлы. Для их получения анализатор полагается на сторонние инструменты, в частности – на компилятор cl.exe. Для указания необходимости генерации препроцессированных файлов для cl.exe используется флаг '/P'.

Проблема заключается в том, что, начиная с версии Visual Studio 15.8 (и соответствующей версии Visual C++ - VC++ 2017 version 15.8 v14.15 toolset), при запуске cl.exe с флагом '/P' на файлах, содержащих директиву '#import', в компиляторе возникает ошибка.

При этом сборка (когда компилятору не передаётся флаг '/P') проходит успешно. Со стороны это может выглядеть примерно так: проект успешно собирается, но анализатор PVS-Studio не работает. Вывод анализатора на проблемных файлах будет примерно следующим:

c:\program files (x86)\microsoft visual 
studio\2017\community\vc\tools\msvc\14.16.27023\include\comdef.h: 
fatal error C1001: An internal error has occurred in the compiler.
(compiler file 'msc1.cpp', line 1518)
Internal Compiler Error in c:\program files (x86)\microsoft visual 
studio\2017\community\vc\tools\msvc\14.16.27023\bin\hostx64\x64\cl.exe

Если вы столкнулись с такой проблемой, скорее всего, ваш проект использует Platform Toolset V141, и проблема возникла после обновления Visual Studio и соответствующих пакетов Visual C++ (и компилятора, соответственно) на более свежую версию. В итоге сборка проекта всё также проходит успешно, а вот анализ – нет.

Чтобы убедиться, что проблема действительно в компиляторе, можете попробовать выставить в настройках соответствующего проекта флаг '/P' и выполнить сборку. Выставление флага: Properties|C/C++|Preprocessor|Preprocess to a File -> Yes(/P).

Кстати, про эту проблему есть отдельная тема на форуме Visual Studio: https://developercommunity.visualstudio.com/content/problem/313306/vs2017-158-internal-compiler-error-msc1cpp-line-15-1.html

Решения

К сожалению, описанная проблема до сих пор актуальна, и будет исправлена, скорее всего, только в следующем релизе Visual Studio. Однако, вы можете продолжать использовать PVS-Studio для проверки проектов, затронутых данной проблемой, с помощью небольшого workaround'а.

Использование макроса 'PVS_STUDIO'

При вызове компилятора для препроцессирования анализатором задаётся дополнительный макрос – 'PVS_STUDIO'. Используя этот макрос, вы можете обернуть проблемные строки кода директивой #ifdef - это позволит игнорировать их препроцессору, но при этом не затронет компиляцию кода. Как минимум, следует обернуть саму директиву '#import':

#if !defined(PVS_STUDIO)
 #import
 ...
#endif

Обратите внимание, что в таком случае обёрнутая в директиву часть кода не попадёт в результирующие препроцессированные файлы. В большинстве случаев данная правка не должна повлиять на результаты анализа.

Использование рабочей версии компилятора

Примечание. Данная проблема была решена в версии компилятора в составе Visual Studio (2017) 15.9.14.

Вы можете откатиться на более старую версию компилятора (или более новую), в которой описанной выше проблемы нет (напоминаю, она появилась, начиная с VC++ 2017 Version 15.8 v14.15 toolset).

Заметьте, что Visual Studio 2017 позволяет устанавливать на систему несколько экземпляров Platform Toolset V141, что позволит, при желании, не уменьшать версию Platform Toolset в проекте.

0613_ImportCompilerInternalError_ru/image1.webp

Указать необходимые для использования версии компилятора можно в файлах <VsInstanceDir>\VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.[txt|props], где <VsInstanceDir> - установочная директория конкретного выпуска Visual Studio.

Популярные статьи по теме
Единороги компании PVS-Studio

Дата: 30 Авг 2022

Автор: Андрей Карпов

Скорее всего вы перешли на эту статью, заинтересовавшись одним из наших рисунков единорогов. Приятно видеть ваш интерес. Сейчас мы расскажем, почему рисуем этих единорогов, что они означают и чем воо…
Обрабатывать ли в PVS-Studio вывод других инструментов?

Дата: 26 Май 2022

Автор: Андрей Карпов

Анализатор PVS-Studio умеет "схлопывать" повторяющиеся предупреждения. Предоставляет возможность задать baseline, что позволяет легко внедрять статический анализ в legacy-проекты. Стоит ли предостави…
15000 ошибок в открытых проектах

Дата: 24 Май 2022

Автор: Андрей Карпов

Количество багов в нашей коллекции перевалило за отметку 15000. Именно такое количество ошибок обнаружила команда PVS-Studio в различных открытых проектах. Особенно интересно, что это всего лишь побо…
Комментарии в коде как вид искусства

Дата: 04 Май 2022

Автор: Сергей Хренов

Приветствую всех программистов, а также сочувствующих. Кто из нас хотя бы раз в жизни не оставлял комментарии в коде? Был ли это ваш код, а может, чужой? Что за комментарии вы написали: полезные или …
Visual Studio 2022 стильно и свежо. История о её поддержке в PVS-Studio

Дата: 15 Фев 2022

Автор: Николай Миронов

Кажется, анонс Visual Studio 2022 был только недавно, и вот она уже вышла. Это означало ровно одно – поддержать данную IDE нужно в ближайшем релизе PVS-Studio. О том, с какими сложностями пришлось ст…

Комментарии (0)

Следующие комментарии
Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно. Хотите узнать подробнее?
Принять