MISRA C:2012 Rule 2.2

Не должно быть никакого мертвого кода

Описание

Управляйте определением

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

Объяснение

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

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

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

Реализация Polyspace

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

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

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

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

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