# V001. A code fragment from 'file' cannot be analyzed.

Анализатор не всегда может полностью проанализировать файл с исходным кодом.

Это может произойти по трем причинам:

1) Ошибка в коде

В коде имеется шаблонный класс или шаблонная функция с ошибкой в коде. Если эта функция не инстанцируется, то компилятор не диагностирует в ней наличие некоторых ошибок. Другими словами наличие такой ошибки не мешает компиляции. Анализатор PVS-Studio пытается искать потенциальные ошибки даже в классах и функциях, которые нигде не используются. В случае если анализатор не может разобрать код, то он и выдаст предупреждение V001. Рассмотрим пример кода:

    template <class T>
    class A
    {
    public:
      void Foo()
      {
        //Забыли ;
        int x
      }
    };

Этот код будет скомпилирован Visual C++, если класс A не будет нигде использоваться. Однако ошибка в нем присутствует, что мешает работе PVS-Studio.

2) Ошибка в препроцессоре Visual C++

Анализатор в процессе своей работы использует препроцессор Visual C++. Этот препроцессор очень редко, но все же допускает ошибки при генерации препроцессированных *.i файлов. В результате анализатор получает на вход некорректные данные. Рассмотрим пример:

    hWnd = CreateWindow (
      wndclass.lpszClassName,    // window class name
      __T("NcFTPBatch"),         // window caption
      WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
        // window style
      100,            // initial x position
      100,            // initial y position
      450,            // initial x size
      100,            // initial y size
      NULL,           // parent window handle
      NULL,           // window menu handle
      hInstance,      // program instance handle
      NULL);          // creation parameters
    if (hWnd == NULL) {
    ...

Приведенный фрагмент кода, препроцессор Visual C++ превратил в:

    hWnd = // window class name// window caption// window style//
    initial x position// initial y position// initial x size//
    initial y size// parent window handle// window menu handle//
    program instance handleCreateWindowExA(0L,
    wndclass.lpszClassName, "NcFTPBatch", 0x00000000L | 0x00C00000L |
     0x00080000L | 0x00020000L, 100, 100,450, 100, ((void *)0),
    ((void *)0), hInstance, ((void *)0)); // creation parameters
    if (hWnd == NULL) {
    ...

Получается, что в коде написано следующее:

    hWnd = // длинный комментарий
    if (hWnd == NULL) {
    ...

Этот код некорректен, о чем и выдаст сообщение PVS-Studio. Конечно, это недоработка PVS-Studio и со временем мы это исправим.

Отметим также, что Visual C++ успешно компилирует этот код, так как алгоритмы, используемые в нем для компиляции и для генерации препроцессированных *.i-файлов различны.

3) Недоработка внутри PVS-Studio

В редких случаях PVS-Studio неспособен разобрать сложный шаблонный код.

Какова не была бы причина выдачи сообщения V001, это сообщение не критично. Как правило, неполный разбор файла не несущественен с точки зрения анализа. PVS-Studio просто пропускает функцию/класс с ошибкой и продолжает анализ файла. Непроанализированным остается совсем небольшой участок кода.