﻿# V1029\. Numeric Truncation Error\. Return value of function is written to N\-bit variable\.

Анализатор обнаружил, что длину контейнера или строки кладут в 16\-битную или 8\-битную переменную\. Это опасно, так как даже на не очень больших данных может произойти ошибка из\-за того, что размер не помещается в заданную переменную\.

Некорректный код:

```cpp
std::string str;
....
short len = str.length();
```

Необходимо использовать тип 'size\_t', который точно вместит в себя размер любой строки/контейнера:

```cpp
size_t len = str.length();
```

Или, если быть более точными и педантичными, то тип 'std::string::size\_type':

```cpp
std::string::size_type len = str.length();
```

Или можно воспользоваться ключевым словом auto:

```cpp
auto len = str.length();
```

Рассмотренная ошибка может показаться безобидной\. Программист может исходить из предположения, что строка просто не может быть длинной при любых адекватных сценариях работы программы\. Но программист не учитывает, что подобные усечения данных могут сознательно использоваться как уязвимости\. Т\.е\. злоумышленник может неким образом подать некорректные входные данные, чтобы получить очень длинные строки\. Некорректная обработка очень длинных строк может открыть ему возможность как\-то влиять на поведение программы\. Другими словами, данная ошибка может представлять собой потенциальную уязвимость и должна быть обязательно исправлена\.

Некоторые пользователи говорят, что анализатор неправ, выдавая предупреждение на следующий код:

```cpp
size = static_cast<unsigned short>(array->size());
```

Они считают, что раз есть 'static\_cast', то всё хорошо и программист знает, что делает\. Однако возможно, что с помощью приведения типа кто\-то боролся с предупреждением компилятора\. Таким образом, 'static\_cast' только маскирует, а не устраняет проблему\.

Если в проекте много кода, где используются подобные приведения типа, и вы доверяете этому коду, то можно просто отключить диагностику 1029\. Другой вариант \- это отключить предупреждения именно там, где используется 'static\_cast'\. Для этого вы можете написать в одном из глобальных заголовочных файлов или файле конфигурации диагностик \(\.pvsconfig\) следующий комментарий:

```cpp
//-V:static_cast:1029
```

**Примечание**\. Диагностика V1029 не ищет случаи, когда размер кладут в 32\-битную переменную\. Поиском подобных ситуаций занимаются диагностики для выявления паттернов 64\-битных ошибок\. См\. в документации набор диагностик "Diagnosis of 64\-bit errors \(Viva64, C\+\+\)"\.