<?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/tag/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>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>Für was ist der Makro %(PreprocessorDefinitions) gut ?</title>
		<link>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/</link>
		<comments>http://blog.m-ri.de/index.php/2011/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/#comments</comments>
		<pubDate>Sun, 16 Oct 2011 17:54:35 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[ATL]]></category>
		<category><![CDATA[CRT]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS 2008]]></category>
		<category><![CDATA[VS 2010]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Compiler]]></category>
		<category><![CDATA[VS-2008]]></category>
		<category><![CDATA[VS-2010]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=903</guid>
		<description><![CDATA[In den C++ Compilereinstellungen finden sich ein vorgegebener Makro %(PreprocessorDefinitions) in den C++ Präprozessor Definitionen. Die Verwendung dieses Makros ist nicht ganz offensichtlich. Dieser Makro sollten in jedem Fall nicht entfernt werden, denn Sie dienen der Übernahme einiger Einstellungen aus der General-Seite für die C++ Projekte. Zum Beispiel werden die Einstellungen für Unicode und MBCS über [...]]]></description>
			<content:encoded><![CDATA[<p>In den C++ Compilereinstellungen finden sich ein vorgegebener Makro <em>%(PreprocessorDefinitions)</em> in den C++ Präprozessor Definitionen. Die Verwendung dieses Makros ist nicht ganz offensichtlich.</p>
<p>Dieser Makro sollten in jedem Fall nicht entfernt werden, denn Sie dienen der Übernahme einiger Einstellungen aus der <em>General</em>-Seite für die C++ Projekte. Zum Beispiel werden die Einstellungen für Unicode und MBCS über den Makro <em>%(PreprocessorDefinitions)</em> in die allgemeinen Compiler-Einstellungen übernommen (die entsprechenden Defines sind <em>_UNICODE; UNICODE; _MBCS </em>).<br />
Erzeugt man eine DLL wird zusätzlich <em>_WINDLL</em> gesetzt.<br />
Setzt man ATL Optionen in der General Seite wird auch über die <em>%(PreprocessorDefinitions) _ATLDLL</em> bzw. <em>_ATL_STATIC_REGISTRY</em> gesetzt oder zurückgesetzt.<br />
Gleiches gilt, wenn die <em>MFC</em> als shared DLL verwendet wird. In diesem Fall wird der Define <em>_AFXDLL</em> zusätzlich gesetzt.</p>
<p>Löscht man also <em>%(PreprocessorDefinitions)</em> dann werden alle diese Einstellungen nicht mehr  korrekt übernommen.</p>
<p>Anmerkung:<br />
Bei dem Linker Makro <em>%(AdditionalDependencies) </em>habe ich eine ähnliche Verwendung vermutet, konnte aber keine direkte Beziehung zur Seite General herstellen.</p>
<p>Obwohl es auch hier Einflüsse auf die Linkereinstellungen gibt bei Änderungen in den <em>General</em>-Einstellungen. Werden allerdings die MFC als zusätzliche Bibliothek ausgewählt werden die Standard-LIBs aus dem SDK komplett entfernt. Hier gibt die MFC Bibliothek selbst vor in welchen zusätzlichen Libs, des SDK gesucht werden soll über #pragma comment(lib,..).</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/10/16/fur-was-ist-der-makro-preprocessordefinitions-gut/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>
		<item>
		<title>VS-Tipps und Tricks:Feststellen ob ATL oder MFC in einem Projekt benutzt werden</title>
		<link>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/</link>
		<comments>http://blog.m-ri.de/index.php/2011/07/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 15:45:06 +0000</pubDate>
		<dc:creator>Martin Richter</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[MFC]]></category>
		<category><![CDATA[Programmieren]]></category>
		<category><![CDATA[VS-Tipps&Tricks]]></category>
		<category><![CDATA[ATL]]></category>

		<guid isPermaLink="false">http://blog.m-ri.de/?p=747</guid>
		<description><![CDATA[Für manche Standardklassen bzw. Header oder Libraries ist es manchmal schön zu wissen ob die ATL oder die MFC in einem Projekt verwendet werden.  In der Vergangenheit habe ich dies oft benutzt um bestimmte Member in Klassen einzubauen, die dann zum Beispiel Daten auch als CString aktzeptieren, oder diese Member dann eben nicht einzubauen um eine Nutzung [...]]]></description>
			<content:encoded><![CDATA[<p>Für manche Standardklassen bzw. Header oder Libraries ist es manchmal schön zu wissen ob die <em>ATL</em> oder die <em>MFC</em> in einem Projekt verwendet werden.  In der Vergangenheit habe ich dies oft benutzt um bestimmte Member in Klassen einzubauen, die dann zum Beispiel Daten auch als <em>CString </em>aktzeptieren, oder diese Member dann eben nicht einzubauen um eine Nutzung in einem &#8220;puren&#8221; <em>WinAPI</em> Projekt zu ermöglichen.<br />
Seit die <em>CString </em>Klassen allerdings eigenständige Templates wurden ist dieser Grund für mich eigentlich weggefallen.<br />
Ich benutzte es heute nur noch um evtl. Memberfunktionen zu unterscheiden die evtl. CWnd* zusätzlich zu HWND Parametern akzeptieren.</p>
<p>Aber wer weiß, vielleicht hat der eine oder andere doch die Frage wie er erkennen kann ob die <em>ATL</em> oder die <em>MFC</em> in einem Projekt Verwendung finden.</p>
<p>Vordefinierte Preprozessor Variablen gibt es dafür nicht, allerdings kann man erkennen ob die Standard <em>ATL</em>/<em>MFC</em>Header in einem Projekt bereits als Include eingefügt wurden, denn in diesem Fall kann man die Existenz der Include-Guards prüfen.</p>
<p>Die <em>MFC</em> benutzt <strong><em>__AFX_H__ </em></strong>als Guard für die <em>afx.h</em>.<br />
Die Basisklassen der <em>ATL</em> befinden sich in der <em>atlbase.h</em>und entsprechend lautet der Guard: <strong><em>__ATLBASE_H__</em></strong>.</p>
<p>Sofern also diese Guards definiert sind wurden auch die entsprechenden Libraries in der <em>stdafx.h</em> oder anderen Headern zuvor included.</p>
<p><strong>Nachtrag 12.07.2011:<br />
Stefan</strong> hat natürlich vollkommen recht mit seinem Kommentar, dass es die zwei Präprozessor-Variablen <strong><em>_MFC_VER </em></strong>und <strong><em>_ATL_VER </em></strong>gibt, die natürlich für den hier erwähnten Einsatz weitaus besser geeigent sind.<br />
Siehe: <a href="http://msdn.microsoft.com/de-de/library/b0084kay.aspx">http://msdn.microsoft.com/de-de/library/b0084kay.aspx</a><br />
Ich habe hier den Wald vor lauter Bäumen nicht gesehen <img src='http://blog.m-ri.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Herzlichen Dank für diese produktive Ergänzung.</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/10/vs-tipps-und-tricksfeststellen-ob-atl-oder-mfc-in-einem-projekt-benutzt-werden/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

