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

The analyzer has detected a function annotated as pure, but it is not\.

You can annotate functions in the following ways:

* Using C\+\+ [attributes](https://en.cppreference.com/w/cpp/language/attributes)\. For example, using the '[gnu::pure](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute)' attribute\.
* Using the [user annotation mechanism in JSON format](https://pvs-studio.com/en/docs/manual/6743/)\.

A function is pure if it meets the following requirements:

* **It has no side effects**\. A function should not alter the state of the program outside its own context\. This means it should not modify objects with [static storage duration](https://pvs-studio.com/en/blog/terms/6564/#static) \(local and global\) or modify non\-constant objects via pointers/references passed to the function\.
* **The function behavior is deterministic**\. A function must always return the same result for the same set of inputs\.

Here are the most common cases in which a function purity is violated:

* using variables with static storage duration in any form;
* calling a function that has side effects;
* using constructs that cause side effects \(for example, 'new', 'delete'\);
* using parameters as lvalue references or pointers to non\-constants;
* writing to/reading from streams \(e\.g\. 'std::cout', 'std:: fstream', etc\.\)\.

Take a look at the following example of an impure function annotated as pure:

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

The 'foo' function is annotated in the code using the 'gnu::pure' attribute but allocates dynamic memory and violates the "no side effects" requirement\.

To fix this, either remove the 'pure' attribute or modify the function as follows:

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