调用约定错误 - C.

时间:2015-10-04 12:26:50

标签: c calling-convention model-checking

在下面的代码中有一个调用约定错误(可能导致永久循环),我无法检测到它。我尝试使用' 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);  
}

2 个答案:

答案 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 的调用,而是整个调用树。

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

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

也许你会得到更多提示。

只是一个猜测:

也许&#39; Satabs&#39;不喜欢未定义的预处理器条件 像

#if MODEL==1