Wie man Compilerfehler umgeht
Neulich ist mir beim “Code Review” von altem C-Code folgender Code unter die müden Augen geraten:
void foo(void* bar, int i, char ch)
{
(*bar);
i = 42;
ch = 'T';
}
Mein erster Impuls war: What? Was macht ein (*bar) überhaupt? Und warum ist das
da?? In anderen C-Codedateien war dann eine Antwort auf die letzte Frage zu
sehen: ‘/* Verhindert einen Compilerfehler. */’ Aha!
Mal abgesehen davon, dass es durchaus mal C-Compiler gegeben hat (und vielleicht) auch immer noch gibt, die sich aus dem einen oder anderen unerfindlichem Grund an einer (relativ) harmlosen Code-Stelle verschlucken, war die erste Frage dadurch immer noch unbeantwortet. Aber die Antwort ist einfach: Nichts!
Der Ausdruck ‘(*bar)’ ist einfach eine sog. ‘Expression’, zu erkennen an den
runden Klammern. Hierbei wird einfach der Inhalt, von dem worauf bar zeigt, genommen
und … nichts weiter damit gemacht. Es steht also ein Byte-/Wort-/Doppelwort-Wert
auf dem Stack/in einem Register und wird danach auch sofort wieder weggeschmissen, d.h.
überschrieben. Es kurzer Test mit einem GCC-4.x bestätigte dann auch diese Vermutung:
Die Code-Zeile erzeugte keinen(!) (Assembler-)Code.
Interessant…