Warum meckert der Compiler nicht?
-
Folgenden Fall:
void f(char *s) {} void g() { const char *s = "Hallo"; f("Hallo"); f(s); }
f erwartet einen char* der evtl. auch verändert werden kann.
In beiden Aufrufen wird ein *const char **, also ein
String der nicht verändert werden darf, übergeben!Der Compiler (Dev-CPP) läßt beides durchgehen, erlaubt also
einen impliziten cast von const char* auf char *.Wie ist denn sowas möglich?
-
Vielleicht mal Warnungen aktivieren?
-
In einem Fall kommt eine Warnung, aber das ist nicht das Problem.
Der Code ist doch eindeutig fehlerhaft.
Also muß der Compiler doch in jedem Fall einen Error melden.
-
liegt an devcpp. das unterdrueckt warnungen. es liegt definitiv nicht an GCC, der spruckt folgendes aus:
foo.c:5: warning: passing arg 1 of
f' discards qualifiers from pointer target type foo.c:6: warning: passing arg 1 of
f' discards qualifiers from pointer target typeum himmels willen, lass die griffel von devcpp. das stueck sch...immel ist doch wertlos!
soa, und weil es kein "IDE" forum gibt, fliegst du jetzt nach "compiler". tschuessi
-
Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Compiler-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ganz einfach: In C ist das nicht fehlerhaft. Es gibt in C keine "const-correctness" im C++-Sinne, die sich durch das ganze Programm zieht. Du kannst Ausdruecke, die als const deklariert sind, nicht veraendern ... aber du kannst nicht-const-Zeiger auf sie zeigen lassen und bist dann selbst dafuer verantwortlich, keinen Sch** zu bauen, sonst ist das Verhalten undefiniert.
Deshalb gibts auch nur eine Warnung, und keinen Fehler.
-
Dann ist doch der ganze Sinn und Zweck des const-Modifiers für die Katz!
Hat jemand einen Link auf die gültige Sprachspezifikation
von C und/oder C++. Da muß doch irgendwo geklärt sein.Das sogar der gcc nur eine Warnung ausgibt sieht mir
eher danach aus, als ob dieses Verhalten mehr eine Art Reminiszens
an die Faulheit vieler Programmierer ist als das es durch die
Sprachdefinition gedeckt ist.
-
ISO/IEC 14882:2003 schrieb:
4.2/2
A string literal (2.13.4) that is not a wide string literal can be converted to an rvalue of type “pointer to char”; a wide string literal can be converted to an rvalue of type “pointer to wchar_t”. In either case, the result is a pointer to the first element of the array. This conversion is considered only when there is an explicit appropriate pointer target type, and not when there is a general need to convert from an lvalue to an rvalue. [Note: this conversion is deprecated. See Annex D. ] For the purpose of ranking in overload resolution (13.3.3.1.1), this conversion is considered an array-to-pointer conversion followed by a qualification conversion (4.4). [Example: "abc" is converted to “pointer to const char” as an array-to-pointer conversion, and then to “pointer to char” as a qualification conversion. ]
-
Javaner schrieb:
Also muß der Compiler doch in jedem Fall einen Error melden.
Gib dem Compiler das Flag -pedantic-errors mit, dann hast du deinen Fehler.
-
groovemaster schrieb:
Javaner schrieb:
Also muß der Compiler doch in jedem Fall einen Error melden.
Gib dem Compiler das Flag -pedantic-errors mit, dann hast du deinen Fehler.
Und wie mache ich das in DevCpp?
Edit: ...oder werde ich hier gerade verarscht?
-
Dort, wo Du dem Compiler Compileroptionen mitgeben kannst.
Sollte für einen Programmierer nicht sooo schwer sein, das selbst zu finden