Изменяемая статическая переменная изменена в нестатической встроенной функции
Этот дефект возникает, когда вы ссылаетесь на статическую переменную изменяемой области файла или задаете локальную изменяемую статическую переменную в нестатической встроенной функции. Проверка рассматривает переменную как изменяемую, если она не 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 |
| Влияние: Средний |