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. Поскольку выражение не оценивается, изменение не происходит. The 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки : SIDE_EFFECT_IGNORED
Влияние: Низкое
Введенный в R2018a