{"id":1071,"date":"2013-12-05T18:33:03","date_gmt":"2013-12-05T17:33:03","guid":{"rendered":"http:\/\/blog.m-ri.de\/?p=1071"},"modified":"2013-12-02T15:35:53","modified_gmt":"2013-12-02T14:35:53","slug":"das-problem-wenn-man-fehler-richtig-erkennt-richtig-dokumentiert-aber-dann-den-gleichen-bloedsinn-wieder-macht","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2013\/12\/05\/das-problem-wenn-man-fehler-richtig-erkennt-richtig-dokumentiert-aber-dann-den-gleichen-bloedsinn-wieder-macht\/","title":{"rendered":"Das Problem, wenn man Fehler richtig erkennt, richtig dokumentiert aber dann den gleichen Bl\u00f6dsinn wieder macht"},"content":{"rendered":"<p>&#8230; oder auch: Es gibt Tage, da k\u00f6nnte man sich in der Tischplatte verbei\u00dfen&#8230;<\/p>\n<p>Wir haben vor ein paar Wochen einen sehr mystischen Fehler in unserer Software gefunden.<br \/>\nDas Problem war eine Funktion, die einen (const) Zeiger auf einen Datenblock bekam.<br \/>\nDie Funktion hat aber unter Umst\u00e4nden eine UI-Interaktion (Dialog) ausgel\u00f6st und die entsprechende offene Nachrichtenschleife hat es wiederum einen Hintergrundthread erlaubt (unter bestimmten Umst\u00e4nden) Nachrichten an den Mainthread zu senden, der wiederum die Anzeige aktualisierte und auch den Datenblock, der eben noch als Zeiger \u00fcbergeben wurde, ung\u00fcltig machte.<\/p>\n<p>Die Funktion sah in etwa so aus:<\/p>\n<pre lang=\"cpp\">bool CSomeClass::SomeAction(const S_FOO *pData)\r\n{\r\n...<\/pre>\n<p>pData war nun ung\u00fcltig und wurde ver\u00e4ndert, war aber immer noch g\u00fcltiger Speicher in dem ein paar Ids aus einer Datenbank standen. Das Programm st\u00fcrzte nicht ab. Tat aber aufgrund der falschen Ids auch nicht das, was es eigentlich sollte.<\/p>\n<p>Der Code wurde dann wie folgt ge\u00e4ndert und ein entsprechender Kommentar geschrieben:<\/p>\n<pre lang=\"cpp\">bool CSomeClass::SomeAction(const S_FOO &amp;data)\r\n{\r\n\/\/ We use a copy of the result object. There is a chance that the\r\n\/\/ global result gets replaced while we are inside this routine and \r\n\/\/ the storage where our pointer points gets deleted and replaced \r\n\/\/ by a new result object.\r\n...<\/pre>\n<p>Oha. Aber was passierte hier. Anstatt wirklich eine Kopie zu verwenden, wurde wieder nur ein Zeiger verwendet. Nur diesmal in Form einer Referenz.<\/p>\n<p>Es wird nun niemanden wundern., dass mir die selbe Fehlebeschreibung wieder auf den Tisch flatterte. Im Debugger\u00a0 wurden die selben Probleme festgestellt und ich musste dreimal auf die Code-Zeile schauen und den Kommentar dreimal lesen, bevor ich verstand was hier ge\u00e4ndert wurde.<\/p>\n<ul>\n<li>Fehler erkannt.<\/li>\n<li>Fehler dokumentiert.<\/li>\n<li>Fehler aber nicht gefixed.<\/li>\n<\/ul>\n<p>So h\u00e4tte es aussehen m\u00fcssen:<\/p>\n<pre lang=\"cpp\">bool CSomeClass::SomeAction(const S_FOO data)\r\n{\r\n...<\/pre>\n<p>PS: Ich oute mich mal. Der Trottel war ich&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; oder auch: Es gibt Tage, da k\u00f6nnte man sich in der Tischplatte verbei\u00dfen&#8230; Wir haben vor ein paar Wochen einen sehr mystischen Fehler in unserer Software gefunden. Das Problem war eine Funktion, die einen (const) Zeiger auf einen Datenblock bekam. Die Funktion hat aber unter Umst\u00e4nden eine UI-Interaktion (Dialog) ausgel\u00f6st und die entsprechende offene &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2013\/12\/05\/das-problem-wenn-man-fehler-richtig-erkennt-richtig-dokumentiert-aber-dann-den-gleichen-bloedsinn-wieder-macht\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDas Problem, wenn man Fehler richtig erkennt, richtig dokumentiert aber dann den gleichen Bl\u00f6dsinn wieder macht\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,11,3],"tags":[370,136],"class_list":["post-1071","post","type-post","status-publish","format-standard","hentry","category-c","category-debugging","category-programmieren","tag-c","tag-qualitaetssicherung"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/1071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=1071"}],"version-history":[{"count":1,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/1071\/revisions"}],"predecessor-version":[{"id":1072,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/1071\/revisions\/1072"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=1071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=1071"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=1071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}