>
>
Проблема с символами '(' и ')' в систем…

Павел Еремеев
Статей: 38

Проблема с символами '(' и ')' в системной переменной PATH при использовании PVS-Studio из Visual Studio 2008

Иногда у пользователей статического анализатора PVS-Studio, использующих среду Visual Studio 2008, возникает следующая проблема при запуске анализа.

Анализ не начинается, а выдаётся только одно сообщение вида:

\Utilities\Bin\x86";"C:\WINDOWS\system32";"C:\WINDOWS";
"C:\WINDOWS\System32\Wbem";"C:\Program. was unexpected at this time.

После изучения данной проблемы мы смогли установить, что такое поведение вызвано ошибкой в одном из bat файлов настройки окружения Visual Studio. Вот этот файл:

..\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat

Анализатор PVS-Studio использует файл vsvars32.bat для настройки окружения перед запуском препроцессора Visual C++. Оказалось, что проблема возникает из-за нижеприведённого фрагмента файла:

@if not "%WindowsSdkDir%" == "" (
 set "PATH=%WindowsSdkDir%bin;%PATH%"
 set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%"
 set "LIB=%WindowsSdkDir%lib;%LIB%"
)

Данная ошибка проявится, если переменная окружения PATH будет содержать символы '(' и ')', например, в неё будет включён путь до Microsoft DirectX SDK - "C:\Program Files\Microsoft DirectX SDK (August 2006)\Utilities\Bin\x86". Тогда выражение, следующее за оператором if

@if not "%WindowsSdkDir%" == "" (
 set "PATH=%WindowsSdkDir%bin;%PATH%"

обрывается одной из закрывающих скобок в PATH, в данном случае ..August 2006), что и приводит к рассматриваемой проблеме.

Данную ситуацию можно разрешить 2-мя способами:

  • Исключить из системной переменной PATH все пути, содержащие символы '(' и ')'.
  • Переписать условие if, используя оператор goto, например следующим образом:
@if "%WindowsSdkDir%" == "" goto SkipSDKVariableSet

@set "PATH=%WindowsSdkDir%bin;%PATH%"
@set "INCLUDE=%WindowsSdkDir%include;%INCLUDE%"
@set "LIB=%WindowsSdkDir%lib;%LIB%"

:SkipSDKVariableSet

Второе решение создаёт дополнительную проблему с установкой обновлений, которые могут переписать данный участок файла vsvars32.bat.