<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>meier-online &#187; Qualitätswerkzeug</title>
	<atom:link href="http://meier-online.com/tag/qualitaetswerkzeug/feed/" rel="self" type="application/rss+xml" />
	<link>http://meier-online.com</link>
	<description>Der Blog von Karsten Meier</description>
	<lastBuildDate>Sun, 09 Oct 2011 13:27:57 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Classics reloaded: Das Assert-Makro von C</title>
		<link>http://meier-online.com/2009/09/assert/</link>
		<comments>http://meier-online.com/2009/09/assert/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 14:41:43 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Assert]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Qualitätswerkzeug]]></category>

		<guid isPermaLink="false">http://meier-online.com/?p=618</guid>
		<description><![CDATA[Die erste Version des folgenden Textes stammt noch aus dem Jahr 1996. Er enstand, weil ich bei den damaligen Arbeitgebern beobachtete, dass viele C-Entwickler nicht wussten, was es mit assert() auf sich hat. Hier kommt die Wiederveröffentlichung: Selbstidentifizierende Fehler Es gibt in ANSI-C einen Mechanismus, viele Fehler auch ohne Debugger aufzuspüren: Das Assert Macro. Ein [...]]]></description>
			<content:encoded><![CDATA[<p>Die erste Version des folgenden Textes stammt noch aus dem Jahr 1996. Er enstand, weil ich bei den damaligen Arbeitgebern beobachtete, dass viele C-Entwickler nicht wussten, was es mit assert() auf sich hat. Hier kommt die Wiederveröffentlichung:</p>
<h3>Selbstidentifizierende Fehler</h3>
<p>Es gibt in ANSI-C einen Mechanismus, viele Fehler auch ohne Debugger aufzuspüren: Das Assert Macro. Ein Teil des Problems liegt in Deutschland wohl auch im Namen: Assert ist ein Wort, welches im allgemeinen im Englisch an der Schule nicht benutzt wird.</p>
<p><span id="more-618"></span>Meine Übersetzung hierfür lautet Zusicherung. Das Assert Macro prüft diese Zusicherung, und druckt, falls es schief geht, seine eigene Datei mit Zeilennummer im Quelltext aus. Ein Beispiel:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> readFile<span style="color: #009900;">&#40;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> filename
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span> buffer
<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> filehandle<span style="color: #339933;">;</span>
    assert<span style="color: #009900;">&#40;</span> filename <span style="color: #339933;">!=</span> NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    assert<span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    assert<span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> MAX_FILENAMELEN<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    filehandle <span style="color: #339933;">=</span> open<span style="color: #009900;">&#40;</span>filename<span style="color: #339933;">,</span> READ_ONLY<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    ...
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Falls jetzt irgend jemand meine Funktion mit falschen Parametern aufruft, z.B. mit einem leeren String, passiert während des Programlaufes folgendes:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">assertion failed in file readfile.c, line 34:
strlen(filename) &gt; 0
program aborted</pre></div></div>

<p>Der Tester, wer immer das ist, kann in der angegebenen Datei die Zeile aufspüren, in der der Fehler auftrat, und erfährt dann, dass die Funktion readFile mit einem Leerstring aufgerufen wurde. Oft hat man damit schon die Fehler gefunden, in den anderen Fällen hat man zumindestens einen Anhaltspunkt.</p>
<p>Frage: <em>Sollte man nicht eine wasserdichte Fehlerbehandlung machen?</em></p>
<p>Welcome to Reality! Die obige Lösung ist ein Einzeiler. In der Praxis bedeutet dieses: Ein assert() schreibt man auch hin, wenn man meint, das ein bestimmter Fall in der Praxis nie und nimmer auftreten wird. Im obigen Beispiel ist der Programmierer der Aufruffunktion dazu verflichtet, der Funktion einen Buffer zur Verfügung zu stellen. Wenn der Buffer bei NULL liegt, hat er Mist gemacht. Bei der Länge des Filenames kommt es auf die Anwendung an: Falls hier ein vom Endbenutzer eingegebener String direkt benutzt wird, ist die assert Lösung allenfalls während der Prototypphase erlaubt.</p>
<p>Die Fehler, von denen man damit rechnet, dass sie während des normalen Betriebes auftreten, sollte man selbstverständlich auch korrekt abfangen.</p>
<p>Das Assert hat auch seinen Sinn, wenn es nicht feuert: Bei einer Fehlersuche kann ich sicher sein, dass ein bestimmtes Problem nicht aufgetreten ist, dass ich den Fehler also woanders suchen muss.</p>
<p>Nicht zuletzt teile ich den armen Leuten, die mein Programm einmal warten müssen, etwas über meine Intention mit: Der Pointer darf kein NULL-Pointer sein, der Dateiname soll weniger als X Buchstaben haben, &#8230; Das alles kann man auch in die Kommentare schreiben, aber nur Code lügt nicht.</p>
<p>Frage: <em>In C++ und Java gibt es doch den Exception Mechanismus.</em></p>
<p>Ja der ist oft noch besser, aber leider auch noch etwas komplizierter. Vieles, was ich gesagt habe, läßt sich auch auf diesen Mechanismus übertragen. Leider kann man sich auch nicht immer aussuchen, in welcher Sprache man programmiert.</p>
<p>Frage: <em>Wenn diese Fehlermeldung dann im laufenden Betrieb beim Kunden auftritt, ist das doch eher peinlich. Und das Programm wird doch bestimmt größer und langsamer? Das heisst doch, nacher muß ich alle asserts() wieder rausnehmen?</em></p>
<p>Zum Glück nicht! Das Assert läßt sich durch einen Compilerschalter aktivieren oder deaktivieren. Wenn in irgendeiner Headerdatei steht:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define NDEBUG</span></pre></div></div>

<p>oder in der Makedatei:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">-DNDEBUG</pre></div></div>

<p>so wird für das Assert kein Code erzeugt, so als ob man alle assert Zeilen rausediert hätte.</p>
<p>Frage: <em>Wie funktioniert das eigentlich?</em></p>
<p>Das Geheimnis liegt im Zusammenspiel von Preprocessor und Compiler. Das Assert ist als Macro implementiert, im allgemeinen in der Datei assert.h. Das Grundgerüst ist folgendes:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifdef NDEBUG</span>
<span style="color: #339933;">#define assert(exp)</span>
<span style="color: #339933;">#else</span>
<span style="color: #339933;">#define assert(exp) \
 ( (exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__))</span>
<span style="color: #339933;">#endif</span></pre></div></div>

<p>Das sieht doch reichlich kryptisch aus, ist jedoch gar nicht so kompliziert: Macros sind Textersetzer. Mittels #ifdef&#8230;#else&#8230;#endif wird dafür gesorgt, das nur Code erzeugt wird, falls das Symbol NDEBUG nicht definiert ist. Dann wird nämlich assert zusammen mit seinen Argument durch einen leeren String ersetzt, der Compiler bekommt die betreffenden Zeilen nicht einmal zu Gesicht. Im Debugfall setzt der Compiler die Wörter __FILE__ und __LINE__ durch die aktuelle Quelldatei (nicht iassert.h, sondern die Datei der Aufrufstelle) und die aktuelle Zeilennummer. Der Ausdruck #exp wird durch den aktuellen Ausdruck als String ersetzt.</p>
<p>Die eigenartige Klammerstruktur (xxx ? yyy : zzz) gehört zum normalen C Sprachumfang, wird jedoch von wohlerzogenen Programmierern nur in Ausnahmefällen wie diesen verwendet. Es ist etwas wie ein verkürztes if-statement. Die Backslashes am Ende der Zeile verlängern die Zeilen, da der Macromechanismus ausschließlich zeilenorientiert arbeitet. Insgesamt erzeugt der Preprozessor aus der Zeile</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">assert<span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>die Zeile</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>filename<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">:</span> _assert<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;strlen(filename &gt; 0&quot;</span><span style="color: #339933;">,</span> __FILE__<span style="color: #339933;">,</span> __LINE__<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Die tief im Inneren einer Library definierte Funktion _assert() gibt die Argumente, z.B. mit printf(), auf den Bildschirm aus und bricht das Programm ab.</p>
<p>Frage: <em>Alles schön und gut, aber ich programmiere mit einem Fenstersystem, manchmal programmiere ich auch Anwendungen ganz ohne Bildschirm. Was nun?</em></p>
<p>Viele Benutzer haben Glück: In einigen Entwicklungsumgebungen gibt es ein assert(), das ein Pop-up-Fenster öffnet. Ansonsten lohnt es sich für solche Fälle, ein assert-Macro selbst zu schreiben.  Das prinzipielle Vorgehen ist dabei, eine Ausgabefunktion zu schreiben, die die betreffende Ausgabe irgendwohin ausgibt, die Datei assert.h zu kopieren und statt des _assert die eigene Ausgabefunktion aufzurufen. Die Ausgabe kann in eine Logdatei, über die Soundschnittstelle, als Email, als Fax, oder als was auch immer erfolgen.</p>
<p>Ähnlich ist auch in anderen Programmiersprachen zu verfahren. Meistens bieten die Hersteller irgendeine Entsprechung zu __FILE__ und __LINE__ an, selbst wenn es nicht im offiziellen Sprachstandard ist.</p>
<p>Frage: <em>Das ist ja toll, was man mit Macros alles machen kann, ich habe da gerade eine Idee &#8230;</em></p>
<p>Vorsicht: Wer Macros einsetzt, nur um ein paar Zeilen Code zu sparen, wird es irgendwann bitter bereuen.</p>
<p>Ich habe mal bei einer Firma ein Macro entdeckt, das dazu dienen sollte, Teile eines Records in einen anderen zu kopieren. Dieses Macro war schon mehrere Jahre bei dieser Firma im Einsatz, leider war es nur manchmal korrekt. Ich habe mit mehreren anderen Entwicklern lange vor dem Macro gesessen, um herausfinden, was es eigentlich tat. Es arbeitete ganz gut. Je nach dem, mit welchem Record man es aufrief, überschrieb es jedoch einen verbotenen Speicherbereich. Das Macro war bestimmt für etliche Abstürze verantwortlich, auch bei ausgelieferten Systemen. Die Firma war übrigens kurze Zeit später pleite &#8230;</p>
<h3>Zurück ins Jahr 2009</h3>
<p>Im Jahr 2009 werden Assert-Methoden oft in Unit-Tests verwendet. Dagegen ist auch nichts einzuwenden. Beim vorliegenden Text ging es mir aber um etwas anderes: die Verwendung von Assert im Programmtext selber. Diese Asserts können auch bei unerwarteten Fehler helfen. Sie sind auch allgemeiner: Sie prüfen Aussagen über das Programm, die immer gelten sollen, nicht nur bei bestimmten Testdaten. Asserts im Programmtext selbst sind deshalb auch bei Nutzung von Unittests nützlich.</p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2009/09/assert/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jad Check auf Googles Servern</title>
		<link>http://meier-online.com/2009/03/jad-check/</link>
		<comments>http://meier-online.com/2009/03/jad-check/#comments</comments>
		<pubDate>Sun, 29 Mar 2009 19:00:00 +0000</pubDate>
		<dc:creator>meier</dc:creator>
				<category><![CDATA[Mobile]]></category>
		<category><![CDATA[AppEngine]]></category>
		<category><![CDATA[Jad]]></category>
		<category><![CDATA[JME]]></category>
		<category><![CDATA[Midlet]]></category>
		<category><![CDATA[OTA]]></category>
		<category><![CDATA[Qualitätswerkzeug]]></category>

		<guid isPermaLink="false">http://meier-online.com/blog/?p=5</guid>
		<description><![CDATA[Der Jad-Check ist ein Qualitätsicherungswerkzeug für Anbieter von Java-Handysoftware. (J2ME- bzw. JME-Midlets) Er prüft die sogenannte Jad-Datei auf häufig auftretende Fehler. Einige dieser Fehler sind sonst sehr schwer zu finden, sodass man Zeit bei der Fehlersuche spart. Andere Fehler führen nur auf wenigen Handys bei der Installation von Midlets zu Problemen. Nach Murphy Law sind [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://jadcheck.appspot.com"><img class="alignright size-full wp-image-340" title="Der Jad Check Online Dienst" src="http://meier-online.com/blog/uploads/jadchecklogo120x48.png" alt="jadchecklogo120x48" width="120" height="48" /></a>Der Jad-Check ist ein Qualitätsicherungswerkzeug für Anbieter von Java-Handysoftware. (J2ME- bzw. JME-Midlets)<!--88462815--><br />
Er prüft die sogenannte Jad-Datei auf häufig auftretende Fehler. Einige dieser Fehler sind sonst sehr schwer zu finden, sodass man Zeit bei der Fehlersuche spart. Andere Fehler führen nur auf wenigen Handys bei der Installation von Midlets zu Problemen. Nach Murphy Law sind dies typischerweise die von wichtigen Kunden. Als Anbieter kann man sich durch den Test also Ärger sparen und die Kundenzufriedenheit steigern.<span id="more-5"></span></p>
<p>Die Notwendigkeit für so einen Test habe ich schon vor drei Jahren erkannt. Mein damaliger Webhoster hat nach einem Serverupdate vergessen den Mimetyp zu konfigurieren :-( . Solche Fehler wollte ich in Zukunft schnell finden. So habe ich zunächst ein Kommandozeilenwerkzeug geschrieben. Da war ich der Zeit wohl voraus, selbst Online-Shops für Handysoftware haben sich unnötige Fehler in der JAD-Erzeugung geleistet. Schließlich kam ich auf die Idee, eine Onlineversion zu veröffentlichen und so auch Werbung für meine Kompetenz zu machen.</p>
<p>Der Jad Checker ist zugleich mein Projekt, um Googles App Engine einen Praxistest zu unterziehen. Seit August 2008 ist der Dienst online und wurde in den Entwicklerprogrammen von Nokia, SonyEricsson, Sun und Vodafone vorgestellt. Ein Mitarbeiter des Nokia-Entwicklerprogramms gab als Kommentar &#8220;Cool&#8221;. Wahrscheinlich hat er schon mit vielen dieser JAD-Problemen zu tun gehabt.</p>
<p>Bisher bin ich mit der AppEngine zufrieden. Die Entwicklung ging zügig, die Anwendung läuft rund, und es gab noch keine negativen Rückmeldungen. Den Onlinedienst finden Sie hier: <a title="jad check zur Prüfung von Jad-Dateien" href="http://jadcheck.appspot.com/">jadcheck.appspot.com </a></p>
]]></content:encoded>
			<wfw:commentRss>http://meier-online.com/2009/03/jad-check/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

