Alpha unaligned access - program vagy gcc vagy kernel bug?

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?