2 registered members (VoroneTZ, TipmyPip),
1,333
guests, and 0
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Der "mich kotzt etwas verdammt an"- Thread
[Re: Uhrwerk]
#404397
07/08/12 15:02
07/08/12 15:02
|
Joined: Jan 2003
Posts: 4,305
Damocles
Expert
|
Expert
Joined: Jan 2003
Posts: 4,305
|
Bestes Beipiel für die Gefahr hinter if (a = b) ... Eine der versuchten Community Änderungen am Linux Kernel:
if ((options == (__WCLONE|__WALL)) && (current->uid = 0)) retval = -EINVAL;
retval = -ECHILD;
....
Sieht erstmal nicht besonders gefährlich aus. Allerdings setzt beim ausführen dieser Condition der Kernel den User auf 0 (root! = alle Rechte) Ist sehr leicht zu übersehen, vor allem ohne Code Warning in der IDE. http://kerneltrap.org/node/1584
|
|
|
Re: Der "mich kotzt etwas verdammt an"- Thread
[Re: Damocles]
#404404
07/08/12 16:36
07/08/12 16:36
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
Naja, der Ausdruck ist ja eh sehr kryptisch, mir ist z.B. nicht ersichtlich, was die Konstanten __WCLONE und __WALL bedeuten, oder was -ECHILD dann letztenendes meint. Bei komplizierten Ausdrücken lohnt es sich dann, finde ich, Teile vorher auszuwerten und dann in den Ausdruck einzusetzen:
boolean faceIsPartOfModel = ...;
boolean faceHasUv = ...;
if (faceIsPartOfModel && faceHasUv)
{
// do something
}
Aber richtig, das mit dem = ist gefährlich. Richtig ätzend ist es dann, wenn so tolle selbsternannte Programmierergötter das absichtlich so machen, um die Zuweisung zu machen, eine Zeile zu sparen und den als 1 evaluierten Ausdruck weiterzuverwursten. Oder Spielchen mit ++ oder -- hinter oder vor einer Variable in nem langen Ausdruck - geht gar nicht! Nicht weil man selber zu blöd ist, das nachzuvollziehen, sondern weil das wieder die Übersicht und die Wartbarkeit negativ beeinflusst. Wenn ich mich richtig erinnere, wird in Pascal das ":=" verwendet, um eine Zuweisung auszudrücken, während "=" die Äquivalenz prüft. Finde ich so besser, da es den mathematischen Hintergründen gerecht wird.
Last edited by HeelX; 07/08/12 16:37.
|
|
|
Re: Der "mich kotzt etwas verdammt an"- Thread
[Re: Uhrwerk]
#404411
07/08/12 17:57
07/08/12 17:57
|
Joined: Dec 2002
Posts: 3,363 Vindobona (Ostarichi)
Harry Potter
Expert
|
Expert
Joined: Dec 2002
Posts: 3,363
Vindobona (Ostarichi)
|
Harry, das würde man ja auch so schreiben:
void blabla()
{
if(a == b)
while(1)
{
Tu_das(1);
Tu_das(2);
if(c == d)
Tu_das(3);
}
}
Oh mein Gott, das finde ich ja total pervers. Und vor allem extrem anfällig für Programmfehler, weil man leicht übersehen könnte, dass beim "IF" die Klammer fehlt, und man dann glauben könnte, dass noch nachfolgende Programmzeilen ebenfalls zum IF-Block dazu gehören. Beim Beispiel oben könnte jemand nach der Zeile "Tu_das(3);" noch eine Zeile "Tu_das(4)" einfügen, in dem Glauben, dass das dann auch noch zur IF-Bedingung dazu gehört. Weil eine Zeile tiefer steht ja eine geschwungene Klammer "}", und man könnte glauben, dass diese das Ende vom IF-Block ist. Und schon hat man einen Programmfehler, der sich nur schwer finden lässt. Bevor ich das hier schreibe: schreibe ich lieber das hier:
|
|
|
Re: Der "mich kotzt etwas verdammt an"- Thread
[Re: HeelX]
#404415
07/08/12 19:44
07/08/12 19:44
|
Joined: Dec 2002
Posts: 3,363 Vindobona (Ostarichi)
Harry Potter
Expert
|
Expert
Joined: Dec 2002
Posts: 3,363
Vindobona (Ostarichi)
|
Ja, wenn eine Bedingung nur eine einzige Zeile betrifft, dann schreibe ich das auch gerne in eine einzige Zeile. Weil das ja dann auch irgendwie sinngemäß zusammengehört. Und das sieht man dann auch sofort auf einem Blick, und es reduziert die Länge des Codings. Natürlich mache ich das nur dann, wenn die Zeile dadurch nicht insgesamt zu lang und unleserlich wird. Typisches Beispiel:
while(1)
{
do_exit = check_exit_loop(gv_parm1, gv_parm2, gv_parm3);
if(do_exit) {break;} //<---Kurz und bündig
//Und hier geht es weiter ...
if ((gv_parm1 == 1) !! (gv_parm2 == 99))
{
Tu_das(1);
Tu_das(2);
Tu_das(3);
}
}
Last edited by Harry Potter; 07/08/12 20:04.
|
|
|
Re: Der "mich kotzt etwas verdammt an"- Thread
[Re: Harry Potter]
#404416
07/08/12 20:31
07/08/12 20:31
|
Joined: Jul 2001
Posts: 6,904
HeelX
Senior Expert
|
Senior Expert
Joined: Jul 2001
Posts: 6,904
|
|
|
|
Re: Der "mich kotzt etwas verdammt an"- Thread
[Re: Harry Potter]
#404421
07/08/12 21:21
07/08/12 21:21
|
Joined: Jan 2002
Posts: 4,225 Germany / Essen
Uhrwerk
Expert
|
Expert
Joined: Jan 2002
Posts: 4,225
Germany / Essen
|
Oh mein Gott, das finde ich ja total pervers. Und vor allem extrem anfällig für Programmfehler, weil man leicht übersehen könnte, dass beim "IF" die Klammer fehlt, und man dann glauben könnte, dass noch nachfolgende Programmzeilen ebenfalls zum IF-Block dazu gehören Den Trugschluss kann man nur ziehen wenn man die Einrückung ignoriert und noch eine öffnende Klammer hinzuphantasiert. Mann könnte auch schreiben:
void blabla()
{
if(a == b)
{
while(1)
{
Tu_das(1);
Tu_das(2);
if(c == d)
Tu_das(3);
}
}
}
Das macht es noch einen Tick deutlicher. Auf due Klammer um "Tu_das(3); sollte man aber auf jeden Fall verzichten.
Always learn from history, to be sure you make the same mistakes again...
|
|
|
Re: Der "mich kotzt etwas verdammt an"- Thread
[Re: Harry Potter]
#404428
07/09/12 04:27
07/09/12 04:27
|
Joined: Jan 2003
Posts: 4,305
Damocles
Expert
|
Expert
Joined: Jan 2003
Posts: 4,305
|
Kennt das hier jemand in Java?
void blabla()
{
if((checkA()==2) & (checkB()==3))
{
tuDas();
}
}
Ist realtiv unbekannt, funktioniert aber. Jetzt ratet mal den Unterschied zwischen if((checkA()==2) && (checkB()==3)) und if((checkA()==2) & (checkB()==3)) Den gibt es, und das kann schnell zu gemeinen Bugs führen wenn man das Konstrukt nicht kennt.
|
|
|
|