これらの2 つのブログ投稿 (1、2 )を読んだかどうかはわかりませんが、探している「単純な」ツールの 1 つは、Frama-C の値分析を通常のサウンドとして並行して起動するスクリプトである可能性があります。抽象インタープリター (プログラムの最後に到達できないことを推測できる) とそのオプション(この場合、プログラムのすべての実行が終了すると推測できる)。どちらの場合も、タイムアウトを使用したい場合があります。オプション を使用した分析の場合、タイムアウトは必須です。これは、分析対象のプログラム自体が終了しないと分析が終了しないためです。-obviously-terminates
-obviously-terminates
私が書いたこれらのブログ投稿によると、次の例を診断できるはずですが、そのすべてが完全に些細なわけではありません。
char x, y;
main()
{
x = input();
y = input();
while (x>0 && y>0)
{
if (input() == 1)
{
x = x - 1;
y = input();
}
else
y = y - 1;
}
}
終了します
char x, y;
main()
{
x = input();
y = input();
while (x>0 && y>0)
{
// Frama_C_dump_each();
if (input())
{
x = x - 1;
y = x;
}
else
{
x = y - 2;
y = x + 1;
}
}
}
終了します
char x;
main(){
x = input();
while (x > 0)
{
Frama_C_dump_each();
if (x > 11)
x = x - 12;
else
x = x + 1;
}
}
終了します
unsigned char u;
int main(){
while (u * u != 17)
{
u = u + 1;
}
return u;
}
終了しません。
ただし、これらの例に含まれるオプション-obviously-terminates
は、もともとこの用途向けに設計されたものではありません (特定の種類のプログラムの分析のための最適化のようなものでした)。このオプションを設定すると、まれに、解析対象のプログラム自体が終了せずに解析が終了することがあることに気づきませんでした。ソースから再コンパイルする場合、この問題は file で variableobviously_terminates
をtrue
(の代わりにfalse
) に設定することで修正されますstate_set.ml
。このスクリプトが探している解決策ではないと考える理由がある場合でも、心配する必要はありません。前述したように、この問題はまれにしか発生しないようです。プログラムがより競争力のある設定で終了したかどうかを判断しようとしているときに、私はそれに気づきました.