Fórumok
Sziasztok!
Adott a kovetkezo program, ami nagyon erdekesen viselkedik:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
typedef unsigned char uint8;
typedef unsigned short int uint16;
int main(void) {
uint8 Buffer[32];
int i;
void * ptr;
memset(Buffer,'X',sizeof(Buffer));
ptr=Buffer;
*(*(uint8 **)&ptr)++=0x62; /* 'b' */
for (i=1; i<=(sizeof(Buffer)-1)/2; i++)
*(*(uint16 **)&ptr)++=0x7777; /* 'ww' */
write(1,Buffer,(unsigned long int)ptr-(unsigned long int)Buffer);
return (0);
}
Ha leforditom i386-on, akkor azt csinalja, amit elvarok tole, azaz kiirja, hogy
"bwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"
. Ellenben ha leforditom alpha-n, azt irja ki, hogy
"bwwwwwwwXwwwwwwwXwwwwwwwXwwwwww"
- ha ugy akarok irni egy uint16-ot, hogy az egyik byte-ja az egyik word-ben van, a masik a masikban, akkor a masodik felet nem irja ki a memoriaba. Azt olvastam, hogy az ilyen unaligned access-t az Alpha proci nem tudja ugyan, de a kernel elkapja a memoriairast, es lebontja ket kulon irassa.
Mindket rendszer Sarge, gcc 3.3.5, kernel az i386-on 2.6.21.5, az alpha-n 2.6.20.1 (most fordul a 2.6.21.5).
Kerdes: mi lehet a bugos?
- 1007 megtekintés