# 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. For example, using the 'gnu::pure' attribute.
- Using the user annotation mechanism in JSON format.

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 (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:

    [[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:

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