Redundant expression in sizeof operand

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

Описание

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

Риск

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

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

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

Фиксация

Первое событие в дефекте traceback показывает где избыточное подвыражение 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