<?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>Martin&#039;s Blog &#187; C++</title>
	<atom:link href="http://blog.m-ri.de/index.php/category/programmieren/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.m-ri.de</link>
	<description>Gesammeltes aus dem Leben eines &#34;normalen&#34; Programmierers... :-)</description>
	<lastBuildDate>Sat, 04 Feb 2012 12:07:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Manchmal der letzte Retter in der Not: VA-X und die interne Historie</title>
		<link>http://blog.m-ri.de/index.php/2012/01/27/manchmal-der-letzte-retter-in-der-not-va-x-und-die-interne-historie/</link>
		<comments>http://blog.m-ri.de/index.php/2012/01/27/manchmal-der-letzte-retter-in-der-not-va-x-und-die-interne-historie/#comments</comments>
		<pubDate>Fri, 27 Jan 2012 19:17:56 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VA-X]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=934</guid>
		<description><![CDATA[So geht es manchmal: Da arbeitet man 4, 8, 12 oder 16 Stunden an einem Modul. Alles sieht gut aus, nicht mehr lange und wir können einchecken. Du änderst noch dies und das, steckst noch mal 2 Stunden Arbeit rein weil noch was optimiert werden soll und auf einmal merkst Du dass Du Dich verrannt hast. [...]]]></description>
			<content:encoded><![CDATA[<p>So geht es manchmal:</p>
<ul>
<li>Da arbeitet man 4, 8, 12 oder 16 Stunden an einem Modul.</li>
<li>Alles sieht gut aus, nicht mehr lange und wir können einchecken.</li>
<li>Du änderst noch dies und das, steckst noch mal 2 Stunden Arbeit rein weil noch was optimiert werden soll und auf einmal merkst Du dass Du Dich verrannt hast. Die letzten 2 Stunden Arbeit hattest Du irgendwie das Gehirn nicht eingeschaltet, x-Änderungen gemacht, die nun alle Sch&#8230;sind.</li>
<li>Undo ist nicht mehr, weil Du schon andere Projekte offen hattest bzw. einmal VS abgeraucht ist.</li>
<li>Du hast Bockmist gebaut und jetzt willst Du auf den Stand von vor 4 Stunden zurück, oder den von gestern Abend.</li>
<li>Ein Shelveset hast Du im TFS nicht angelegt. Das machst Du nur wenn Du ins Wochenende gehst, oder Deinen Kollegen was weiterreichen musst.</li>
</ul>
<p>Was nun? <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_surprised.gif' alt=':eek:' class='wp-smiley' /> </p>
<p>Als <em><strong>VA-X </strong></em>Benutzer (VisualAssist X <a href="http://www.wholetomato.com">http://www.wholetomato.com</a>) hat man tatsächlich noch ein Backup!<br />
Und zwar nicht nur eines, sondern ein paar.<br />
In meinem History Ordner von VA-X<br />
<em>C:\Users\USER\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Whole Tomato Software\Visual Assist X\VERSION\Data\vs10\history\</em><br />
werde ich fündig&#8230;</p>
<p><a href="http://blog.m-ri.de/wp-content/uploads/2012/01/vax-history.png"><img class="wp-image-937 alignnone" title="vax-history" src="http://blog.m-ri.de/wp-content/uploads/2012/01/vax-history.png" alt="" width="584" height="187" /></a></p>
<p>Ufff&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_mrgreen.gif' alt=':mrgreen:' class='wp-smiley' /> </p>
<p>Ich habe dieses Backup mittlerweile schon so oft verwendet, dass ich dazu übergangen bin diesen Ordner umzulegen an eine Stelle an die ich schneller dran komme. Das geht über den Registry Schlüssel <em>HKCU\Software\Whole Tomato\UserDataDir</em>.</p>
<p>Wer mehr dazu wissen will findet hier weitere Infos:<br />
<a href="http://www.wholetomato.com/forum/topic.asp?TOPIC_ID=6865">http://www.wholetomato.com/forum/topic.asp?TOPIC_ID=6865</a></p>
<p><strong>Nachtrag (30.01.2012):</strong><br />
Damit diese Funktion auch verfügbar ist muss im <em>VA-X</em> die <em>Auto Recovery</em> Option eingeschaltet sein.<br />
<em>VA-X -&gt; Options -&gt; Performance -&gt; Enable Auto Recovery</em></p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2012/01/27/manchmal-der-letzte-retter-in-der-not-va-x-und-die-interne-historie/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>4 Termine für Microsoft C++ Infoday 2012</title>
		<link>http://blog.m-ri.de/index.php/2012/01/12/4-termine-fur-microsoft-c-infoday-2012/</link>
		<comments>http://blog.m-ri.de/index.php/2012/01/12/4-termine-fur-microsoft-c-infoday-2012/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 16:56:27 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=932</guid>
		<description><![CDATA[Wer letztes Jahr im Oktober keine Zeit hatte zum C++ Info Day nach München zu kommen, kann dies nun nachholen. In etwa ähnliche Themen werden an vier verschiedenen Terminen und Standorten von Microsoft kostenlos angeboten: Die Themen: C++ 11: Modernes C++ im 21. Jahrhundert Parallel-Power in Visual Studio 11: Konzepte und Tools Application Lifecycle Management für [...]]]></description>
			<content:encoded><![CDATA[<p>Wer letztes Jahr im Oktober keine Zeit hatte zum <em>C++ Info Day</em> nach München zu kommen, kann dies nun nachholen.</p>
<p>In etwa ähnliche Themen werden an vier verschiedenen Terminen und Standorten von Microsoft kostenlos angeboten:</p>
<p><strong>Die Themen:</strong></p>
<ul>
<li><strong><em>C++ 11: Modernes C++ im 21. Jahrhundert</em></strong></li>
<li><strong><em>Parallel-Power in Visual Studio 11: Konzepte und Tools</em></strong></li>
<li><strong><em>Application Lifecycle Management für C++: Die nächste Generation</em></strong></li>
</ul>
<p><strong>Die Termine:</strong></p>
<ul>
<li><strong><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032502632&amp;Culture=de-DE">02.02.2012 14:00-18:00 Berlin</a></strong></li>
<li><strong><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032502635&amp;Culture=de-DE">07.02.2012 14:00-18:00 Bad Homburg</a></strong></li>
<li><strong><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032502637&amp;Culture=de-DE">13.02.2012 14:00-18:00 Karlsruhe</a></strong></li>
<li><strong><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032502646&amp;Culture=de-DE">05.03.2012 14:00-18:00 Köln</a></strong></li>
</ul>
<p>Ich werde 07.02. in Bad Homburg vor Ort sein um ein wenig Networking zu betreiben.<br />
Da es aktuell eigentlich keine C/C++ Community im Netz gibt sehe ich hier die einzige wirklich gute Möglichkeit mit anderen C/C++ Entwicklern ins Gespräch zu kommen.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2012/01/12/4-termine-fur-microsoft-c-infoday-2012/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Tücke mit temporären Objekten und Konvertierungs-Operatoren</title>
		<link>http://blog.m-ri.de/index.php/2011/12/05/die-tucke-mit-temporaren-objekten-und-konvertierungs-operatoren/</link>
		<comments>http://blog.m-ri.de/index.php/2011/12/05/die-tucke-mit-temporaren-objekten-und-konvertierungs-operatoren/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 21:52:42 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=596</guid>
		<description><![CDATA[Wieder mal ein Beispiel für einen versteckten Bug. Nachfolgender Code sieht ganz unscheinbar aus, aber er birgt eine Falle mit sich, die in der Implementierung der Klasse verborgen ist: void CImageButton::OnSysColorChange&#40;&#41; &#123; // Farbe hat geändert CButton::OnSysColorChange&#40;&#41;; // Bitmap neu laden LoadBitmap&#40;m_strResource.IsEmpty&#40;&#41; ? m_lpszResource : m_strResource&#41;; &#125; LoadBitmap ist eine Funktion, die die Bitmap neu [...]]]></description>
			<content:encoded><![CDATA[<p>Wieder mal ein Beispiel für einen versteckten Bug.<br />
Nachfolgender Code sieht ganz unscheinbar aus, aber er birgt eine Falle mit sich, die in der Implementierung der Klasse verborgen ist:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> CImageButton<span style="color: #008080;">::</span><span style="color: #007788;">OnSysColorChange</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   <span style="color: #666666;">// Farbe hat geändert</span>
   CButton<span style="color: #008080;">::</span><span style="color: #007788;">OnSysColorChange</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #666666;">// Bitmap neu laden</span>
   LoadBitmap<span style="color: #008000;">&#40;</span>m_strResource.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> m_lpszResource <span style="color: #008080;">:</span> m_strResource<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p><em>LoadBitmap</em> ist eine Funktion, die die Bitmap neu lädt und entsprechend der eingestellten Systemfarben einige Farben aktualisiet. Also das bekannte Verhalten von Toolbars. <em>LoadBitmap</em> nimmt einen LPCTSTR und damit kann die <em>CImageButton</em> Klasse entweder mit einem Ressource String arbeiten (der evtl. mit MAKEINTRESOURCE eine ID ist und kein echter Zeiger), oder eben einem Namen zu einer Bitmap Ressource.</p>
<p>Damit bei einem Wechsel der Systemfarben, die Bitmap neu laden werden kann, merkt es sich die Resource.  In der Funktion findet hier eine Konvertierung des alten <em>CString</em> Wertes in einen <em>LPCTSTR</em> statt, mit dem eingebauten Konvertierungs-Operator.</p>
<p>Das Problem in der Implentierung dieser Klasse war aber, dass <em>LoadBitmap</em> sich den neuen Ressourcennamen merken soll aber zuvor eine interne <em>Clear</em> Funktion aufruft, die die bestehende Bitmap und andere Klassendaten freigibt, bevor <em>m_strResource</em> oder <em>m_lpszResource</em>, neu gesetzt werden:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> CImageButton<span style="color: #008080;">::</span><span style="color: #007788;">Clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  ...
  <span style="color: #666666;">// Clear old infos</span>
  m_lpszResource <span style="color: #000080;">=</span> <span style="color: #0000ff;">NULL</span><span style="color: #008080;">;</span>
  m_strResource.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  ...
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> CImageButton<span style="color: #008080;">::</span><span style="color: #007788;">LoadBitmap</span><span style="color: #008000;">&#40;</span>LPCTSTR pszResource<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   Clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
...
   <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>ISINTRESOURCE<span style="color: #008000;">&#40;</span>pszResource<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
...
   <span style="color: #0000ff;">else</span>
   <span style="color: #008000;">&#123;</span>
       m_strResource <span style="color: #000080;">=</span> pszResource<span style="color: #008080;">;</span>
...
   <span style="color: #008000;">&#125;</span>
...
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Das führt aber nun zu folgendem Problem: <em>Clear</em> löscht <em>m_strResource</em> und damit wird der übergebene Zeiger an <em>LoadBitmap</em> ungültig, mit der Folge, dass die ürsprüngliche Bitmap nicht mehr gefunden wird, wenn in der Zwischenzeit der Heap auf dem dieser String lag neu verwendet wurde. In der Release Version trat dieser Fehler selten auf. In der Debug Version war der Fehler sofort nachvollziehbar, denn hier wird der Heap bei der Freigabe auf einen einhaltlichen Wert zurückgesetzt.</p>
<p>Die Lösung ist einfach: Es ist nötig den alten Inhalt zu kopieren um einen gültigen Zeiger zu behalten.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> CImageButton<span style="color: #008080;">::</span><span style="color: #007788;">OnSysColorChange</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// System colors changed</span>
  CButton<span style="color: #008080;">::</span><span style="color: #007788;">OnSysColorChange</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #666666;">// We need to protect the resource name, because LoadItem calls</span>
  <span style="color: #666666;">// Clear and this might empty m_sResource. And this causes</span>
  <span style="color: #666666;">// the string object on the stack to get deleted and the pointer</span>
  <span style="color: #666666;">// points into nowhere land. So we use a copy of the string here.</span>
  CString strRessource<span style="color: #008000;">&#40;</span>m_strResource<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  LoadBitmap<span style="color: #008000;">&#40;</span>strRessource.<span style="color: #007788;">IsEmpty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">?</span> m_lpszResource <span style="color: #008080;">:</span> strRessource<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/12/05/die-tucke-mit-temporaren-objekten-und-konvertierungs-operatoren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Münchner C++ Day zu Visual Studio 2011 am 19.10.2011 mit Sprechern von Microsoft und Intel (kostenlos)</title>
		<link>http://blog.m-ri.de/index.php/2011/09/14/munchner-c-day-zu-visual-studio-2011-am-19-10-2011-mit-sprechern-von-microsoft-und-intel-kostenlos/</link>
		<comments>http://blog.m-ri.de/index.php/2011/09/14/munchner-c-day-zu-visual-studio-2011-am-19-10-2011-mit-sprechern-von-microsoft-und-intel-kostenlos/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 16:50:26 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[VS-2011]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=898</guid>
		<description><![CDATA[Der C++ Day wird kostenlos von Microsoft am 19.10.2011 veranstaltet. Das Ganze ist eine Nachmittagsveranstaltung mit 4 Sessions von 13:00 bis 18:00 Uhr. Veranstaltungsort ist das MACE Restaurant in München. Die Themen werden sein: Keynote: Visual Studio 11 and Windows – Powering the Next Wave of Innovation Effective C++ Programming with Visual Studio 11 Ultimate Unleash Parallel Performance with C++ in [...]]]></description>
			<content:encoded><![CDATA[<p>Der C++ Day wird kostenlos von <em>Microsoft</em> am 19.10.2011 veranstaltet.<br />
Das Ganze ist eine Nachmittagsveranstaltung mit 4 Sessions von 13:00 bis 18:00 Uhr.</p>
<p>Veranstaltungsort ist das <a href="http://www.mace-restaurant.de/kontakt">MACE Restaurant</a> in München.</p>
<p><strong>Die Themen werden sein:</strong></p>
<ul>
<li><strong>Keynote: Visual Studio 11 and Windows – Powering the Next Wave of Innovation</strong></li>
<li><strong>Effective C++ Programming with Visual Studio 11 Ultimate</strong></li>
<li><strong>Unleash Parallel Performance with C++ in Visual Studio 11 </strong></li>
<li><strong>Graphics &amp; Game development tools in Visual Studio 11</strong></li>
</ul>
<p>&nbsp;</p>
<p><strong>Sprecher sind:</strong></p>
<ul>
<li><strong>Bev Bachmayer </strong>- Senior Software Engineer Software and Solutions Group, Intel GmbH</li>
<li><strong>Jean-Pierre Duplessis </strong>- Architect, Microsoft Visual Studio, Microsoft Corporation</li>
<li><strong>Boris Jabes </strong>- Senior Program Manager, Visual C++ Team, Microsoft Corporation</li>
</ul>
<p>&nbsp;</p>
<p><strong>Achtung: Es gibt nur eine begrenzte Anzahl von 50 Plätzen.</strong></p>
<p>Hier der Link zur Veranstaltung und zum Anmelden:<br />
<a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032493900&amp;Culture=de-DE">https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032493900&amp;Culture=de-DE</a></p>
<p>PS: Ich abe mich soeben angemeldet <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/09/14/munchner-c-day-zu-visual-studio-2011-am-19-10-2011-mit-sprechern-von-microsoft-und-intel-kostenlos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OemToCharBuffW macht nicht das gleiche wie OemToCharBuffA und anschließender Umwandlung nach Unicode</title>
		<link>http://blog.m-ri.de/index.php/2011/08/22/oemtocharbuffw-macht-nicht-das-gleiche-wie-oemtocharbuffa-und-anschliesender-umwandlung-nach-unicode/</link>
		<comments>http://blog.m-ri.de/index.php/2011/08/22/oemtocharbuffw-macht-nicht-das-gleiche-wie-oemtocharbuffa-und-anschliesender-umwandlung-nach-unicode/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 17:20:13 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[WinAPI]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=892</guid>
		<description><![CDATA[Ein Stück Code in unserer Software behandelt Datenimport aus fremden Dateien. Nicht wenige alter DOS Programme erzeugen ja Daten im &#8220;OEM&#8221;-Zeichensatz (DBase etc.). Wir haben in der Vergangenheit immer streng die T-Notation verwendet und eigentlich sollte dies einen vor vielen Überraschungen bewahren. Aber Pustekuchen. Folgender Code sollte Daten aus einem OEM-Stream in einen CString umwandeln [...]]]></description>
			<content:encoded><![CDATA[<p>Ein Stück Code in unserer Software behandelt Datenimport aus fremden Dateien. Nicht wenige alter DOS Programme erzeugen ja Daten im &#8220;OEM&#8221;-Zeichensatz (DBase etc.).<br />
Wir haben in der Vergangenheit immer streng die T-Notation verwendet und eigentlich sollte dies einen vor vielen Überraschungen bewahren. Aber Pustekuchen.</p>
<p>Folgender Code sollte Daten aus einem OEM-Stream in einen <em>CString</em> umwandeln und eigentlich bin ich davon ausgegangen, dass das Ergebnis für Tabulatoren (&#8216;\t&#8217;) und Zeilenschaltungen (&#8220;\r\n&#8221;) ergebnisneutral ist. D.h. in anderen Worten ich erwartete in dem String genauso viele Tabulatoren und Zeilenschaltungen vor wie nach der Konvertierung.<br />
Die Umwandlung erfolgte mit solch einem Stück Code:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">CString strText<span style="color: #008080;">;</span>
<span style="color: #008080;">::</span><span style="color: #007788;">OemToCharBuff</span><span style="color: #008000;">&#40;</span>szText,CStrBuf<span style="color: #008000;">&#40;</span>srText,len<span style="color: #008000;">&#41;</span>,len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Sieht eigentlich harmlos aus. Allerdings musste ich feststellen, dass hier <em>OemToCharBuffA</em> und <em>OemToCharBuffW</em> ganz und gar nicht korrespondierende Ergebnisse liefern.<br />
In der Unicode Version, also in der Version die <em>OemToCharBuffW</em> verwendet, wurden Tabulatoren zu <em>0x25cb L&#8217;○&#8217; wchar_t </em> und Zeilenschaltungen zu <em>0x266a L&#8217;♪&#8217; wchar_t </em>und <em>0x25d9 L&#8217;◙&#8217; wchar_t!</em></p>
<p>Führt man jedoch zuerst eine Kovertierung in den &#8220;ANSI/Windows/8bit&#8221;-Zeichensatz durch und konvertiert anschließenend diesen ANSI-String nach Unicode, dann ist alles gut und so wie man es erwartet.</p>
<p>Wer Lust hat das nachzubauen kann das mit dem folgenden Code. Wichtig sind eigentlich nicht die OEM-Umlaute sondern nur die Tab- und Zeilenschaltungen:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> szText<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #FF0000;">&quot;Dies ist ein OEM TestString<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
       <span style="color: #FF0000;">&quot;mit Zeilenschaltungen<span style="color: #000099; font-weight: bold;">\t</span>und Tabs<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
       <span style="color: #FF0000;">&quot;und Umlauten:<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
       <span style="color: #FF0000;">&quot;Ž=AE, ™=OE, š=šE<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
       <span style="color: #FF0000;">&quot;„=ae, ”=oe, =ue, á=ss&quot;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">size_t</span> len <span style="color: #000080;">=</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>szText<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
CStringW strOut1<span style="color: #008080;">;</span>
<span style="color: #008080;">::</span><span style="color: #007788;">OemToCharBuffW</span><span style="color: #008000;">&#40;</span>szText,CStrBufW<span style="color: #008000;">&#40;</span>strOut1,len<span style="color: #008000;">&#41;</span>,len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
CStringA strOut2<span style="color: #008080;">;</span>
<span style="color: #008080;">::</span><span style="color: #007788;">OemToCharBuffA</span><span style="color: #008000;">&#40;</span>szText,CStrBufA<span style="color: #008000;">&#40;</span>strOut2,len<span style="color: #008000;">&#41;</span>,len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
CStringW strOut3<span style="color: #008000;">&#40;</span>strOut2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
_ASSERT<span style="color: #008000;">&#40;</span>strOut1.<span style="color: #007788;">Compare</span><span style="color: #008000;">&#40;</span>strOut3<span style="color: #008000;">&#41;</span><span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Das sollte eigentlich gleich sein</span></pre></div></div>

<p lang="cpp">PS: Getestet habe ich das auf einem <em>Windows 7</em> 64bit und 32bit OS.</p>
<p lang="cpp">Siehe folgende Links zu den Begriffen OEM/ANSI:<br />
<a href="http://blogs.msdn.com/b/oldnewthing/archive/2005/10/27/485595.aspx">http://blogs.msdn.com/b/oldnewthing/archive/2005/10/27/485595.aspx<br />
</a><a href="http://blogs.msdn.com/b/oldnewthing/archive/2005/03/08/389527.aspx">http://blogs.msdn.com/b/oldnewthing/archive/2005/03/08/389527.aspx</a></p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/08/22/oemtocharbuffw-macht-nicht-das-gleiche-wie-oemtocharbuffa-und-anschliesender-umwandlung-nach-unicode/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nun haben wir auch offiziell einen neuen Standard mit C++11 (vormals C++0x)</title>
		<link>http://blog.m-ri.de/index.php/2011/08/18/nun-haben-wir-auch-offiziell-einen-neuen-standard-mit-c11-vormals-c0x/</link>
		<comments>http://blog.m-ri.de/index.php/2011/08/18/nun-haben-wir-auch-offiziell-einen-neuen-standard-mit-c11-vormals-c0x/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 15:02:28 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[C++11]]></category>
		<category><![CDATA[Stabdard]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=889</guid>
		<description><![CDATA[Es ist fast an mir vorbeigegangen: http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/ Damit sind große Teile der Werkzeuge mit denen wir schon seit VS-2008 SP1 arbeiten standardisiert&#8230; Aber ob wir uns an den Namen C++11 gewöhnen werden wage ich zu bezweifeln. Herb Sutter kann/will es anscheinend nicht. Copyright &#169; 2010 Martin RichterDieser Feed ist nur für den persönlichen, nicht gewerblichen [...]]]></description>
			<content:encoded><![CDATA[<p>Es ist fast an mir vorbeigegangen:</p>
<p><a href="http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/" target="_blank">http://herbsutter.com/2011/08/12/we-have-an-international-standard-c0x-is-unanimously-approved/</a></p>
<p>Damit sind große Teile der Werkzeuge mit denen wir schon seit VS-2008 SP1 arbeiten standardisiert&#8230; <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Aber ob wir uns an den Namen C++11 gewöhnen werden wage ich zu bezweifeln. Herb Sutter kann/will es anscheinend nicht.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/08/18/nun-haben-wir-auch-offiziell-einen-neuen-standard-mit-c11-vormals-c0x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Änderungen in den VC-Libraries des Sicherheitsupdates vom 09.08.2011</title>
		<link>http://blog.m-ri.de/index.php/2011/08/12/anderungen-in-den-vc-libraries-des-sicherheitsupdates-vom-09-08-2011/</link>
		<comments>http://blog.m-ri.de/index.php/2011/08/12/anderungen-in-den-vc-libraries-des-sicherheitsupdates-vom-09-08-2011/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 18:49:30 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[SP1]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=887</guid>
		<description><![CDATA[Eigentlich kann man es kein Sicherheitsupdate nennen. Ich sehe  eigentlich nur eine sicherheitsrelevante Änderung in: atltransactionmanager.h (ATL) Hier wird das Laden der ktmw32.dll jetzt mit einer neuen Funktion AtlLoadSystemLibraryUsingFullPath durchgeführt, die in atlcore.h hinzugefügt wird. Diese Funktion lädt eine DLL nur aus dem Windows-System Verzeichnis. Damit wird Binary-Planting verhindert, aber dies betrifft eigentlich nur Windows [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich kann man es kein Sicherheitsupdate nennen. Ich sehe  eigentlich nur eine sicherheitsrelevante Änderung in:</p>
<ul>
<li><strong>atltransactionmanager.h (ATL)</strong><br />
Hier wird das Laden der ktmw32.dll jetzt mit einer neuen Funktion <em>AtlLoadSystemLibraryUsingFullPath</em> durchgeführt, die in <strong><em>atlcore.h</em></strong> hinzugefügt wird. Diese Funktion lädt eine DLL nur aus dem Windows-System Verzeichnis. Damit wird Binary-Planting verhindert, aber dies betrifft eigentlich nur <del><em>Windows Vista / 7 / 2008</em></del> <span style="text-decoration: underline;">Windows 2003 und Windows XP</span> <em>(Nachtrag am 18.08. siehe dazu Kommentar von Stefan Kuhr)</em> und diejenigen die den <em>Kernel Transaction Manager</em> mit der <em>ATL</em> nutzen.</li>
</ul>
<p>Bugfixes habe ich folgende gefunden:</p>
<ul>
<li><strong>afxtoolbarimages.cpp (MFC)</strong><br />
In <em>CPngImage::LoadFromBuffer</em> wurde bei der Verwendung dieser Funktion in Speicherblock eines Streams nicht freigegeben (falsche Nutzung von <em>CreateStreamOnHGlobal</em>).</li>
<li><strong>dbcore (MFC / ODBC)</strong><br />
In <em>CRecordset::BuildUpdateSQL</em> in der ODBC Implementierung, wird bei Abfrage eines Cursornamens ein Puffer von 18 Zeichen Länge verwendet (<em>MAX_CURSOR_NAME</em>). Ist der Cursorname länger so wurde eine Exception geworfen. Jetzt wird erkannt, dass der Buffer zu klein ist und es wird ein dynamischer Buffer mit ausreichender Größe alloziert und der Name dann abgefragt.</li>
<li> <strong>xutility (STL und auch CRT)</strong><br />
In der Basisklasse der Iteratoren wurde eine Änderung gemacht. Scheinbar hat die Zuweisung eines &#8220;leeren/nicht initialisierten&#8221; Iterators bisher einen Iterator gar nicht verändert. Der alte Iterator wurde nicht aufgelöst durch <em>_Orphan_me</em>. Dies bringt dann Probleme mit sich wenn der <em>_ITERATOR_DEBUG_LEVEL</em> mit 2 genutzt wird.<br />
Da dieser STL Code auch komplett in der CRT verwendet wird, hat dies auch Einfluß auf die CRT.<br />
Auf die Release Version aber hat diese Code-Änderung jedoch keinen Einfluss, soweit ich das erkennen kann.</li>
</ul>
<p>Es gibt noch einige andere Dateien, die geändert wurde, aber hier haben sich nur unwichtige Kommentare geändert.</p>
<p>Fazit: Alles in allem ein Sicherheitspatch, der eher Bugfixes enthält, aber selbst die sind nicht sonderlich weitreichend. Und der Nutzerbereich, der mit der <em>ATL</em> den <em>Kernel Transaction Manager</em> nutzt, wird wohl eher klein sein&#8230;</p>
<p>PS: Die Dateien dieses Sicherheitspatches haben die Version 10.0.40219.325.<br />
Die Dateien aus dem VS-2010 SP1 haben die Versionsnummer 10.0.30319.1.</p>
<p><strong>Nachtrag 01.12.2011, MSDN Links:</strong><br />
Sicherheits Bullentin:   <a href="http://www.microsoft.com/technet/security/bulletin/MS11-025.mspx">MS11-025</a><br />
Knowledge Base-Artikel (KB-Artikel):  <a href="http://support.microsoft.com/?kbid=2565057">KB2565057</a></p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/08/12/anderungen-in-den-vc-libraries-des-sicherheitsupdates-vom-09-08-2011/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>LNK2001: unresolved external symbol _mainCRTStartup</title>
		<link>http://blog.m-ri.de/index.php/2011/07/28/lnk2001-unresolved-external-symbol-_maincrtstartup/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/28/lnk2001-unresolved-external-symbol-_maincrtstartup/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 18:53:35 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Anfänger]]></category>
		<category><![CDATA[VC-2010]]></category>
		<category><![CDATA[VC-Express]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=882</guid>
		<description><![CDATA[Ich habe einige Zeit gebraucht um herauszufinden warum ein Benutzer von VC-Express die folgende Meldung bekam: 1&#62;------ Build started: Project: Hallo Welt, Configuration: Debug Win32 ------ 1&#62;LINK : error LNK2001: unresolved external symbol _mainCRTStartup 1&#62;Hallo Welt.exe : fatal error LNK1120: 1 unresolved externals ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== Der [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe einige Zeit gebraucht um herauszufinden warum ein Benutzer von VC-Express die folgende Meldung bekam:</p>
<pre>1&gt;------ Build started: Project: Hallo Welt, Configuration: Debug Win32 ------
1&gt;LINK : error LNK2001: unresolved external symbol _mainCRTStartup
1&gt;Hallo Welt.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========</pre>
<p>Der User war ein Anfänger und hat ein leeres Win32 Projekt erzeugt. Anschließend eine Sourcedatei und hat das typische &#8220;Hello World&#8221; Programm schreiben wollen.<br />
Das Problem war aber, dass er zwar die Sourcedatei angelegt hat, diese aber nicht in das erzeugte Projekt eingefügt hat.<br />
Sobald man über die erzeugte Sourcedatei über den Menüpunkt <em>File -&gt; Move file Hello World.cpp into -&gt; Hello World </em> in das Projekt einfügt, klappt alles wie erwartet.<br />
Man kann die Datei natürlich auch über das Kontexmenü im Projekt hinzufügen, oder per Drag &amp; Drop auf den Solution Explorer ziehen.</p>
<p>Und eigentlich ist die Meldung auch klar, für den der sie versteht. Der Linker läuft an, findet keine Objektdateien. Entsprechend werden auch keine <em>CRT</em> Libraries einbezogen und geladen. Aber der Linker will gemäß den Einstellungen einen entsprechenden Einsprungpunkt für die CRT finden und wirft die obige Fehlermeldung aus.</p>
<p>Ich muss ehrlich sagen, dass mir die Fehlermeldung erst etwas gesagt hat, als ich per Email, das Beispielprojekt zugesendet bekam.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/28/lnk2001-unresolved-external-symbol-_maincrtstartup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Auflösung des GetBuffer und GetAllocLength Rästels</title>
		<link>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/#comments</comments>
		<pubDate>Sat, 23 Jul 2011 16:16:09 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=880</guid>
		<description><![CDATA[Dann will ich mal das Problem lüften, dass sich mit diesem Code ergibt, dein ich meinem letzten Artikel vorgestellt habe: template &#60;class T&#62; void SecureClearString&#40;T &#38;strText&#41; &#123; ::SecureZeroMemory&#40;strText.GetBuffer&#40;0&#41;,strText.GetAllocLength&#40;&#41;&#41;; strText.Empty&#40;&#41;; &#125; Zuerst einmal liegt es nicht daran, dass es hier Template verwendet wurde. Ein Template wurde verwendet, weil in dem Code nicht nur CString, sondern implizit [...]]]></description>
			<content:encoded><![CDATA[<p>Dann will ich mal das Problem lüften, dass sich mit diesem Code ergibt, dein ich meinem <a href="http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/">letzten Artikel</a> vorgestellt habe:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Zuerst einmal liegt es nicht daran, dass es hier Template verwendet wurde.<br />
Ein Template wurde verwendet, weil in dem Code nicht nur <em>CString</em>, sondern implizit <em>CStringA</em> und <em>CStringW</em> verwendet wurde. Der Code sollte also mit beiden Typen funktionieren.</p>
<p>Und damit sind wir bei Problem 1, das auch gelöst wurde:<br />
Wenn ein <em>CStringW</em> verwendet wird, dann wird nur die Hälfte des Strings gelöscht, und nicht alles.</p>
<p>Das Szenario, dass zu einem miesen Crash führen kann, will ich nun in den einzelnen Schritten schildern (es wurde ja vermutet, dass es mit GetBuffer zusammenhängt und die Vermutung ist richtig):</p>
<ol>
<li>Der <em>CString</em> der mit diesem template behandelt wurde enthielt einen größeren <em>CString</em> und anschließend wurde ein kürzerer <em>CString</em> zugewiesen. Damit ist <em>GetAllocLength</em>&gt;<em>GetLength</em>.</li>
<li>Dieser <em>CString</em> wird nun an eine weitere Variable zugewiesen. Durch die Referenzzählung wird keine volle Kopie erzeugt.</li>
<li>Nun kommt unsere schöne Funktion ins Spiel und einer der beiden Strings wird mit dieser Template Funktion behandelt.</li>
<li>Die Funktion hat zwei Argumente, die von rechts nach links berechnet und auf den Stack geschoben werden.</li>
<li>D.h. Zuerst wird <em>GetAllocLength</em> ausgeführt. Und dies ergibt einen Wert für die Länge, der ursprünglich einmal in diese Variable passte.</li>
<li>Als zweites erfolgt nun der Aufruf von <em>GetBuffer</em>. Da wir aber einen <em>CString</em> haben, der mehrfach benutzt wird, muss nun ein Copy on Write erfolgen. D..h. der String wird kopiert und mit der jetzt benötigten Länge neu alloziert und der Zeiger auf diesen Speicher wird zurückgegeben, dieser ist aber eben kürzer als der ursprüngliche Puffer.</li>
<li>Und nun erfolgt der <em>memset</em>, auf einen Speicher der nur noch so groß ist wie der kurze String. Folgerichtig wird der Heap zerstört, weil der Speicher hinter dem String überschrieben wird.</li>
<li>Peng <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_exclaim.gif' alt=':!:' class='wp-smiley' />  Wir haben hier einen ganz miesen Seiteneffekt.</li>
</ol>
<p>Hier der Code, mit dem man den Crash gezielt nachbauen kann:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> Crash<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  CString str1 <span style="color: #000080;">=</span> _T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;12345678901234567890&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  str1 <span style="color: #000080;">=</span> _T<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;123&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  CString str2 <span style="color: #000080;">=</span> str1<span style="color: #008080;">;</span>
  SecureClearString<span style="color: #008000;">&#40;</span>str1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Crash</span>
  SecureClearString<span style="color: #008000;">&#40;</span>str2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Der Vollständigkeit halber will ich aber auch noch ein Stück Code zegen, der es richtig macht:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #666666;">// We need this only if there is a private buffer</span>
  <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
  <span style="color: #008000;">&#123;</span>
    <span style="color: #666666;">// Execute GetBuffer first. This might cause a fork and may change</span>
    <span style="color: #666666;">// GetAllocLength.</span>
    T<span style="color: #008080;">::</span><span style="color: #007788;">XCHAR</span> <span style="color: #000040;">*</span>pBuffer <span style="color: #000080;">=</span> strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #0000ff;">size_t</span> iLen <span style="color: #000080;">=</span>strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>pBuffer,iLen<span style="color: #000040;">*</span><span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>T<span style="color: #008080;">::</span><span style="color: #007788;">XCHAR</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  <span style="color: #008000;">&#125;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p lang="cpp">PS: Der Leser kann sich denken, dass mich dieser Bug und die entsprechende Reproduktion einige Nerven gekostet haben.  Denn es war nicht einfach die Vorbedingung (erst langer String, dann kurzer String, dann Zuweisung) zu ermitteln. Und wie es oft so ist führen Heap-Fehler erst sehr verzögert zu einem Problem.<br />
Wen es genau interessiert: Ich habe ca 7 Stunden an dem Fall geknobelt und hatte 3 verschiedene Crashdumps zur Verfügung. Selbst konnte ich diesen Fehler in unserem Testfeld zuvor nicht erzeugen, weil eben nie alle Bedingungen erfüllt waren. Erst als mir klar war wo das Problem lag, gelang es mir natürlich auch sofort Eingaben zu erzeugen, die den Crash reproduzierten.</p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/23/auflosung-des-getbuffer-und-getalloclength-rastels/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zur Abwechslung mal ein kleines Quiz: Was ist das Problem mit diesem Template?</title>
		<link>http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/#comments</comments>
		<pubDate>Sun, 17 Jul 2011 10:25:00 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Qualitätssicherung]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=875</guid>
		<description><![CDATA[Folgender Code wurde in einem Programmteil von uns eingebaut: template &#60;class T&#62; void SecureClearString&#40;T &#38;strText&#41; &#123; ::SecureZeroMemory&#40;strText.GetBuffer&#40;0&#41;,strText.GetAllocLength&#40;&#41;&#41;; strText.Empty&#40;&#41;; &#125; Der Sinn und Zweck sollte sein, dass der Inhalt einer CString Variable durch diesen Code überschrieben und anschließend freigegeben wird, damit zum Beispiel ein Kennwort oder ein Benutzername nicht mehr im Speicher lesbar bleibt. Die Anwendung [...]]]></description>
			<content:encoded><![CDATA[<p>Folgender Code wurde in einem Programmteil von uns eingebaut:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">class</span> T<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">void</span> SecureClearString<span style="color: #008000;">&#40;</span>T <span style="color: #000040;">&amp;</span>strText<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
  <span style="color: #008080;">::</span><span style="color: #007788;">SecureZeroMemory</span><span style="color: #008000;">&#40;</span>strText.<span style="color: #007788;">GetBuffer</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,strText.<span style="color: #007788;">GetAllocLength</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
  strText.<span style="color: #007788;">Empty</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Der Sinn und Zweck sollte sein, dass der Inhalt einer CString Variable durch diesen Code überschrieben und anschließend freigegeben wird, damit zum Beispiel ein Kennwort oder ein Benutzername nicht mehr im Speicher lesbar bleibt.<br />
Die Anwendung sieht in etwa so aus (war allerdings noch in einer Klasse gekapselt):</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">CString strPassword<span style="color: #008080;">;</span>
...
<span style="color: #666666;">// Fill password and use it</span>
...
<span style="color: #007788;">SecureClearString</span><span style="color: #008000;">&#40;</span>strPassword<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Doch leider ist was faul mit dem Code&#8230; zwei Probleme gibt es mit diesem Stück Code.<br />
Meine Frage an meine Leser lautet nun was <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_question.gif' alt=':?:' class='wp-smiley' /> </p>
<hr /><small>Copyright &copy; 2010 Martin Richter<br />Dieser Feed ist nur für den persönlichen, nicht gewerblichen Gebrauch bestimmt. Eine Verwendung dieses Feeds bzw. der hier veröffentlichten Beiträge auf anderen Webseiten bedarf der ausdrücklichen Genehmigung des Autors.<br />(Digital Fingerprint: bdafe67664ea5aacaab71f8c0a581adf)</small>]]></content:encoded>
			<wfw:commentRss>http://blog.m-ri.de/index.php/2011/07/17/zur-abwechslung-mal-ein-kleines-quiz-was-ist-das-problem-mit-diesem-template/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

