Redundant expression in sizeof operand

sizeof операнд содержит выражение, которое не оценивается

Описание

Этот дефект возникает, когда sizeof operand содержит выражения, оценка которых не влияет на sizeof результат. Вместо текущего выражения в sizeof операнд, тип данных, переменная или более простое выражение могли использоваться без какой-либо потери функциональности.

Риск

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

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

sizeof(void (*[n])(int arr[U+V]))
Операнд sizeof является массивом n указатели на функции, каждый из типов void () (int*). Дополнительные U+V, который не оценивается, делает полное выражение ненужно сложным. Выражение также создает ложное впечатление, что аргумент указателя на функцию является массивом размера U+V вопросы для sizeof результат.

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

Первое событие в трассировке дефекта показывает, где избыточное подэкспрессию sizeof начинается операнд.

Упростите или полностью удалите избыточное выражение. Когда возможно, используйте тип данных как sizeof операнд. Например, в предыдущем примере более простой эквивалент sizeof операция является:

sizeof(void (*[n])(int*))

Если требуется вычислить выражение, выполните вычисление в отдельном операторе.

Примеры

расширить все

void func() {
    int size1, size2, size3;
    char x = 0;
    short y = 0;
    int z = 0, w = 0;
    
    size1 = sizeof(x + y);
    size2 = sizeof(x + z);
    size3 = sizeof(z + w);
}

В этом примере проверяющий дефект помечает второй и третий sizeof операция, поскольку выражения в sizeof операнд можно упростить, не меняя sizeof результат.

Проверка не помечает первую операцию, потому что выражение в sizeof операнд нельзя упростить дальше, не затрагивая sizeof результат.

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

Упростите выражение в sizeof операнд. В следующих коррекциях, sizeof результаты те же, что и в предыдущих выражениях.

void func() {
    int size1, size2, size3;
    char x = 0;
    short y = 0;
    int z = 0, w = 0;
    
    size1 = sizeof(x + y);
    size2 = sizeof(z);
    size3 = sizeof(z);
}

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

Группа: Хорошая практика
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : SIZEOF_USELESS_OP
Влияние: Низкое
Введенный в R2020a