{"id":36,"date":"2007-03-02T16:36:45","date_gmt":"2007-03-02T15:36:45","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/03\/02\/der-application-verifier-mein-neuer-freund\/"},"modified":"2007-03-02T16:37:31","modified_gmt":"2007-03-02T15:37:31","slug":"der-application-verifier-mein-neuer-freund","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/03\/02\/der-application-verifier-mein-neuer-freund\/","title":{"rendered":"Der Application Verifier, mein neuer Freund"},"content":{"rendered":"<p>Durch die Vista Zertifizierung habe ich den Application Verifier von Microsoft als neuen guten Freund kennengelernt. Warum? Schauen wir uns mal den nachfolgenden Code an:<\/p>\n<p class=\"ccode\">{<br \/>\n\u00a0 CImageList il;<br \/>\n\u00a0 il.Create(IDB_IMAGELIST,16,0,RGB(255,0,255));<br \/>\n\u00a0 m_lcList1.SetImageList(&amp;il,LVSIL_SMALL);<br \/>\n\u00a0 m_lcList2.SetImageList(&amp;il,LVSIL_SMALL);<br \/>\n\u00a0 il.Detach();<br \/>\n}<\/p>\n<p>Dieser Code ist nat\u00fcrlich fehlerhaft! Allerdings nicht ersichtlich auf den ersten Blick. Er erzeugt korrekt eine Image List. Setzt diese in ein List View 1 und auch in ein List View 2. Sofern LVS_SHAREIMAGELISTS nicht gesetzt wird\u00a0die Image List beim Zerst\u00f6ren des List Views 1 freigegeben. Aber eben auch noch mal wenn List View 2 zerst\u00f6rt wird! Nicht gut.<\/p>\n<p>Oder\u00a0noch ein \u00fcbles Beispiel:<\/p>\n<p class=\"ccode\">{<br \/>\n\u00a0 CImageList il;<br \/>\n\u00a0 il.Create(IDB_IMAGELIST,16,0,RGB(255,0,255));<br \/>\n\u00a0 m_lcList.SetImageList(&amp;il,LVSIL_SMALL);<br \/>\n\u00a0 ImageList_Destroy(il.m_hImageList);<br \/>\n}<\/p>\n<p>Er erzeugt auch korrekt eine Image List. Setzt diese in ein List View und zerst\u00f6rt dann einmal die Image List \u00fcber das Handle und anschlie\u00dfend noch einmal durch den Destruktor von CImageList. Und ein drittes Mal wird die Image List beim zerst\u00f6ren des List Views freigegeben. \u00dcbel \u00fcbel!<\/p>\n<p>Was passiert wenn dieser Code ausgef\u00fchrt wird? Nichts&#8230;<br \/>\nNat\u00fcrlich w\u00fcrde keiner so etwas programmieren \ud83d\ude09 . Aber man kann sich vorstellen, dass so etwas ablauftechnisch und programmiertechnisch schon mal passieren kann.<br \/>\nAlles ist scheinbar in Ordnung, obwohl hier eine Zeitbombe tickt.<\/p>\n<p>Wie kommt man einem solchen Bug auf die Spur?<br \/>\nDer Titel dieses Beitrages gibt die Antwort: Der <strong>Application Verifier<\/strong>.<\/p>\n<p>Man installiert den Verifier und f\u00fcgt die Anwendung zu den Verifier Einstellungen hinzu. Man bel\u00e4sst es bei den\u00a0Default Einstellungen und erg\u00e4nzt am Besten noch unter Miscellaneous die Checkboxen f\u00fcr DangerousAPIs und DirtyStacks.<\/p>\n<p>Sobald man nun den obigen Code im Kontext eines Debuggers ausf\u00fchrt bekommt man eine Exception! Wow&#8230; und wenn man einen entsprechenden Symbolserver hat und den Stacktrace betrachtet sieht man<\/p>\n<p class=\"ccode\">comctl32.dll!CImageListBase::IsValid()+0x2a bytes<br \/>\ncomctl32.dll!_HIMAGELIST_QueryInterface@12()+0x29 bytes<br \/>\ncomctl32.dll!_ImageList_Destroy@4()+0x19 bytes<\/p>\n<p>Das Ausgabefenster des Debuggers zeigt zus\u00e4tzlich:<\/p>\n<p class=\"ccode\">03D8F964 : Invalid address causing the exception.<br \/>\n75C273A8 : Code address executing the invalid access.<br \/>\n0012F08C : Exception record.<br \/>\n0012F0A8 : Context record.<\/p>\n<p>Aus den Informationen kann man sich leicht denken was hier faul ist, oder sein k\u00f6nnte. Es empfiehlz sich die Anwendung auch im Release Mode mit Debug-Infos zu erzeugen. Das sollte sowieso Standard sein!<\/p>\n<p>Es lohnt sich seine Applikation mal mit dem Application Verifier auszuf\u00fchren, wenn man mal gerade nichts zu tun hat und man wundert sich dann, an\u00a0welchen Stellen einem sein &#8211; so gut programmierter oder gut gemeinter &#8211; Code um die Ohren fliegt <img src=\"http:\/\/blog.m-ri.de\/wp-includes\/images\/smilies\/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><\/p>\n<p>F\u00fcr wen Qulit\u00e4tssicherung kein Fremdwort ist, der kommt an diesem sehr n\u00fctzlichen Tool nicht vorbei. Der Application Verifier und weitere brauchbare Infos findet sich hier auf der entsprechenden Produktseite von Microsoft:<br \/>\n<a href=\"http:\/\/www.microsoft.com\/technet\/prodtechnol\/windows\/appcompatibility\/appverifier.mspx\">http:\/\/www.microsoft.com\/technet\/prodtechnol\/windows\/appcompatibility\/appverifier.mspx<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durch die Vista Zertifizierung habe ich den Application Verifier von Microsoft als neuen guten Freund kennengelernt. Warum? Schauen wir uns mal den nachfolgenden Code an: { \u00a0 CImageList il; \u00a0 il.Create(IDB_IMAGELIST,16,0,RGB(255,0,255)); \u00a0 m_lcList1.SetImageList(&amp;il,LVSIL_SMALL); \u00a0 m_lcList2.SetImageList(&amp;il,LVSIL_SMALL); \u00a0 il.Detach(); } Dieser Code ist nat\u00fcrlich fehlerhaft! Allerdings nicht ersichtlich auf den ersten Blick. Er erzeugt korrekt eine Image &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/03\/02\/der-application-verifier-mein-neuer-freund\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eDer Application Verifier, mein neuer Freund\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":[11,3],"tags":[38,361,136,358],"class_list":["post-36","post","type-post","status-publish","format-standard","hentry","category-debugging","category-programmieren","tag-debuggen","tag-ide","tag-qualitaetssicherung","tag-vista"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/36","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=36"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/36\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=36"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=36"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=36"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}