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