﻿# V1010\. Unchecked tainted data is used in expression\.

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

На данный момент диагностическое правило V1010 выявляет ошибки по нескольким паттернам:

* Использование недостоверных данных в качестве аргумента функции, который должен содержать проверенные данные\.
* Порча указателя за счёт изменения его значения с использованием недостоверных данных\.


> \*\*Примечание\\\.\*\* Начиная с версии 7\\\.32, пользователь может самостоятельно \[разметить\]\(https://pvs\-studio\.ru/ru/docs/manual/6743/\) необходимые функции как источники и приёмники недостоверных данных\\\. Примеры аннотаций можно увидеть \[здесь\]\(https://pvs\-studio\.ru/ru/docs/manual/6743/\#IDD7BCAB4C30\)\\\.

Рассмотрим все паттерны более подробно\.

Пример подозрительного кода при использовании недостоверных данных в аргументе функции\.

```cpp
char buf[1024];
char username [256];
....
if (scanf("%255s", username) == 1)
{
  if (snprintf(buf, sizeof(buf) - 1, commandFormat, username) > 0)
  {
    int exitCode = system(buf); // <=
    ....
  }
  ....
}
```

Этот код является уязвимым, т\.к\. пользовательский ввод передаётся командному интерпретатору без проверки полученных данных\. Например, введя "&cmd", на Windows можно получить доступ к командному интерпретатору\.

Правильный код должен осуществлять дополнительную проверку считанных данных:

```cpp
if (IsValid(username))
{
  if (snprintf(buf, sizeof(buf) - 1, commandFormat, username) > 0)
  {
    int exitCode = system(buf);
    ....
  }
  ....
} 
else 
{
  printf("Invalid username: %s", username);
  ....
}
```

Пример подозрительного кода, связанного с порчей указателя\.

```cpp
size_t offset = 0;
int *pArr = arr;
....
if (scanf("%zu", &offset) == 1)
{
  pArr += offset; // <=
  ....
  DoSomething(pArr);
}
```

В данном случае портится значение указателя 'pArr', т\.к\. в результате прибавления непроверенного значения 'offset' указатель может начать ссылаться за пределы массива\. В результате можно испортить какие\-то данные \(на которые будет ссылаться 'pArr'\) с непредсказуемыми последствиями\. 

Правильный код проверяет допустимое смещение:

```cpp
if (offset <= allowableOffset)
{
  pArr += offset;
  ....
  DoSomething(pArr);
}
```