C言語で書かれたターゲットプログラムのループをソースコードレベルで自動巻き戻ししたい(参考までにlinuxとgccコンパイラを使っています)。詳細な説明については、次の簡単なソース コードを見てみましょう。
1: int main(){
2: int i = 0;
3: while(i<3){
4: printf("hi\n");
5: i++;
6: }
7: }
上記のソースコードを次のように変換したいと思います。
1: int main(){
2: int i = 0;
3: if (i<3){
4: printf("hi\n");
5: i++;
6: }
7: if (i<3){
8: printf("hi\n");
9: i++;
10: }
11: if (i<3){
12: printf("hi\n");
13: i++;
14: }
15:}
CBMCがソフトウェア モデル チェックのためにループを自動的に巻き戻すことは知っていますが、ループを巻き戻すために CBMC がソース コードをソース コードに変換するかどうかはわかりません。すべてのループが巻き戻されたプログラム ソース コードを取得する必要があります。
そのためのツールや解決策を見つけようとしましたが、見つかりませんでした。提案やコメントをいただければ幸いです。ありがとう!
混乱させてすみません。私の最終目標である「ソースコードレベルでのループの巻き戻し」の詳細を説明します。ループの巻き戻しの最終的な目標は、ループの巻き戻しから生成されたステートメントを実行するテスト ケースの数を測定することです。次の例を参照してください。
1: void ex(int i){
2: int i = 0;
3: while(i<3){
4: printf("hi\n");
5: i++;
6: }
7: }
上記のソースコードを変換すると、次のソースコードが得られます
1: void ex(int i){
2: if (i<3){
3: printf("hi\n");
4: i++;
5: }
6: if (i<3){
7: printf("hi\n");
8: i++;
9: }
10: if (i<3){
11: printf("hi\n");
12: i++;
13: }
14:}
そして、上記の変換されたソース コードから、「ループの巻き戻し」から生じる各ステートメントを実行するテスト ケースの数を測定します。たとえば、元のソース コードの 4 行目と 5 行目から変換された 3、4 行目、7、8 行目、または 11、12 行目を実行するテスト ケースの数は、1 行を実行するテスト ケースの数とは異なります。元のソース コードの #4,5。
参考までに、ループを巻き戻さずに最終目標を達成できる方法があれば、その方法も良いです! ありがとう!