0

在下面的代码中有一个调用约定错误(可能导致一个永恒的循环),我无法检测到它。我尝试使用“Satabs”验证代码。什么样的模型可以使错误浮出水面。使用以下模型,我得到一个段错误。通过改变 VLEN 和 TMAX 你可以玩一点。

  • Q1。什么是调用约定错误?
  • Q2。哪种模型最适合用于查找错误?

#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);  
}
4

2 回答 2

0
int depth=find_depth(&ns,state);

您正在传递 &ns,但将函数中的 arg 作为iterator_t iter,这是正确的吗?

void init(iterator_t iter,int *src){
  for(int i=0;i<VLEN;i++){
    iter->src[i]=src[i];

iter->src[i] 这个表达式好吗?

于 2015-10-04T15:04:18.593 回答
0

我不知道'Satabs',但对我来说最有希望的无限循环候选人似乎是

while(!res&&iter->next<TMAX){
  res=trans(iter->next,iter->src,dst);
  iter->next++;
}

所有其他循环看起来都像修复计数。即使没有所谓的调用约定错误,这个循环本身也可能是危险的,这还没有引起我的注意。

无论如何,您不仅应该查看函数trans的调用,还应该查看它的整个调用树。

您也可以尝试将代码粘贴到那里

http://gimpel-online.com//cgi-bin/genPage.py?srcFile=intro.txt&cgiScript=analysisCode.py&title=Introduction+and+Welcome&intro=Introducing+the+testing+facility&compilerOption=online32.lnt&in

也许你会得到更多的提示。

只是一个猜测:

也许'Satabs'不喜欢未定义的预处理器条件

#if MODEL==1
于 2016-04-12T07:42:08.353 回答