exponenta event banner

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

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

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

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

  1. Выберите проверку на панели Список результатов (Results List) или Источник (Source).

  2. Просмотрите сообщение на панели Сведения о результатах.

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

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

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

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

    Примечание

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

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

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

    Например, в следующем коде условие 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). Выберите «Перейти к строке».

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

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

    ПеременнаяПоиск предыдущих экземпляров переменной

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

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

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

      1. Щелкните правой кнопкой мыши переменную. Выберите Поиск всех привязок (Search For All References).

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

      2. На панели Поиск (Search) выберите предыдущие экземпляры.

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

      1. Дважды щелкните переменную на панели «Источник».

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

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

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

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

    1. Выберите опцию Показать в представлении переменного доступа (Show In Variable Access View).

      На панели «Доступ к переменной» отображается текущий экземпляр переменной.

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

      Операции записи для переменной обозначаются с помощью, а операции чтения - с помощью.

    Возвращаемое значение функции

    ret=func();

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

      Щелкните правой кнопкой мыши func на панели «Источник». Выберите «Перейти к определению», если опция существует. Если определение недоступно для Polyspace, выбор опции приводит к объявлению функции.

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

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

Шаг 3: Поиск общих причин проверки

Найдите общие причины проверки недостижимого кода.

  • Найдите следующее в своем if тесты:

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

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

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

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

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

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

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

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

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

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

    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 обычно завершает пути выполнения, содержащие ошибку. Из-за этого окончания код после оранжевой проверки может выглядеть серым.

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

    Дополнительные примеры см. в разделе:

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