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

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

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

* Через С\+\+ [атрибуты](https://en.cppreference.com/w/cpp/language/attributes)\. Например, через атрибут '[gnu::pure](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute)'\.
* Через [механизм пользовательских аннотаций в формате JSON](https://pvs-studio.ru/ru/docs/manual/6743/)\.

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

* **В ней отсутствуют побочные эффекты**\. Функция не должна изменять состояние программы вне своего собственного контекста\. Это означает, что она не должна изменять объекты со [static storage duration](https://pvs-studio.ru/ru/blog/terms/6564/#static) \(локальные и глобальные\) или изменять неконстантные объекты через переданные в функцию указатели/ссылки\.
* **Её поведение детерминировано**\. Для одного и того же набора входных данных функция всегда должна возвращать один и тот же результат\.

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

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

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

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

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

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

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