Изменяемая статическая переменная изменяется в нестатической встроенной функции
Этот дефект возникает при ссылке на изменяемую статическую переменную области действия файла или определении локальной изменяемой статической переменной в нестатической встроенной функции. Средство проверки считает переменную изменяемой, если она не является const-квалифицирован.
Например, var является изменяемым static переменная, определенная в inline функция func. g_step является изменяемой статической переменной области действия файла, на которую ссылается одна и та же встроенная функция.
static int g_step;
inline void func (void) {
static int var = 0;
var += g_step;
}При изменении статической переменной в нескольких вызовах функций ожидается изменение одной и той же переменной в каждом вызове. Например, каждый раз, когда вы звоните func, тот же экземпляр var1 увеличивается, но отдельный экземпляр var2 увеличивается.
void func(void) {
static var1 = 0;
var2 = 0;
var1++;
var2++;
}Если функция имеет определение inlined и non-inlined (в отдельных файлах), при вызове функции стандарт C позволяет компиляторам использовать либо inlined, либо non-inlined форму (см. ISO ®/IEC 9899:2011, sec. 6.7.4). Если компилятор использует встроенное определение в одном вызове, а неинлинированное определение в другом, изменение одной и той же переменной в обоих вызовах больше не выполняется. Это поведение не соответствует ожиданиям от статической переменной.
Используйте одно из следующих исправлений:
Если изменение переменной не планируется, объявите ее как const.
Если переменная не изменяется, то о неожиданном изменении речи не идет.
Сделать переменную не -static. Удалить static квалификатор из объявления.
Если переменная определена в функции, она становится обычной локальной переменной. Если она определена в области файла, она становится внешней переменной. Убедитесь, что это изменение в поведении именно то, что вы намереваетесь.
Выполнение функции static. Добавить static квалификатор к определению функции.
При выполнении функции static, файл с встроенным определением всегда использует встроенное определение при вызове функции. Другие файлы используют другое определение функции. Вопрос о том, какое определение функции используется, не оставлен на усмотрение компилятора.
| Группа: Программирование |
| Язык: C | C++ |
| По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода |
Синтаксис командной строки:
INLINE_CONSTRAINT_NOT_RESPECTED |
| Воздействие: среднее |