Side effect of expression ignored

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