Probleme bei Uebergabe von Argumenten > 15 Bit in Bison?

Chris76

Grünschnabel
Folgende Regel ist unter anderem in meinem Bison-File compiler.y enthalten:

T_SRBMC compound ',' compound ',' compound ',' compound T_NEW_LINE {
BISON_DEBUG_PRINT("T_SRBMC rule");
cmnd_srbmc($2, $4, $6, $8);
}

Wenn das entsprechende Keyword erkannt wird, wird also eine Funktion aufgerufen, der 4 Parameter uebergeben werden. Diese Parameter sind im C-Code als unsigned long long int definiert und sollen Werte bis maximal 0xFFFFFFFF enthalten koennen.

Die ensprechende Funktion im C-Code schaut so aus:

void cmnd_srbmc(Val compound1, Val compound2, Val compound3, Val compound4)
{
[...]
if (compound1 > 0xFFFFFFFF)
{
print_error_file_info("Compound literal (value = 0x%llX) is out of allowed range", compound1);
error++;
}
[...]
}

Hier soll eine Fehlerabfrage stattfinden, die sicherstellt, dass keine Werte groesser als 0xFFFFFFFF uebergeben wurden.
Hat compound1 einen Wert bis maximal 0x7FFFFFFF, laeuft alles nach Plan. Ab 0x80000000 (also sobald das MSB 1 wird), nimmt die Variable den Wert 0xFFFFFFFFyyyyyyyy (y=0..F) an statt wie zu erwarten 0x00000000yyyyyyyy. Die if-Abfrage wird also wahr, obwohl der Wert von compound1 eigentlich kleiner als 0xFFFFFFFF war. Das laessit sich herausfinden, indem man einfach die Variable compound1 per printf ausgibt. Wird ein zu grosser Wert in compound1 uebergeben (beispielsweise 0x123456789, wird diese per printf in cmnd_srbmc als 0xFFFFFFFFFFFFFFFF ausgegeben.
Wenn ich aber die Variable compound1 direkt in der Funktion cmnd_srbmc definiere verhaelt sich alles wieder wie erwartet und es wird keine Fehlermeldung ausgegeben. Deswegen denke ich dass der Fehler nicht im C-Code drumherum liegt, sondern schon im compiler.y-File oder dem daraus von Bison generierten compiler.tab.c File, von wo aus die Funktion cmnd_srbmc ja aufgerufen wird. Hat jemand von Euch eine Idee, woran das liegen koennte? Irgendwelche Bison-Besonderheiten, die ich beachten muss?
Folgende Versionen habe ich verwendet:
GNU bison version 2.3
flex version 2.5.4
gcc version 3.4.4

Danke schonmal und Gruss,
Christian
 
Zurück