シンボリック パラメーターを使用したループの場合、KLEE (シンボリック実行ツール) がどのように機能するかについて質問があります。
int loop(int data) {
int i, result=0;
for (i=0;i<data ;i++){
result+= 1;
//printf("result%d\n", result); //-- With this line klee give different values for data
}
return result;
}
void main() {
int n;
klee_make_symbolic(&n, sizeof(int),"n");
int result=loop(n) ;
}
このコードで klee を実行すると、テスト ケースは 1 つだけになります。ただし、printf(...) のコメントを削除すると、klee は実行を停止するための何らかの制御が必要になります。これは、n の値を生成するためです: --max-depth= 200
クレーがこのように異なる振る舞いをする理由を理解したいのですが、それは私には意味がありません。このコードに printf がない場合、同じ値が生成されないのはなぜですか。
オプション --optimize が使用されていない場合に同じ動作が発生することがわかりました。Klee の --optimize がどのように機能しているか知っている人はいますか?
同じことについての別の疑問は、彼らが公開した論文の場合、私が理解しているように、彼らのヒューリスティック検索では無限にならないと言われていることです (彼らは飢餓を回避します)。このループの場合、クレーの実行を終了する必要がありますか?
前もって感謝します