我想在源代码级别自动展开用 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:}
从上面转换的源代码中,我将测量执行来自“循环展开”的每个语句的测试用例的数量。例如,执行第3,4行或第7,8行或第11,12行的测试用例从原始源代码中的第4行和第5行转换而来的测试用例的数量与测试用例执行行的数量不同#4,5 在原始源代码中。
仅供参考,如果有一种方法可以在不展开循环的情况下实现我的最终目标,那么方法也很好!谢谢!