# V1115. Function annotated with the 'pure' attribute has side effects.

Анализатор обнаружил функцию, проаннотированную как чистая, которая таковой не является.

Функции могут быть проаннотированы следующими способами:

- Через С++ атрибуты. Например, через атрибут 'gnu::pure'.
- Через механизм пользовательских аннотаций в формате JSON.

Функция является чистой, если соответствует следующим требованиям:

- В ней отсутствуют побочные эффекты. Функция не должна изменять состояние программы вне своего собственного контекста. Это означает, что она не должна изменять объекты со static storage duration (локальные и глобальные) или изменять неконстантные объекты через переданные в функцию указатели/ссылки.
- Её поведение детерминировано. Для одного и того же набора входных данных функция всегда должна возвращать один и тот же результат.

Наиболее частые случаи нарушения чистоты функций:

- Использование в любом виде переменных со static storage duration;
- Вызов функции с побочными эффектами;
- Использование конструкций, которые приводят к побочным эффектам (например: 'new', 'delete');
- Использование параметров в виде lvalue-ссылок или указателей на не константы;
- Запись/чтение из потоков (например, 'std::cout', 'std:: fstream' и т.п.).

Рассмотрим пример нечистой функции, но проаннотированной как чистая:

    [[gnu::pure]] void foo()
    {
      int *x = new int;
      ....
    }

Функция 'foo' проаннотирована в коде атрибутом 'gnu::pure'. При этом функция выделяет динамическую память в программе и нарушает требование об отсутствии побочных эффектов.

Для исправления необходимо либо убрать атрибут 'pure', либо исправить функцию следующим образом:

    [[gnu::pure]] void foo()
    {
      int x;
      ....
    }