Ошибка соглашения о соединении - C

В следующем коде есть ошибка соглашения о вызовах (возможно, ведущая к вечному циклу), и я не могу ее обнаружить. Я пытаюсь подтвердить код, используя "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 ответа

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] нормально ли это выражение?

Я не знаю "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
Другие вопросы по тегам