Re: bytegroesse, was endianess/Re: audio-cd

From: Christian Weisgerber <naddy(at)mips.inka.de>
Date: Fri, 22 Mar 2002 21:27:08 +0000 (UTC)

Oliver Fromme <de-bsd-questions(at)DE.FreeBSD.ORG> wrote:

> und starte mal folgendes C-Programm auf 'ner Alpha:
>
> int main() {
> char c; int *p;
> p = (int *) &c + 1;
> return *p;
> }
>
> Das fliegt Dir um die Ohren,

Nein.
Die Tücke liegt im Detail. In obigem Fall ist c »zufällig« passend
ausgerichtet.

In der Praxis kann man gelegentlich schon solchen Horror-Code finden,
gerade auch - um wieder auf den Anfang des Threads zurückzukommen - in
Programmen, die WAV-Dateien verarbeiten:

    ...
    char *p;
    long x;
    ...
    read(fd, p, size);
    ...
    /* read 32-bit value */
    x = *(long *)p;
    ...

Das ist jetzt etwas plakativ, fasst aber gleich drei Probleme in einem
Beispiel zusammen:
1. Annahme, »long« sei ein 32-Bit-Typ.
   Falsch auf allen 64-Bit-Plattformen.
2. Annahme, der Wert läge in passender Endianness vor.
   Falsch auf der Hälfte aller Plattformen.
3. Annahme, es gäbe keine Alignment-Pflicht.
   Falsch auf sparc, alpha, u.a.

Ich habe auch schon solche lustigen Dinge gesehen, wie ein Versuch
portabel die Endianness zur Laufzeit zu bestimmen:

    ...
    char endian[] = { 0, 0, 0, 1 };
    int i;
    ...
    i = *(int *)endian;
    if (i == 1)
        ...

-- 
Christian "naddy" Weisgerber                          naddy(at)mips.inka.de
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 22 Mar 2002 - 22:30:44 CET

search this site