{"id":1800,"date":"2013-05-07T21:05:08","date_gmt":"2013-05-07T20:05:08","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=1800"},"modified":"2013-05-07T21:05:08","modified_gmt":"2013-05-07T20:05:08","slug":"safer-code","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=1800","title":{"rendered":"safer code"},"content":{"rendered":"<p>Was ist das Problem mit folgenden Code?<\/p>\n<pre>\r\n<code>\r\n    Element *ele                \/\/ uninitialisierter pointer;\r\n    while(iter->hasNext()) {    \/\/ schleife kann auch nicht ausgefuehrt werden\r\n        ele = iter->next();\r\n        ...\r\n    }\r\n    qDebug() << ele;            \/\/ segfault\r\n <\/code>\r\n<\/pre>\n<p>Wir nehmen mal an, dass qDebug() hier normalerweise nicht stehen w\u00fcrde. Man wollte sich aber das Element ausgeben lassen und hat vergessen die Debug Ausgabe wieder zu l\u00f6schen.<br \/>\nProblem ist, dass die Variable ele durch qDebug dereferenziert wird, obwohl der Pointer ins Nirvana zeigen kann, wenn die Schleife nicht ausgef\u00fchrt wird.<br \/>\nDer erste Fehler ist den Pointer nicht zu initialisieren. Man h\u00e4tte ihn auf 0 (nulptr) setzen k\u00f6nnen. Das h\u00e4tte den segfault aber nicht verhindert, aber das Debuggen erleichtert.<br \/>\nDer eigentliche Fehler ist, dass ele ausserhalb der Schleife deklariert wurde. Das Element darf nur innerhalb der Schleife existieren, da es auch nur dort gebraucht wird. Wie gesagt g\u00e4be es im Normalfall auch keine Debug Ausgabe mit qDebug().<\/p>\n<p>Leider gibt der Compiler in diesem Fall auch kein Warning aus (gcc 4.7 -Wall -Wextra)<\/p>\n<p>Hier der richtige Code. Der Scope von ele wurde verkleinert und der Pointer sofort mit einer g\u00fcltigen Adresse belegt.<\/p>\n<pre>\r\n<code>\r\n    while(iter->hasNext()) {\r\n        Element *ele = iter->next();\r\n       qDebug() << ele;\r\n    }\r\n <\/code>\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Was ist das Problem mit folgenden Code? Element *ele \/\/ uninitialisierter pointer; while(iter->hasNext()) { \/\/ schleife kann auch nicht ausgefuehrt werden ele = iter->next(); ... } qDebug() hasNext()) { Element *ele = iter->next(); qDebug()<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17,12],"class_list":["post-1800","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp","tag-qt"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1800"}],"version-history":[{"count":7,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1800\/revisions"}],"predecessor-version":[{"id":1807,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/1800\/revisions\/1807"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1800"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}