MISRA C:2012 Rule 2.2

Мертвого кода не должно быть

Описание

Определение правила

Мертвого кода не должно быть.

Объяснение

Если операция достижима, но удаление операции не влияет на поведение программы, операция представляет собой мертвый код.

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

Операции с языковыми расширениями, такими как __asm ( "NOP" ); не считаются мертвым кодом.

Реализация Polyspace

Polyspace® Bug Finder™ обнаруживает бесполезные операции записи во время анализа.

Polyspace Code Prover™ не обнаруживает бесполезных операций записи. Например, если вы присвоите значение локальной переменной, но не читаете его позже, Polyspace Code Prover не обнаруживает это бесполезное назначение. Используйте Polyspace Bug Finder, чтобы обнаружить такие бесполезные операции записи.

В Code Prover вы также можете увидеть различие в результатах, основанную на вашем выборе для опции. Смотрите раздел «Проверка на нарушения стандартов кодирования».

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

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

extern volatile unsigned int v;
extern char *p;

void f ( void ) {
    unsigned int x;


    ( void ) v;      /* Compliant - Exception*/
    ( int ) v;       /* Non-compliant  */
    v >> 3;          /* Non-compliant  */

    x = 3;           /* Non-compliant - Detected in Bug Finder only */

    *p++;            /* Non-compliant  */
    ( *p )++;        /* Compliant  */
}

В этом примере правило нарушается, когда операция выполняется для переменной, но результат этой операции не используется. Для образца,

  • Операции (int) и >> на переменной v являются избыточными, поскольку результаты не используются.

  • Область операции = избыточен, потому что локальная переменная x не считывается после операции.

  • Область операции * на p++ является избыточным, поскольку результат не используется.

Правило не нарушается, когда:

  • Переменная приведена к void. Приведение указывает, что вы намеренно не используете значение.

  • Используется результат операции. Например, операция * на p не является избыточным, потому что *p приращение.

void g ( void ) {
               /* Compliant  */
}

void h ( void) {
     g( );     /* Non-compliant */
}

В этом примере g является пустой функцией. Хотя функция сама по себе не нарушает правило, вызов функции нарушает правило.

Проверяйте информацию

Группа: Неиспользованный код
Категория: Требуемая
Категория AGC: Требуется
Введенный в R2014b