- 5928 megtekintés
 
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;
- A hozzászóláshoz be kell jelentkezni
 
te, nem tudok fortranul ;)
- A hozzászóláshoz be kell jelentkezni
 
- A hozzászóláshoz be kell jelentkezni
 
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 hozzászóláshoz be kell jelentkezni
 
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/
- A hozzászóláshoz be kell jelentkezni
 
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.
- A hozzászóláshoz be kell jelentkezni
 
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.
- A hozzászóláshoz be kell jelentkezni
 
http://sig9.com/articles/att-syntax :)
--
NetBSD - Simplicity is prerequisite for reliability 
- A hozzászóláshoz be kell jelentkezni
 
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
- A hozzászóláshoz be kell jelentkezni
 
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;
- A hozzászóláshoz be kell jelentkezni
 
s/^or/test/ jobbabb.
http://hup.hu/taxonomy/term/209
http://www.youtube.com/watch?v=QXz7-BNC6jw
http://nocirc.org/
- A hozzászóláshoz be kell jelentkezni
 
Tökmindegy. Összevagyolni egy regisztert önmagával ugyanannyi órajel ciklus, és ugyanúgy nem változtatja a regiszter értékét, csak a flageket. A test talán olvashatóbb, abban igazad van.
- A hozzászóláshoz be kell jelentkezni
 
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/
- A hozzászóláshoz be kell jelentkezni
 
Ez lehet az a "foglaltsagjelzo mezo" amiről egeresz beszélt. Csak az a gáz, hogy már az erre hivatkozó pointer a hibás, így el se jut az ellenőrzésig.
- A hozzászóláshoz be kell jelentkezni
 
Az assembly kódból végül is az látszik, hogy a függvény mindenféle ellenőrzés nélkül átveszi a pointert, és hivatkozik a célterületre, és ez okozza a segfault-ot.
Szerk: Out of memory gond lehet például, ha nincs lekezelve a "pointer lefoglalásakor"
- A hozzászóláshoz be kell jelentkezni
 
szerintem fortranban nem jellemzo a segfault, ugyhogy valoszinuleg kulso hiba
--
NetBSD - Simplicity is prerequisite for reliability 
- A hozzászóláshoz be kell jelentkezni
 
ulimit -s unlimited
nem hasznal.
- A hozzászóláshoz be kell jelentkezni
 
Alapból nincs ilyen limitáció,csak ha beállítják, a fizikai erőforrásokat nem tudod átlépni.
Inkább figyeld a memória foglalást valami system monitor programmal, de lehet hogy még ez sem segít, ha túl gyorsan kilép.
- A hozzászóláshoz be kell jelentkezni
 
-debug all fordítás és az idb (intel debugger) mit mond?
- A hozzászóláshoz be kell jelentkezni
 
btw első körben 10.1-es fordítóval próbálnám, az intel fordítók nem mindig hibamentesek
- A hozzászóláshoz be kell jelentkezni
 
Koszonom a segitseget.
Jelenleg 11.1 es 12.0 fordito van fenn, a regebbiekhez turni kellene. Azonban, gfortran 4.3.2 -val sikeres build tortent, akkor terek vissza az intel forditohoz, ha nem lesz hasznalhato mpi bild.
- A hozzászóláshoz be kell jelentkezni
 
kvantumkémia programokhoz a 11-es sorozat legendásan nem ok, a gfortran játékra jó, de production kódhoz általában lassú
- A hozzászóláshoz be kell jelentkezni
 
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.
- A hozzászóláshoz be kell jelentkezni
 
általában nem baj
- A hozzászóláshoz be kell jelentkezni