﻿# V618\. Dangerous call of 'Foo' function\. The passed line may contain format specification\. Example of safe code: printf\("%s", str\);

Анализатор обнаружил, что вызов функции форматного вывода может привести к некорректному результату\. Более того, подобный код может стать объектом для атаки \(подробнее см\. эту статью\)\. 

Вывод строки осуществляется напрямую без использования спецификатора "%s"\. В результате, если в строке случайно или преднамеренно встретиться управляющий символ это приведёт к сбою в работе программы\. Рассмотрим простейший пример:

```cpp
char *p;
...
printf(p);
```

Вызов функции printf\(p\) некорректен, поскольку отсутствует форматная строка вида "%s"\. Если в строке 'p' встретится спецификатор формата, то такой вывод скорее всего окажется некорректным\. Безопасный вариант кода:

```cpp
char *p;
...
printf ("%s", p);
```

Предупреждение V618 может показаться несущественным\. Но на самом деле это очень важный момент в создании качественных и надёжных программ\.

Учтите, что совершенно неожиданно в строке вдруг могут встретиться спецификаторы формата \(%i, %p и так далее\)\. Это может произойти случайно, когда пользователь введёт некорректные входные данные\. Это может произойти умышленно, когда некорректные данные будут поданы специально\. Отсутствие спецификатора "%s" может привести к падению программы или в выводе куда\-то приватных данных\. Прежде чем отключить диагностику V618 ещё раз настаиваем на том, чтобы обязательно прочитать статью "[Не зная брода, не лезь в воду\. Часть вторая](https://pvs-studio.ru/ru/blog/posts/cpp/0129/)"\. Исправления в коде будут не так велики, чтобы проигнорировать данный вид дефекта\.

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

```cpp
printf("Hello!");
```