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

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

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

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

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

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

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



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

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

```cpp
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\+\+ превратил в:

```cpp
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) {
...
```

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

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

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

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

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

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

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