[tovabblepve] Fortran 95 ASSOCIATED (pointer) SIGSEGV

Hozzászólások

Hát én se értek fortranul, de így ránézésre az a "buffers%b" cucc NULL pointer-nek túnik.

Szerk.:

Próbáld ki(ugyan ezt fortranra lefordítva):
if(buffers.b != NULL) return *(buffers.b);
else return FAKE;

Ha az assembler minden vágyad, elmondhatom mit látok bele:

221a : beolvassa a paramétert a stack-ről
221b-2226 : Megkeresi a pointert
222a : Feloldja a pointert
222d- valami elágazás féle
2244- gondolom a visszatérési értékkel bíbelődik

Mindez a lényegen nem változtat:
1,hibás pointert kap a függvény
2,nem úszod meg a fortrant, ha ezt ki akarod javítani.

A *di regiszter (által hivatkozott memóriaterület) a ludas, a hivatkozott terület zárolt ( - de nem feltétlen triviálisan 0 az értéke - ) a procedúra kódrészlet előtt. De erre más is rájött, dongolom én, van még bővebb objdump arról, hogy kideríthesd, mi rdi értéke? (És hogy melyik függvény rontja el)?

Szerk.

Szerk.2. közben látom, miből lesz a cserebogár, de már írták, buffers%b nem asszociált memóriahivatkozás lesz. De nem tudok fortranul.

http://hup.hu/taxonomy/term/209
http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

kis dokisolvasgatas utan ugy tunik, hogy ebben a nyelben a pointer a nyelv alapjan egy elegge vedett tipus, megjegyzi, hogy hozza-lett-e rendelve valamihez vagy sem. Ennelfogva az ASSOCIATED builtin hasznalhato, mley szerint ezzel a statusszal ter vissza. Ez minosegileg mas, mint a C style pointer. Mondjuk ugy lehet elkepzelni, hogy egy kis struktura, amiben van foglaltsagjelszo mezo a valodi cimen kivul.

Ha ez az olvasata a doksinak igaz, akkor nem eshet el itt es ekkor a progi. De elesik, ami vagy memoriaszemeteles, vagy pedig valami limit (tipikusan a stack) elhaznalodasa. Ez utobbit ki tudom tesztelni.

Kicsit zavaros az assembly kód is. A rax-ot miért másolja a "(rax)"-ra? Mert ugye a "mov" jobbról balra másol.
Úgy olvastam a pointer feloldás [] zárójel. Akkor ez mi?
De ami a legfurcsább hogy a rax-ot miért hasonlítja össze saját magával utána?

Lehet mégsem vágom annyira ezt a nyelvet.

No igen, ez megmagyaráz egy-két dolgot. :)

Még forrás:
http://www.nasm.us/links/unix64abi

%rdi used to pass 1st argument to functions

Tehát a függvény első paraméterét bemásolja a stack-re, majd feloldja a pointert, és a hozzá tartozó értéket összeveti saját magával, és ha egyezik őnmagával, akkor bemásol egy 0-át a stack-re. Aha, minden világos :S

Rosszul értelmezed. Az összehasonlítja magával rész egyszerű nem-nulla feltétel.
Bár ezt assemblyben nem így szokás, hanem az olvashatóbb nem-zero:

or %eax, %eax
jnz nemnulla
...
nemnulla:

Egyébként meg ez a kód mindenképp elvérzik.
222a: nem lett leellenőrizve, hogy a paraméter érvényes cím-e.
2232 és 223c: ha a paraméter által mutatott dword 0, a pointer 0 egyébként -1 lesz
2244: akár 0, akár -1, a pointer feloldása mindenképp bukta.
Kb ez a fenti kód C-ben:

if(*arg) ptr=-1; else ptr=0;
a=*ptr;

Ma már kvázi mindegy, ez igaz. De régen, órajelínséges időkben intrókódolásnál még számítottak az ilyesfajta (méret|sebesség|biztonság|hordozhatóság)(növelő|csökkentő) trükkök.

http://hup.hu/taxonomy/term/209
http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/

szerintem fortranban nem jellemzo a segfault, ugyhogy valoszinuleg kulso hiba

--
NetBSD - Simplicity is prerequisite for reliability

-debug all fordítás és az idb (intel debugger) mit mond?

btw első körben 10.1-es fordítóval próbálnám, az intel fordítók nem mindig hibamentesek

nocsak.

Azota van hasznalhato MPI build (gfortran+mpich2)

egy regebbi feladatnal (cfour) a Szalai Peter sajat ifort 10-es forditasa fut, a ifort 11.1 -gyel az egyik modul crashel. Azok a modulok viszont, amik nem esnek, azok cca 20%-25% -kal gyorsabbak ifort 11.1 -gyel.

Es mennyire mukodik az, hogy regabbi forditoval hasznalom az ujabb MKL-t? Merthogy minden fordito kiadasnal jon vele egy MKL is.