Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

migu

free rider

  • "migu" is male

Posts: 2,643

Date of registration: Dec 11th 2001

Occupation: Developer

21

Friday, November 25th 2005, 10:36pm

Quoted

Original von T2k
Visual studio hat kein problem mit fobar2 (außer eben der warnung das nicht alle steuerelemente nen wert zurückgeben) fobar1 ist ungültig
doch ich kann beim besten willen nicht sagen welches resultat fobar1 unter linux/gxx liefert


Was willst du mit diesem Code testen?

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
$ g++ --version
g++ (GCC) 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)
$ g++ -Wall -o strange strange.cc
strange.cc: In function ‘FOBAR fobar1()’:
strange.cc:3: warning: unused variable ‘f’
strange.cc: In function ‘FOBAR fobar2()’:
strange.cc:7: warning: unused variable ‘f’
strange.cc: In function ‘FOBAR fobar1()’:
strange.cc:4: warning: control reaches end of non-void function
strange.cc: In function ‘FOBAR fobar2()’:
strange.cc:9: warning: control reaches end of non-void function
$ ./strange
$
Da passiert also gar nichts.
tar: Anlegen eines leeren Archivs wird feige verweigert.

T2k

Erfahrener Schreiberling

  • "T2k" is male

Posts: 339

Date of registration: Oct 9th 2002

Location: da drüben, gleich dort.

Occupation: Warum? Hmm, weil ich sonst nix mit meiner Zeit anzufangen weiß :D

22

Saturday, November 26th 2005, 1:39am

@migu: der code selbst macht garnix und ist da um zu zeigen das visual studio ansich besser compiliert als gcc... laut dem c++ standard (hab eben ma nachgeschaut) ist der rückgabewert einer funktion ohne return aber mit definierten rückgabetyp undefiniert (fobar1 ist eine solche problemfunktion), sprich dort kann alles mögliche drinstehen/zurückgegeben werden... wenn man dort aber nur höhstens ne warnung bekommt (mit der zudem ein anfänger vermutlich nix anfangen kann) find ich das schon etwas arg. So ein fehler würde bei visual studio dazu führen das das gesammte programm nicht compilieren würde und somit der fehler gleich beim entstehen der funktion korrigiert wird. Aber um ein Extremum zu zeigen, stell dir nen riesengroßes projekt vor mit 4 dateien
fobar.cpp
fobar.h
main.cpp
main.h
nun stell dir vor in fobar steht irgendwelcher code drin, ne klasse die in der h datei definiert wird, die memberfunktionen werden in der cpp datei definiert... nun ist man fleißig am entickeln und ignoriert erstmal die ganzen warnungen (anfänger und leute die es eilig haben etc machen sowas)... und mann übersieht diese total wichtige warnung die man sowieso nicht versteht... nungut mag manch einer sagen, die warnung wird ja bei jedem compilieren kommen, aber dem ist nicht so, wenn man zb nen makefile verwendet.

OK egal es compiliert ja! Also mal eben fleißig die main funktion und den ganzen schnickschnack schreiben, welche die klasse mit einigen funktionen verwenden und schwups ist das projekt mal eben 100dateien groß. Der 286braucht auch seine 12stunden zum compilieren des gesamten projekts, ist aber alles kein problem, das makefile system weiss ja welche cpp dateien verändert wurden und compiliert nur diese... lange rede kurzer sinn: am ende wundert man sich wieso das compilierte programm nicht läuft... ist ja alles ok (bis auf den undefinierten return wert)... an diesem punkt sag ich nur: viel spaß beim suchen des fehlers... wer an diesem punkt die warnung sehen will muss vollständig neu compilieren!
und hab auch keine lust mehr meinen standpunkt zu vertreten (eure fehler sind nicht meine schuld...). Ist ja auch nur ein schönheitsfehler :rolleyes:... ich könnte jetzt anfangen euch von abstrakten klassen die keine sind usw erzählen aber dazu fehlt mir dann doch der nerv ;)


für interessierte (zeilen weichen etwas ab von migus version, liegt aber an mir nicht am compiler):
d:\...\main.cpp(5) : error C4716: 'fobar1': Muss einen Wert zurückgeben
d:\...\main.cpp(10) : warning C4715: 'fobar2': Nicht alle Steuerelementpfade geben einen Wert zurück
und das ist das standard warnlevel (3), auf warnlvl4 siehts so aus:
d:\...\main.cpp(4) : warning C4189: 'f': Lokale Variable ist initialisiert aber nicht referenziert
d:\...\main.cpp(9) : warning C4127: Bedingter Ausdruck ist konstant
d:\...\main.cpp(8 ) : warning C4189: 'f': Lokale Variable ist initialisiert aber nicht referenziert
d:\...\main.cpp(12) : warning C4100: 'argv': Unreferenzierter formaler Parameter
d:\...\main.cpp(12) : warning C4100: 'argc': Unreferenzierter formaler Parameter
d:\...\main.cpp(15) : warning C4189: 'f2': Lokale Variable ist initialisiert aber nicht referenziert
d:\...\main.cpp(14) : warning C4189: 'f1': Lokale Variable ist initialisiert aber nicht referenziert
d:\...\main.cpp(5) : error C4716: 'fobar1': Muss einen Wert zurückgeben
d:\...\main.cpp(10) : warning C4715: 'fobar2': Nicht alle Steuerelementpfade geben einen Wert zurück
man beachte auch argc und argv... unter gcc sehe ich dort keine warnungen...

damit ist bewiesen das VC > gxx ist, QED (scherz... oder doch nicht?)
Die zweithäufigste Todesursache eines Soldaten ist das Gewicht seines Rückentornisters ("http://olnigg.de/" Aug05/Nr120)

denial

Erfahrener Schreiberling

  • "denial" is male

Posts: 394

Date of registration: Feb 18th 2003

Location: Göttingen

Occupation: Linux Coder (ex Mathe SR Inf Student)

23

Saturday, November 26th 2005, 11:07am

Source code

1
2
3
4
5
6
7
8
9
10
$ g++ -Wall -o strange strange.cc -finline-functions
strange.cc: In function 'FOBAR fobar1()':
strange.cc:3: warning: unused variable 'f'
strange.cc:4: no return statement in function returning non-void <----------------
strange.cc: In function 'FOBAR fobar2()':
strange.cc:7: warning: unused variable 'f'
strange.cc: In function 'FOBAR fobar1()':
strange.cc:4: warning: control reaches end of non-void function
strange.cc: In function 'FOBAR fobar2()':
strange.cc:9: warning: control reaches end of non-void function


Das entspricht in etwa dem C4716 von VC.
Statt -finline-functions würde's auch -O3 tun.
Was macht VC, wenn man komplett ohne Optimierung kompiliert?

T2k

Erfahrener Schreiberling

  • "T2k" is male

Posts: 339

Date of registration: Oct 9th 2002

Location: da drüben, gleich dort.

Occupation: Warum? Hmm, weil ich sonst nix mit meiner Zeit anzufangen weiß :D

24

Saturday, November 26th 2005, 1:10pm

Quoted

Original von denial
Was macht VC, wenn man komplett ohne Optimierung kompiliert?


wie meinst du das? das war ein debug build mit standard projekteinstellungen, sprich 0 optimierungen aber maximaler prüfung (pufferüberlauf prüfungen und all der kram ist da auch automatisch möglich), ist aber egal, da selbst mit eingeschalteten optimierungen sich nix an den warnungen ändert (das wird bei visual studio nur über das warnlevel bestimmt... mann kann auch die schöne option 'alle warnungen als fehler behandeln' anwählen...)
Die zweithäufigste Todesursache eines Soldaten ist das Gewicht seines Rückentornisters ("http://olnigg.de/" Aug05/Nr120)

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

25

Saturday, November 26th 2005, 3:07pm

Quoted

Original von T2k
der code selbst macht garnix und ist da um zu zeigen das visual studio ansich besser compiliert als gcc...
Du willst also anhand eines Beispiels zeigen, daß eine Sache insgesamt besser ist als eine andere? Großartige Idee.

Quoted

laut dem c++ standard (hab eben ma nachgeschaut) ist der rückgabewert einer funktion ohne return aber mit definierten rückgabetyp undefiniert
Ich habe da neulich auch mal reingeschaut, dazu aber leider auf die Schnelle nichts gefunden. Kannst Du mir bitte die genaue Stelle nennen?

Quoted

wenn man dort aber nur höhstens ne warnung bekommt (mit der zudem ein anfänger vermutlich nix anfangen kann) find ich das schon etwas arg.
Dazu fällt mir ein IMHO sehr interessanter Artikel ein, den ich vor einiger Zeit gelesen habe: [ACM Queue] Security: The root of the problem

Quoted

nun ist man fleißig am entickeln und ignoriert erstmal die ganzen warnungen (anfänger und leute die es eilig haben etc machen sowas)...
Ich habe von C(++) (wenn überhaupt) nur ganz wenig Ahnung, bin also Anfänger, und habe es meist auch eher eilig. Trotzdem lege ich darauf Wert, daß mein Code eine gewisse Qualität besitzt. Gerade als Anfänger finde ich Compiler-Warnungen daher ausgesprochen hilfreich.

Quoted

OK egal es compiliert ja!
IMHO ganz schlechter Programmierstil.

Quoted

und hab auch keine lust mehr meinen standpunkt zu vertreten
Schade ...
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

T2k

Erfahrener Schreiberling

  • "T2k" is male

Posts: 339

Date of registration: Oct 9th 2002

Location: da drüben, gleich dort.

Occupation: Warum? Hmm, weil ich sonst nix mit meiner Zeit anzufangen weiß :D

26

Saturday, November 26th 2005, 8:01pm

Quoted

Original von Joachim
...
Du mir bitte die genaue Stelle nennen?

6.6.3 und damit ihr nicht extra lange suchen müsst: hier nen link. Die tatsache ignorieren, dass diese version sich vom final iso dokument an angegebener stelle minimal unterscheidet (rechtschreibfehler...)


Quoted

...
Ahnung, bin also Anfänger, und habe es meist auch eher eilig. Trotzdem lege ich darauf Wert, daß mein Code eine gewisse Qualität besitzt. Gerade als Anfänger finde ich Compiler-Warnungen daher ausgesprochen hilfreich.

da will ich nicht widersprechen, nur fehler sind noch besser als warnungen...

Quoted


Quoted

OK egal es compiliert ja!
IMHO ganz schlechter Programmierstil.

sicher ist der schlecht, aber dient hier um dem beispiel einen sinn zu geben
Die zweithäufigste Todesursache eines Soldaten ist das Gewicht seines Rückentornisters ("http://olnigg.de/" Aug05/Nr120)

denial

Erfahrener Schreiberling

  • "denial" is male

Posts: 394

Date of registration: Feb 18th 2003

Location: Göttingen

Occupation: Linux Coder (ex Mathe SR Inf Student)

27

Saturday, November 26th 2005, 11:43pm

Quoted

Original von T2k
6.6.3 und damit ihr nicht extra lange suchen müsst: hier nen link.

Quoted

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

Na bitte! GCC hält sich an den Standard. ;)

Undefined behavior ist mehr als nur ein undefinierter Rückgabewert. Wer undefined behavior ausnutzt, muß damit rechnen, daß sein Programm evtl. durch ein Hello World ersetzt wird.

This post has been edited 1 times, last edit by "denial" (Nov 26th 2005, 11:48pm)