exponenta event banner

Побочный эффект выражения проигнорирован

sizeof, _Alignof, или _Generic оперирует выражением с побочным эффектом

Описание

Этот дефект возникает, когда sizeof, _Alignof, или _Generic оперирует выражением с побочным эффектом. При оценке выражение с побочным эффектом модифицирует по крайней мере одну из переменных в выражении.

Например, средство проверки дефектов не помечает sizeof(n+1) потому что n+1 не изменяет n. Флаги средства проверки sizeof(n++) потому что n++ предназначен для изменения n.

Проверка также относится к оператору C++ alignof и его расширения C, __alignof__ и __typeof__.

Риск

Выражение в _Alignof или _Generic оператор не оценивается. Выражение в sizeof оператор вычисляется только в том случае, если он необходим для вычисления размера массива переменной длины, например, sizeof(a[n++]).

Если выражение с побочным эффектом не вычисляется, изменение переменной из побочного эффекта не происходит. Если вы полагаетесь на изменение, вы можете увидеть неожиданные результаты.

Зафиксировать

Вычислите выражение с побочным эффектом в отдельном операторе, а затем используйте результат в sizeof, _Alignof, или _Generic оператор.

Например, вместо:

a = sizeof(n++);
выполнить операцию в два этапа:
n++;
a = sizeof(n);

Средство проверки рассматривает вызов функции как выражение с побочным эффектом. Даже если функция не имеет побочных эффектов сейчас, это может иметь побочные эффекты на более поздних дополнениях. Код более удобен для обслуживания при вызове функции за пределами sizeof оператор.

Примеры

развернуть все

#include <stdio.h>

void func(void) {
    unsigned int a = 1U;
    unsigned int b = (unsigned int)sizeof(++a);
    printf ("%u, %u\n", a, b);
}

В этом примере: sizeof работает на ++a, которая предназначена для изменения a. Поскольку выражение не вычисляется, изменение не происходит. printf оператор показывает, что a по-прежнему имеет значение 1.

Коррекция - выполнение приращения снаружи sizeof

Одной из возможных корректировок является сначала выполнение приращения, а затем предоставление результата sizeof оператор.

#include <stdio.h>

void func(void) {
    unsigned int a = 1U;
    ++a;
    unsigned int b = (unsigned int)sizeof (a); 
    printf ("%u, %u\n", a, b);
}

Информация о результатах

Группа: Программирование
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: SIDE_EFFECT_IGNORED
Воздействие: Низкий
Представлен в R2018a