Модифицируемая статическая переменная изменяется в нестатической подставляемой функции
Этот дефект происходит, когда вы обращаетесь к файлу, определяют объем модифицируемой статической переменной или задают локальную модифицируемую статическую переменную в нестатической встроенной функции. Средство проверки рассматривает переменную как модифицируемую, если это не 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++;
}Если функция имеет встроенное и невстроенное определение (в отдельных файлах), когда вы вызываете функцию, стандарт C позволяет компиляторам использовать или встроенный или невстроенную форму (см. ISO®/IEC 9899:2011, секунда. 6.7.4). Если ваш компилятор использует встроенное определение в одном вызове и невстроенное определение в другом, вы больше не изменяете ту же переменную в обоих вызовах. Это поведение игнорирует ожидания от статической переменной.
Используйте одни из этих мер:
Если вы не намереваетесь изменить переменную, объявите его как const.
Если вы не изменяете переменную, нет никакого вопроса неожиданной модификации.
Сделайте переменную non-static. Удалите static спецификатор от объявления.
Если переменная задана в функции, это становится регулярной локальной переменной. Если задано в осциллографе файла, это становится переменной экстерна. Убедитесь, что это изменение в поведении - то, что вы предназначаете.
Сделайте функциональный static. Добавьте static спецификатор к функциональному определению.
Если вы делаете функциональный static, файл со встроенным определением всегда использует встроенное определение, когда функция вызвана. Другие файлы используют другое определение функции. Вопрос которого функционируют, определение привыкает, не оставлен компилятору.
| Группа: Программирование |
| Язык: C | C++ |
| Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода |
Синтаксис командной строки:
INLINE_CONSTRAINT_NOT_RESPECTED |
| Удар: Средняя |