Просмотрите и исправьте недостижимые проверки кода

Выполните один или несколько из следующих шагов до тех пор, пока вы не определите исправление для проверки Unreachable code. Существует несколько способов исправить эту проверку. Для получения описания примеров проверки и кода смотрите Unreachable code.

Если вы определяете, что чек представляет защитный код, добавьте комментарий и обоснование в свой результат или код, объясняющие, почему вы не изменили код. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.

Шаг 1: Интерпретируйте информацию о проверке

  1. Выберите проверку на Results List или Source панели.

  2. Просмотрите сообщение на панели Result Details.

    Сообщение объясняет, почему блок кода недоступен.

  3. Блок кода обычно недоступен, когда не удовлетворено условие, которое определяет вход в блок. Посмотрите, почему условие не удовлетворено.

    1. На панели Source поместите курсор на переменные, вовлеченные в условие, чтобы определить их значения.

    2. Используя эти значения, посмотрите, почему условие не удовлетворено.

    Примечание

    Иногда само условие избыточно. Для примера это всегда верно или связано:

    • Через || оператор другому условию, которое всегда соответствует true.

    • Через && оператор другому условию, которое всегда ложно.

    Для примера в следующем коде условие x%2==0 является избыточным, потому что первое условие x>0 всегда верно.

    assert(x>0);
    if(x>0 || x%2 == 0)
    Если условие избыточно, вместо блока кода само условие помечается серым цветом.

Шаг 2: Определите первопричину проверки

Проследите поток данных для каждой переменной, участвующей в условии.

В следующем примере проследите поток данных для arg.

void foo(void) {
    int x=0;
    .
    .
    bar(x);
    .
    .
}

void bar(int arg) {
    if(arg==0) {
        /*Block 1*/
    }
    else {
        /*Block 2*/
    }
}
Вы можете найти это bar вызывается только из foo. Поскольку единственный аргумент bar имеет значение 0, else ветвь if(arg==0) недоступен.

Возможное исправление: Если вы не собираетесь звонить bar в другом месте и знать, что значения перешли к bar не изменится, можно удалить if-else оператор в bar и сохранять только содержимое Block 1.

Чтобы проследить поток данных, выберите проверку и отметьте информацию на панели Result Details.

  • Если на панели Result Details отображается последовательность команд, ведущих к проверке, выберите каждую инструкцию.

  • Если на панели Result Details отображается номер линии вероятной причины проверки, щелкните правой кнопкой мыши на панели Source. Выберите Go To Line.

  • В противном случае для каждой переменной, участвующей в условии, найдите предыдущие образцы и вернитесь к первопричине проверки. Для получения дополнительной информации об общих первопричинах смотрите Шаг 3: Проверьте общие причины проверки.

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

    ПеременнаяКак найти предыдущие образцы переменной

    Локальная переменная

    Используйте один из следующих методов:

    • Поиск переменной.

      1. Щелкните правой кнопкой мыши переменную. Выберите Search For All References.

        Все образцы переменной отображаются на панели Search с выделенным текущим образцом.

      2. На панели Search выберите предыдущие образцы.

    • Просмотрите исходный код.

      1. Дважды кликните переменную на панели Source.

        Все образцы переменной подсвечиваются.

      2. Прокрутка вверх, чтобы найти предыдущие образцы.

    Глобальная переменная

    Щелкните правой кнопкой мыши переменную. Если появляется Show In Variable Access View опция, переменная является глобальной переменной.

    1. Выберите Show In Variable Access View опции.

      На панели Variable Access отображается текущий образец переменной.

    2. На этой панели выберите предыдущие образцы переменной.

      Операции записи переменной обозначаются и считываются с.

    Функция возврата значение

    ret=func();

    1. Найдите определение функции.

      Щелкните правой кнопкой мыши func на панели Source. Выберите Go To Definition, если опция существует. Если определение недоступно для Polyspace, выбор опции приводит вас к объявлению функции.

    2. В определении func, идентифицируйте каждую return оператор. Переменная, которую возвращает функция, является вашей новой переменной, которую можно отследить назад.

    Можно также определить, связаны ли переменные в любой операции с какой-либо предыдущей операцией. См. Раздел «Поиск отношений между переменными в коде».

Шаг 3: Проверьте общие причины проверки

Проверьте общие причины проверки Unreachable code.

  • Проверьте следующее в своем if тесты:

    • Вы проверяете переменные, которые вы собираетесь протестировать.

      Например, у вас может быть локальная переменная, которая затеняет глобальную переменную. Возможно, вы тестируете локальную переменную, когда хотите протестировать глобальную.

    • Вы используете круглые скобки, чтобы навязать последовательность, в которой вы хотите операции в if тест для выполнения.

      Для примера, if((!a && b) || c) налагает отличную последовательность операций от if(!(a && b) || c). Если вы не используете круглые скобки, операции подчиняются правилам приоритета операторов. Правила могут привести к выполнению операций в последовательности, которую вы не планировали.

    • Вы используете = и == операторы в нужные области кадра.

    Возможное исправление: Исправление ошибок, если таковые имеются.

    • Используйте Polyspace Bug Finder™, чтобы проверить на общие дефекты, такие как Invalid use of = operator и Variable shadowing.

    • Чтобы избежать ошибок из-за неправильной последовательности операций, проверяйте на нарушения MISRA C:2012 Rule 12.1.

  • Проверьте, выполняете ли вы тест, который вы выполнили ранее.

    Избыточный тест обычно происходит от аргумента функции. Один и тот же тест выполняется как в вызов, так и в функции called.

    void foo(void) {
        if(x>0)
            bar(x);
        .
        .
    }
    
    void bar(int arg) {
        if(arg==0) {
        }
    }

    Возможное исправление: Если вы хотите позвонить bar позже, например, в еще неписанном коде или повторно используйте bar в других программах сохраните тест в bar. В противном случае удалите тест.

  • Посмотрите, недоступен ли ваш код, потому что он следует break или return оператор.

    Возможное исправление: Посмотрите, поместили ли вы break или return оператор в непреднамеренном месте.

  • Проверьте, существует ли раздел недоступного кода, поскольку вы следуете стандарту кодирования. Если это так, сохраните раздел.

    Для примера, default блок switch-case оператор присутствует, чтобы захватить ненормальные значения switch переменная. Если такие значения не происходят, блок недоступен. Однако вы можете нарушить стандарт кодирования, если удалите блок.

  • Проверьте, связан ли недостижимый код с оранжевой проверкой ранее в коде. После оранжевой проверки Polyspace обычно завершает пути выполнения, которые содержат ошибку. Из-за этого отключения код, следующий за оранжевым чеком, может оказаться серым.

    Например, Polyspace помещает оранжевую проверку на dereference указателя мыши ptr если вы не проверили ptr для NULL. Однако после дереференции он считает, что ptr не NULL. Если тестовое if(ptr==NULL) следует дереференции ptrPolyspace помечает соответствующий кодовый блок недоступным.

    Для получения дополнительных примеров смотрите:

    Возможное исправление: Исследуйте оранжевую проверку. В приведенном выше примере исследуйте, почему тест if(ptr==NULL) происходит после дереференции, а не до.