Выполните один или несколько из этих шагов, пока вы не определите фиксацию для проверки Unreachable code. Существует несколько способов зафиксировать эту проверку. Для описания проверки и примеров кода, смотрите Unreachable code
.
Если вы решаете, что проверка представляет защитный код, добавьте комментарий и выравнивание в вашем результате или коде, объясняющем, почему вы не изменили свой код. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Комментарии.
Выберите проверку на панели Source или Results List.
Просмотрите сообщение на панели Result Details.
Сообщение объясняет, почему блок кода недостижим.
Блок кода обычно недостижим, когда условие, которое определяет запись в блок, не удовлетворено. Смотрите, почему условие не удовлетворено.
На панели Source установите свой курсор на переменные, вовлеченные в условие определить их значения.
Используя эти значения, смотрите, почему условие не удовлетворено.
Иногда, само условие избыточно. Например, это является всегда верным или двойным:
Через оператор ||
к другому условию, которое всегда верно.
Через оператор &&
к другому условию, которое является всегда ложным.
Например, в следующем коде, условие x%2==0
избыточен, потому что первое условие x>0
всегда верно.
assert(x>0); if(x>0 || x%2 == 0)
Проследите поток данных для каждой переменной, вовлеченной в условие.
В следующем примере проследите поток данных для 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® только.
Переменная | Как найти предыдущие экземпляры переменной |
---|---|
Локальная переменная | Используйте один из следующих методов:
|
Глобальная переменная Щелкните правой кнопкой по переменной. Если опция, Show In Variable Access View появляется, переменная, является глобальной переменной. |
|
Функциональное возвращаемое значение
ret=func(); |
|
Можно также определить, связаны ли переменные в какой-либо операции от некоторой предыдущей операции. Смотрите Находят Отношения Между Переменными в Коде.
Ищите частые причины проверки 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, отмечает соответствующий недостижимый блок кода.
Для большего количества примеров см.:
Серая проверка после оранжевой проверки
Исключением к этому поведению является переполнение. Если вы задаете соответствующий Overflow mode for signed integer или Overflow mode for unsigned integer, Polyspace переносит результат переполнения и не отключает пути к выполнению. Смотрите Overflow mode for signed integer (-signed-integer-overflows)
или Overflow mode for unsigned integer (-unsigned-integer-overflows)
.
Возможная фиксация: Исследуйте оранжевую проверку. В вышеупомянутом примере займитесь расследованиями, почему тест if(ptr==NULL)
происходит после разыменовывания и не прежде.