Forum: Compiler & IDEs Merkt der Linker es nicht, wenn Funktion und Aufruf nicht passen?


von Malte _. (malte) Benutzerseite


Lesenswert?

Hallo,
mir ist gerade aufgefallen, dass es der Linker anscheinend nicht merkt, 
wenn eine Funktion einmal mit anderen Parametern aufgerufen wird, als in 
der Implementierung der Funktion angegeben. Ist dies normal, oder gibt 
es ein Linker Parameter um in solchen Fällen eine Warnung zu erzeugen? 
Sonst könnte hier doch eine sehr schwer aufzuspürende Fehlerquelle 
liegen.

Erzeugt hatte ich die Konstellation wie folgt:
Definition in der .h Datei mit einem Parameter mehr als in der 
Implementierung in der .c Datei, wobei die .c Datei versehentlich nicht 
ihren eigenen Header eingebunden hat. Aus einer anderen .c Datei dann 
ein Aufruf passend zur Definition in der .h Datei. Somit konnte der 
Compiler noch keinen Fehler feststellen.

von yalu (Gast)


Lesenswert?

> Ist dies normal, oder gibt es ein Linker Parameter um in solchen
> Fällen eine Warnung zu erzeugen?

Der Linker kennt nur Symbole, die er versucht, zu Deckung zu bringen.
In C entsprechen diese Symbole im Wesentlichen den Funktions- bzw.
Variablennamen. Deswegen ist es sogar möglich, aus einer C-Datei eine
"Funktion" aufzurufen, die in einer anderen C-Datei in Wirklichkeit als
Variable definiert wurde, was natürlich zu einem Segfault führt.

Anders verhält es sich bei C++: Hier werden Informationen über eine
Funktion zusätzlich zum Funktionnamen in den Symbolnamen hineinkodiert.
Nur mit diesem Trick ist das Überladen von Funktionen möglich. Als
angenehmen Nebeneffekt bekommt man in deinem Fall einen Linker-Fehler
angezeigt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.