Рассмотрите и зафиксируйте недостижимые проверки кода

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

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

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

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

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

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

  3. Блок кода обычно недостижим, когда условию, которое определяет запись в блок, не удовлетворяют. Смотрите, почему условию не удовлетворяют.

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

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

    Примечание

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

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

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

    Например, в следующем коде, условие 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.

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

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

    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 помещает оранжевую проверку в разыменовывание указателя ptr если вы не исследовали ptr для NULL. Однако после разыменовывания, это рассматривает тот ptr не NULL. Если тест if(ptr==NULL) следует за разыменовыванием ptr, Polyspace отмечает соответствующий недостижимый блок кода.

    Для большего количества примеров см.:

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