在下面的代码中有一个调用约定错误(可能导致永久循环),我无法检测到它。我尝试使用' Satabs'来验证代码。什么样的模型可以将错误带到表面。通过以下模型,我得到了一个段错误。 通过更改VLEN和TMAX,您可以稍微玩一下。
#include <stdio.h>
#if MODEL==1
#define VLEN 3
#define TMAX 4
int trans(int T,int*src,int*dst){
if (T < VLEN && T < TMAX && src[T] < 4){
dst[T]=src[T]+1;
return 1;
} else {
return 0;
}
}
#endif
struct next_state {
int next;
int src[VLEN];
};
typedef struct next_state *iterator_t;
void init(iterator_t iter,int *src){
for(int i=0;i<VLEN;i++){
iter->src[i]=src[i];
}
iter->next=0;
}
int next(iterator_t iter,int *dst){
#ifdef FIX_ARRAY
for(int i=0;i<VLEN;i++){
#else
for(int i=0;i<TMAX;i++){
#endif
dst[i]=iter->src[i];
}
int res=0;
while(!res&&iter->next<TMAX){
res=trans(iter->next,iter->src,dst);
iter->next++;
}
return res;
}
int find_depth(iterator_t iter,int *src){
int table[VLEN*TMAX];
int N=0;
init(iter,src);
for(int i=0;i<TMAX;i++){
if(next(iter,&(table[N*VLEN]))){
N++;
}
}
int depth=0;
for(int i=0; i<N;i++){
printf("Eimai stin for \n");
int tmp=find_depth(iter,&(table[i*VLEN]));
printf("tmp= %d\n",tmp);
if(tmp>=depth){
depth=tmp+1;
//assert(depth);
}
}
printf("\n\n");
return depth;
}
int main(int argc,char*argv[]){
int state[VLEN];
struct next_state ns;
for(int i=0;i<VLEN;i++){
state[i]=0;
}
int depth=find_depth(&ns,state);
printf("depth is %d\n",depth);
}
答案 0 :(得分:0)
int depth=find_depth(&ns,state);
你正在传递&amp; ns,但是把它作为 iterator_t iter 的arg,这是正确的吗?
void init(iterator_t iter,int *src){
for(int i=0;i<VLEN;i++){
iter->src[i]=src[i];
iter-&gt; src [i]这个表达式好吗?
答案 1 :(得分:0)
我不知道&#39; Satabs&#39;但对于我来说,最有希望成为无限循环的候选人似乎是
while(!res&&iter->next<TMAX){
res=trans(iter->next,iter->src,dst);
iter->next++;
}
所有其他循环看起来像修复计数。 即使没有所谓的调用约定错误,这个循环也可能对自己造成危险,但这个问题还是跳到了我的眼前。
无论如何,你不仅应该看一下功能 trans 的调用,而是整个调用树。
您也可以尝试将代码粘贴到那里
也许你会得到更多提示。
只是一个猜测:
也许&#39; Satabs&#39;不喜欢未定义的预处理器条件 像
#if MODEL==1