{"id":216083,"date":"2019-03-24T08:05:41","date_gmt":"2019-03-24T07:05:41","guid":{"rendered":"https:\/\/www.borncity.com\/blog\/?p=216083"},"modified":"2022-07-07T11:32:28","modified_gmt":"2022-07-07T09:32:28","slug":"der-quellcode-des-windows-rechners-ein-alptraum","status":"publish","type":"post","link":"https:\/\/borncity.com\/blog\/2019\/03\/24\/der-quellcode-des-windows-rechners-ein-alptraum\/","title":{"rendered":"Der Quellcode des Windows-Rechners, ein Alptraum"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" style=\"float: left; margin: 0px 10px 0px 0px; display: inline\" src=\"https:\/\/borncity.com\/blog\/wp-content\/uploads\/2013\/03\/winb.jpg\" width=\"58\" align=\"left\" height=\"58\"\/>Der Windows-Rechner Calc befindet sich auf Milliarden Rechnern, da er mit Windows ausgeliefert wird. K\u00fcrzlich wurde der Quellcode des Programms als Open Source auf GitHub freigegeben. Ein paar Leute haben sich den Programmcode angesehen, das Teil ist ein Alptraum. Memory Leaks, Inhalt der Zwischenablage geht an Microsoft-Server, Berechnungsfehler und mehr.<\/p>\n<p><!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" alt=\"\" src=\"https:\/\/vg06.met.vgwort.de\/na\/655b49089f444f7fa2a2219c8c6bc83c\" width=\"1\" height=\"1\"\/>Aktuell geht ja eher <a href=\"https:\/\/www.neowin.net\/news\/microsoft-is-adding-a-graphing-mode-to-the-windows-10-calculator\" target=\"_blank\" rel=\"noopener noreferrer\">die Geschichte<\/a>, dass Microsoft eine Grafikfunktionen-Anzeige im Windows 10-Rechner integrieren will, durch die Blogs und Internetmedien. Dabei w\u00e4re es eher wichtig, den Quellcode des Rechners mal zu entr\u00fcmpeln und zu bereinigen. <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/web.archive.org\/web\/20220124083640\/http:\/\/46c4ts1tskv22sdav81j9c69-wpengine.netdna-ssl.com\/wp-content\/uploads\/prod\/sites\/3\/2019\/03\/6a28a934d3ee817a6da19ca1db264340.png\"\/>(Quelle: Microsoft)<\/p>\n<p>Blog-Leser Adrian hat mich auf <a href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/443400\/\" target=\"_blank\" rel=\"noopener noreferrer\">diese Fundstelle<\/a> von PVS-Studio im Web aufmerksam gemacht \u2013 danke da f\u00fcr. Es geht um den Windows-Rechner Calc, der auf allen Windows-Systemen mit an Bord ist. Vor einigen Tagen wurde der Quellcode dieses Programms ja als OpenSource auf Github freigegeben (siehe <a href=\"https:\/\/borncity.com\/blog\/2019\/03\/07\/windows-rechner-als-open-source-auf-github-freigegeben\/\">Windows Rechner als Open Source auf GitHub freigegeben<\/a>). Die Community von PVS-Studio hat sich den Code mal angesehen und <a href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/443400\/\" target=\"_blank\" rel=\"noopener noreferrer\">erstaunliches gefunden<\/a>. <\/p>\n<h2>Zwischenablage geht an Microsoft<\/h2>\n<p>Das folgende Code-Fragment im GitHub-Quellcode des Rechners hat sofort die Aufmerksamkeit der Community auf sich gezogen. <\/p>\n<pre>void TraceLogger::LogInvalidInputPasted(....)\n{\n  if (!GetTraceLoggingProviderEnabled()) return;\n\n  LoggingFields fields{};\n  fields.AddString(L\"Mode\", NavCategory::GetFriendlyName(mode)-&gt;Data());\n  fields.AddString(L\"Reason\", reason);\n  fields.AddString(L\"PastedExpression\", pastedExpression);\n  fields.AddString(L\"ProgrammerNumberBase\", GetProgrammerType(...).c_str());\n  fields.AddString(L\"BitLengthType\", GetProgrammerType(bitLengthType).c_str());\n  LogTelemetryEvent(EVENT_NAME_INVALID_INPUT_PASTED, fields);\n}<\/pre>\n<p>Diese Funktion protokolliert Text aus der Zwischenablage und sendet ihn anscheinend an Microsoft-Server. Dem PVS-Studio-Beitrag entnehme ich, dass der Code weitere 'verd\u00e4chtige' Stellen enth\u00e4lt. Macht schon Laune.<\/p>\n<h2>Weitere Unf\u00e4lle<\/h2>\n<p>Die Leute von PVS-Studio haben den statischen Analysator des Tools PVS-Studio verwendet, um den Quellcode des Rechners zu \u00fcberpr\u00fcfen. Da der Windows-Rechner nicht in Standard-C++ geschrieben ist, gab es Zweifel, ob eine statische Code-Analyse m\u00f6glich sei. Aber die Analyse hat wohl (trotz einiger Fehlalarme) funktioniert. Hier eine kurze \u00dcbersicht zu gefundenen Problemen.<\/p>\n<ul>\n<li>Falscher Zeichenkettenvergleich (<a href=\"https:\/\/www.viva64.com\/en\/w\/v547\/\" target=\"_blank\" rel=\"noopener noreferrer\">V547<\/a>, Calculator LocalizationSettings.h Zeile 180): Ein Ausdruck <em>'m_resolvedName == L\u00aben-US\u00bb' <\/em>innerhalb einer if-Abfrage liefert immer den Wert false.\n<\/li>\n<li>Memory leak im Programmcode (<a href=\"https:\/\/www.viva64.com\/en\/w\/v773\/\" target=\"_blank\" rel=\"noopener noreferrer\">V773<\/a>, CalcViewModel StandardCalculatorViewModel.cpp Zeile 529): Im Modul existiert ein potentielles Speicherleck, denn eine Funktion wird beendet, ohne den Zeiger \"temp\" freizugeben.\n<\/li>\n<li>Schwere Ausnahme (<a href=\"https:\/\/www.viva64.com\/en\/w\/v702\/\" target=\"_blank\" rel=\"noopener noreferrer\">V702<\/a>, CalcManager CalcException.h Zeile 4): Klassen sollten immer von std::exception (und \u00e4hnlichem) als 'public' abgeleitet werden (es wurde kein Schl\u00fcsselwort angegeben, so dass der Compiler es standardm\u00e4\u00dfig auf 'private' setzt).\n<\/li>\n<li>Fehlender Tag in Datumsmodul (<a href=\"https:\/\/www.viva64.com\/en\/w\/v719\/\" target=\"_blank\" rel=\"noopener noreferrer\">V719<\/a>, CalcViewModel DateCalculator.cpp Zeile 279):\n<\/li>\n<li>Die Switch-Anweisung deckt nicht alle Werte der Enum (Auflistung) 'DateUnit' ab.\n<\/li>\n<li>Verd\u00e4chtiger Vergleich von realen Zahlen (<a href=\"https:\/\/www.viva64.com\/en\/w\/v550\/\" target=\"_blank\" rel=\"noopener noreferrer\">V550<\/a>, Calculator AspectRatioTrigger.cpp Zeile 80): Der Code enth\u00e4lt einen merkw\u00fcrdigen Vergleich zweier realer Zahlen (Flie\u00dfkommawerte) der Art ratio == threshold. Es ist wahrscheinlich besser, einen Vergleich mit definierter Genauigkeit zu verwenden: fabs(A \u2014 B) &lt; Epsilon.<\/li>\n<\/ul>\n<p>An dieser Stelle breche ich die Auflistung mal ab. Der <a href=\"https:\/\/habr.com\/en\/company\/pvs-studio\/blog\/443400\/\" target=\"_blank\" rel=\"noopener noreferrer\">Beitrag auf habr.com<\/a> enth\u00e4lt eine ganze Latte weiterer solcher Stilbl\u00fcten im Programmcode. Gut, Fehler k\u00f6nnen immer passieren \u2013 das wei\u00df ich auch \u2013 obwohl meine Zeiten als Entwickler ein Viertel-Jahrhundert vorbei sind. Aber es stellt sich schon die Frage, wie es mit der Code-Qualit\u00e4t aus Redmond bestellt ist. <\/p>\n<h2>Ein paar Gedanken<\/h2>\n<p>Denn der jetzt freigegebene Code ist ja quasi so etwas wie eine Arbeitsprobe, die Redmond vorgelegt hat. Wieso nutzt das Unternehmen nicht selbst solche Tools zur Code-Analyse? Meine Einsch\u00e4tzung: Der Windows-Rechner ist nicht wichtig, da hat niemand Erfahrenes hingesehen. Der Windows-Rechner wurde imho wohl nach dem Erstellen von Generationen von 'Freshmen' bei Microsoft weiter entwickelt, die dann f\u00fcr solche Kalauer im Code sorgten. <\/p>\n<p>Es stellt sich nat\u00fcrlich die Frage, wie es mit dem Code und dessen Qualit\u00e4t in anderen Modulen ausschaut. Ich bin ja nun schon l\u00e4nger im Gesch\u00e4ft und erinnere mich an eine Episode mit einem Script-Debugger, der von Microsoft zur Jahrtausendwende f\u00fcr das Debuggen von WSH-Scripten benutzt werden konnte. Das Teil hatte unendlich viele Macken und ein deutscher Entwickler, der seinerzeit in den USA lebte, wollte den Debugger \u00fcberarbeiten. Ich stand mit ihm per Mail in losem Kontakt, weil ich damals B\u00fccher zu Windows Script Host (auch bei Microsoft Press) ver\u00f6ffentlicht hatte. Der gute Mann hatte Zugriff auf den Quellcode des Microsoft Debuggers \u2013 schrieb aber am Ende des Tages seinen eigenen Debugger von Grund auf neu. Das Ergebnis war der <a href=\"https:\/\/www.sapien.com\/blog\/tag\/debugger\/\" target=\"_blank\" rel=\"noopener noreferrer\">PrimalScript-Debugger<\/a> von SAPIEN. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Windows-Rechner Calc befindet sich auf Milliarden Rechnern, da er mit Windows ausgeliefert wird. K\u00fcrzlich wurde der Quellcode des Programms als Open Source auf GitHub freigegeben. Ein paar Leute haben sich den Programmcode angesehen, das Teil ist ein Alptraum. Memory &hellip; <a href=\"https:\/\/borncity.com\/blog\/2019\/03\/24\/der-quellcode-des-windows-rechners-ein-alptraum\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7459,301],"tags":[3836,4325],"class_list":["post-216083","post","type-post","status-publish","format-standard","hentry","category-software","category-windows","tag-software","tag-windows"],"_links":{"self":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/216083","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/comments?post=216083"}],"version-history":[{"count":0,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/posts\/216083\/revisions"}],"wp:attachment":[{"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/media?parent=216083"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/categories?post=216083"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/borncity.com\/blog\/wp-json\/wp\/v2\/tags?post=216083"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}