Комментарии 11
Хороший способ отпраздновать! Надеюсь после-праздничный email с найдеными ошибками будет отправлен на разработчикам?
Не очень понятна первая ошибка. У вас выделена строчка:
if (speakup_console[vc->vc_num]) // <=
Которая не является макросом spd_killed
.
Также, ожидалось, что будет ругаться на разыменование указателя vc
Макрос там в коде раньше встречается.
Я вижу, но стрелка не на него
В этом, как бы, и задумка, чтобы было не понятно до прочтения описания.
А что с vc? Почему он без внимания?
А что с ним не так?) Если вы про то, почему на него не ругнулись - он во всех случаях разыменуется без проверки. Выдавать на каждое такое использование указателя в функции глупо, т.к. будет много ложных срабатываний. Да, есть __attribute__((nonnull))
, но присутствует он не во всех компиляторах и не всегда используется (как, например, в этом случае).
Интересно. Банальную ошибку с бесконечной рекурсией PVS пропускает
// Type your code here, or load an example.
unsigned squarerec(unsigned num)
{
if (num <= 1) return 1;
return squarerec(num) * num;
}
как с флагами --incremental --analysis-mode=4 так и без них
Банальную ошибку
Ну это как посмотреть. Проблема остановки:
Проблема остановки (англ. Halting problem) — это одна из проблем в теории алгоритмов[1], которая может неформально быть поставлена в виде:
Даны описание процедуры и её начальные входные данные. Требуется определить: завершится ли когда-либо выполнение процедуры с этими данными; либо, что процедура всё время будет работать без остановки.
Алан Тьюринг доказал в 1936 году, что проблема остановки неразрешима на машине Тьюринга. Другими словами, не существует общего алгоритма решения этой проблемы.[2]
Т.е. на while(true);
(именно в это компилирует gcc -O2) можно даже варнинг не выкидывать, только потому, что так сказал Тьюринг.
Понимаю, если бы была хитрая вложенная рекурсия - но тут "хвостовая" элементарщина, а (num)
вместо (num-1)
: просто отвлекли - начальник попросил расписаться в ведомости расчёток.
UPD: Граф потока управления может быть использован для быстрой категоризации, когда программа не имеет циклов (и поэтому останавливается), имеет тривиальные циклы (и поэтому останавливается), имеет нетривиальные циклы (неразрешимо) или входит в бесконечный цикл. По вашей же ссылки - данное зацикливание отлавливается потому что хвостовая рекурсия легко разворачивается в цикл (gcc же сумел раскрутить рекурсию в jmp 0x-2
)
30 лет ядру Linux: поздравление от PVS-Studio