Автор Гілка: Примусовий сегфолт  (Прочитано 2194 раз)

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Як відомо, вихід в програмі за межі виділеної пам'яті ще не обов'язково означає її падіння. І це страшенно бісить бо таким чином дірки можуть ховатись страшенно довго і проявляти себе абсолютно несподівано (ні з того ні з сього програма для автоматичного змивання розбиває бідон унітаза ;) ).

Чи не можна якось дебугера примусити підвищити ймовірність гепання програми при виході за межі (офіційно) виділеної пам'яті?
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Re: Примусовий сегфолт
« Відповідей #1 : 2008-09-05 15:05:49 »
Як відомо, вихід в програмі за межі виділеної пам'яті ще не обов'язково означає її падіння. І це страшенно бісить бо таким чином дірки можуть ховатись страшенно довго і проявляти себе абсолютно несподівано (ні з того ні з сього програма для автоматичного змивання розбиває бідон унітаза ;) ).

Чи не можна якось дебугера примусити підвищити ймовірність гепання програми при виході за межі (офіційно) виділеної пам'яті?
спробуйте valgrind, він вміє виявляти дуже багато різних дірок
Fedora 35 (x86-64)

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Примусовий сегфолт
« Відповідей #2 : 2008-09-05 15:53:37 »
Круто... я цілий день діру шукав, а valgrind --tool=memcheck ... її з першого ж разу нарив  [smiley=dance3.gif]
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Примусовий сегфолт
« Відповідей #3 : 2008-09-06 00:14:46 »
одну діру латнув - десяток сховалось  >:(

що сей вивід означає ?
==5690== Conditional jump or move depends on uninitialised value(s)
==5690==    at 0x548504E: __printf_fp (in /lib64/libc-2.6.1.so)
==5690==    by 0x548172E: vfprintf (in /lib64/libc-2.6.1.so)
==5690==    by 0x5489429: printf (in /lib64/libc-2.6.1.so)
==5690==    by 0x403F9A: WaitTest (process.c:158)
==5690==    by 0x4023A6: main (pl_main.c:186)
==5690==
ось ще для функції WaitTest void WaitTest (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
  static struct astruct {
    short int *Symp;
    int NofSymplexes, Na,*natomsot;
    atom *sp;
    double ret, Omega,*rads2;
  } *ast;
  static int i;
  char str[256];
  int j, *Asur;
double vol=0.;
POLIEDER pol;

  ast = (struct astruct *) lParam;
  i = 0;
  ast->ret = 0.l;
  ast->Omega = 0.l;
  while (i < ast->Na)
  {
    double v;

    if (!(i % (ast->Na / 50)))
    {
      fprintf (stderr, "$");
    }
pol=polieder_calc_rad(ast->Symp,ast->NofSymplexes,i/*Central atom*/,ast->sp,ast->natomsot,ast->rads2);
vol+=polieder_volume(pol);

if(0){/*а це я так умовою блоки коментую -- не треба лякатись*/
int i,spos=0,j;
printf("\n");
for(i=0;i<pol.S_corner[0];i++)
printf("<sphere><c>%g %g %g</c><r>.003</r></sphere>\n",pol.C_corners[i].x,pol.C_corners[i].y,pol.C_corners[i].z);
for(i=0;i<pol.N_faces;i++)
{
for(j=1;j<pol.N_corners[i];j++)
printf("<intersphcyl><neibours>%d %d</neibours><r>0.001</r></intersphcyl>\n",pol.corners[spos+j],pol.corners[spos+j-1]);
spos+=pol.N_corners[i];
}
}
polieder_del(pol);

    i++;
  }
printf("\nAS RESULT VOLUME IS: %lg\n",vol);
}
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній DalekiyObriy

  • Літератор
  • ******
  • дописів: 1929
  • Карма: +5/-0
Re: Примусовий сегфолт
« Відповідей #4 : 2008-09-06 07:35:30 »
«Conditional jump or move depends on uninitialised value» я, за звичай, ігнорую, це постійно вилазить в системних бібліотеках, тобто теоретично воно може вказати на проблему в програмі, але я з таким не стикався
якщо цікавлять подробиці, зверніться до гугля
Fedora 35 (x86-64)