Мы используем тест Parasoft C ++ для статического анализа нашего кода. У него проблемы с кодом вроде следующего:
void foo(int* x) {
try {
bar();
} catch(...) {
delete x;
throw;
}
*x;
}
Он предупреждает в строке * x;
, что:
Освободившаяся память не должна быть впоследствии доступна ни при каких обстоятельствах
Каким-то образом он пришел к выводу, что control поток может перейти в блок catch (...)
, удалить x
, пройдите мимо выброса ;
и доберитесь до * x;
. Я попробовал throw std :: exception ("");
и пару других и получил то же самое. Parasoft определенно знает об исключениях и включает их в свой поток управления, потому что существует множество других тестов, которые включают проверку исключений. В данном случае это просто сбивает с толку, или есть какой-то способ для выполнения этой программы, чтобы поразить как delete x;
, так и * x;
?