Christoph Karl Walter Grein
Ein Compiler, kluges Köpfchen, das er ist, optimiert folgenden if-Block weg:
if Label = 64 then Tu_was_sehr_wichtiges; end if;
denn Label ist als Sieben-Bit-Integer
type Integer_7 is range -2**6 .. 2**6 - 1; for Integer_7'Size use 7;
deklariert worden, natürlich versehentlich, es war eine sieben Bit lange vorzeichenlose Zahl gemeint. Der Compiler schließt nämlich messerscharf, dass 64 nicht zum Wertebereich von Label gehört, daher die Bedingung auch nie eintreten kann!
Als dieses Problem bei uns auftrat, war die Aufregung groß - und die allgemeine Meinung, dies sei ein Compiler-Fehler. Mitnichten!
Warum bloß löst der implizit deklarierte Gleichheitsoperator im Ausdruck Label = 64 keine Ausnahme (Constraint_Error) aus, wie das bei einem Funktionsauf Equal (Label, 64) mit selbstdefinierter Funktion
function Equal (X, Y: Integer_7) return Boolean is begin return X = Y; end Equal;
doch prompt geschieht?
Die vorzeichenlose Sieben-Bit-Zahl wurde dann übrigens als
type Natural_7 is range 0 .. 2**7 - 1; for Natural_7'Size use 7;
deklariert 1, in wunderbarer Übereinstimmung mit der Namenskonvention, dass Natural ein Untertyp von Integer ist, und somit ein nachahmenswertes Beispiel, wie man scheinbar Offensichtliches verdrehen kann.
© Copyright 1994 C.K.W. Grein |
1 Das ist natürlich Ada83. In Ada95 würde man das heute anders definieren, doch in der überholten Sprachversion gab es keine vorzeichenlose Typen.