pdksh nadal "się psuje"...

Jakub Bogusz qboosh w prioris.mini.pw.edu.pl
Nie, 13 Maj 2001, 23:26:11 CEST


On Sat, May 12, 2001 at 08:36:57PM +0200, Arkadiusz Miskiewicz wrote:
> On/Dnia Sat, May 12, 2001 at 08:02:47PM +0200, Jakub Bogusz wrote/napisał(a)
> > Przy budowaniu php nadal jest core dumped.
> Przy balsie też.

Lista jest długa. pdksh upodobał sobie skrypt nowego libtoola :/

> > Na razie udało mi się zauważyć tyle:
> > - zwiększanie cells w alloc/aresize (to co robią kolejne mutacje patcha
> >   alloc) powoduje co najwyżej zrzucanie core w innym miejscu...
> Historia tej łatki zaczeła się dawno temu ale tak naprawde to ona popsuła
> alokację tzn wyliczanie ilości cel bo w oryginale jest poprawne, a my tu
> tylko kombinujemy nieco heh ;)

To zauważyłem. Dodanie 1 mogło zapobiec jakimś 1-bajtowym overflowom -
ale to nie ten przypadek.

> > Area *ainit(register Area *ap) { return ap; }
> > void afreeall(register Area *ap) { return; }
> > void *alloc(size_t size,register Area *ap) { return malloc(size); }
> > void *aresize(register void *ptr, size_t size, Area *ap) { return realloc(ptr,size); }
> > void afree(void *ptr, register Area *ap) { free(ptr); }
> > 
> >   Po tym ksh nie chce zrzucać core[1], także zlinkowany z efence.

...raczej przypadkowo. 
Jak dopisałem te procedurki z taką-sobie obsługą afreeall i sprawdzania
wskaźników[1] - to zlinkowany z efence zadziałał poprawnie[2], a bez
efence - dumpnął tak jak wersja z oryginalnym zarządzaniem.

> >   Co nie znaczy, że błędów nie ma.
> Hmm ale to by znaczyło, że błąd jest gdzieś w powyższych funkcjach.

Chyba jednak nie... No, może tam też :> Ale nie tylko tam.

[2] z dokładnością do komunikatów...
O ile już wiem skąd się biorą numery linii (nie jest to numer linii
z błędem, tylko numer linii po wyjściu ze wszystkich zagnieżdżeń - w tym
przypadku po ostatnim fi) - to nie wiem, dlaczego późniejsze komunikaty
są już bez numeru linii - być może tu jest błąd, raz trafi w jakieś zera
i nic nie wyświetli, a raz w śmieci, które próbuje interpretować jako
wskaźniki i się wywala...
W każdym razie dopisałem do alloc() i aresize() wypełnianie alokowanych
obszarów nie-zerem - no i w chwili segfaultu struktura source zawiera
w dużej części tę wartość (w tym przypadku 0x96 - czyli z alloca).
Chyba trzeba dalej pójść tym tropem - albo wskaźnik source wskazuje na
bzdury, albo coś skopiowało kawałek pamięci nie tam gdzie trzeba.

> Będziesz nadal męczył się nad znalezieniem buga w zarządzaniu pamięcią?

Nie wiem... na razie muszę się czym innym zająć, później pewnie tak,
jeżeli nikt do tej pory nie znajdzie błędu.


[1] Może się komuś przyda i jednak znajdzie ten błąd :)
To co wpisałem zamiast oryginalnych funkcji wygląda tak
(nie wygląda to ładnie i zdecydowanie nie było pisane z myślą o
 szybkości; a może się gdzieś pomyliłem? acha, założenie, że
 sizeof(int)==sizeof(int*) było świadome)

Area *ainit(/*register*/ Area *ap)
{ int *p=malloc(sizeof(int*));
  if(p) *p=0;
  ap->freelist=p;
  return ap;
}

void afreeall(/*register*/ Area *ap)
{ int i,*p=ap->freelist;
  for(i=0;i<*p;i++)
    if(p[2*i+2]!=-1)
      free((void*)p[2*i+1]);
  p=realloc(p,sizeof(int*));
  if(p) *p=0;
  ap->freelist=p;
}

void *alloc(size_t size,/*register*/ Area *ap)
{ int *porig=ap->freelist;
  int *p=realloc(porig,(porig[0]*2+3)*sizeof(int));
  void *ptr=malloc(size);
  if(ptr) memset(ptr,0x96,size);
  p[p[0]*2+1]=ptr;
  p[p[0]*2+2]=size;
  p[0]++;
  ap->freelist=p;
  return ptr;
}

void *aresize(/*register*/ void *ptr, size_t size, Area *ap)
{ int i,*p=ap->freelist;
  if(ptr==NULL) return alloc(size,ap);
  for(i=0;i<*p;i++)
    if(p[2*i+1]==ptr && p[2*i+2]!=-1) {
      char *ptr2=realloc(ptr,size);
      if(ptr2 && size>p[2*i+2])
        memset(ptr2+p[2*i+2],0xbd,size-p[2*i+2]);
      p[2*i+1]=ptr2;
      p[2*i+2]=size;
      return ptr2;
    }
  fprintf(stderr,"attempt to resize not allocated pointer: %08x!!!\n",ptr);
  *(int*)NULL=0;
}

void afree(void *ptr, /*register*/ Area *ap)
{ int i,*p=ap->freelist;
  for(i=0;i<*p;i++)
    if(p[2*i+1]==ptr && p[2*i+2]!=-1) {
      free(ptr);
      p[2*i+2]=-1;
      return;
  }
  fprintf(stderr,"attempt to free not allocated pointer: %08x!!!\n",ptr);
  *(int*)NULL=0;
}


-- 
Jakub Bogusz
http://prioris.mini.pw.edu.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl