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;
....
}