exponenta event banner

Избыточное выражение в размерном операнде

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

Описание

Этот дефект возникает при sizeof операнд содержит выражения, оценка которых не влияет на 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++
По умолчанию: Откл.
Синтаксис командной строки: SIZEOF_USELESS_OP
Воздействие: Низкий
Представлен в R2020a