Ошибка соглашения о соединении - 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, но и на все дерево вызовов.
Вы также можете попытаться вставить свой код туда
Может быть, вы получите еще несколько подсказок.
Просто предположение:
Может быть, 'Satabs' не нравятся неопределенные условия препроцессора, такие как
#if MODEL==1