Правило 2.2 MISRA C:2012

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

Описание

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

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

Объяснение

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

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

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

Реализация Polyspace

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

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

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

Обменивайтесь сообщениями в отчете

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

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

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

Примеры

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

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: необходимый
Язык: C90, C99

Введенный в R2014b