Изменяемая статическая переменная изменена в нестатической встроенной функции
Этот дефект возникает, когда вы ссылаетесь на статическую переменную изменяемой области файла или задаете локальную изменяемую статическую переменную в нестатической встроенной функции. Проверка рассматривает переменную как изменяемую, если она не const
-квалифицированный.
Для образца, var
является изменяемым static
переменная, заданная в inline
функциональные func
. g_step
является файл статической переменной видоизменяемой области видимости, упомянутой в той же inlined функции.
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, с. 6.7.4). Если ваш компилятор использует встроенное определение в одном вызове, а не встроенное определение в другом, вы больше не изменяете одну и ту же переменную в обоих вызовах. Это поведение бросает вызов ожиданиям от статической переменной.
Используйте одно из следующих исправлений:
Если вы не намерены изменять переменную, объявите ее как const
.
Если вы не изменяете переменную, о неожиданных изменениях речи не идет.
Сделайте переменную не - static
. Удалите static
квалификатор из объявления.
Если переменная определена в функции, она становится регулярной локальной переменной. Если он задан в области файла, он становится переменной extern. Убедитесь, что это изменение в поведении то, что вы намереваетесь.
Сделайте функцию static
. Добавление static
квалификатор определения функции.
Если вы делаете функцию static
файл с встроенным определением всегда использует встроенное определение при вызове функции. Другие файлы используют другое определение функции. Вопрос о том, какое определение функции будет использоваться, не оставлен на усмотрение компилятора.
Группа: Программирование |
Язык: C | C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: INLINE_CONSTRAINT_NOT_RESPECTED |
Влияние: Средний |