2015-10-04 104 views
0

在下面的代碼中有一個調用約定錯誤(可能導致一個永恆循環),並且我無法檢測到它。我嘗試使用'Satabs'驗證代碼。什麼樣的模型可以將誤差帶到表面。通過以下模型,我可以得到一個段錯誤。 通過更改VLEN和TMAX,您可以播放一下。調用約定錯誤 - C

  • Q1。什麼是調用約定錯誤?第二季度銷售價格爲
  • 。哪種模型最適合用來查找錯誤?

#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
int depth=find_depth(&ns,state); 

你傳入&納秒,但在功能上服用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]這個表達是否正確?

+0

是的,我相信這是正確的! 該程序編譯並正常運行。但有一個輸入(模型)觸發(調用約定)錯誤。這就是爲什麼我使用Satabs驗證工具。 –

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=analyseCode.py&title=Introduction+and+Welcome&intro=Introducing+the+testing+facility&compilerOption=online32.lnt&in

也許你會得到一些更多的提示。

只是一個猜測:

也許 'Satabs' 不喜歡不確定的預處理條件 像

#if MODEL==1