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

Выполните один или несколько из этих шагов, пока вы не определите фиксацию для проверки 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) происходит после разыменовывания и не прежде.