<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Heap Overflow finden]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche jetzt schon seit einigen Stunden ein Programm wieder zu laufen zubringen. In diesem Programm ändert sich wie von Geisterhand der Inhalt einer Variable. Der Typ ist bool und der Debugger zeigt den Inhalt solange das Programm gut läuft auch mit false an. Dann stürzt es ab und ich konnte das Problem soweit nachvollziehen das sich diese Variable geändert hat und plötzlich komische Werte besitzt. Mal hat sie den Wert 188, mal 70 oder sonstwas. Der Setter dieser Variablen wird nirgend aufgerufen.<br />
Im SVN konnte ich den Fehler auf einen Versionssprung einkreisen. Allerdings wurde dabei diese Variable garnicht berührt. Es wurden allerdings Variablen entfernt und Code umstrukturiert.</p>
<p>Nun vermute ich das es sich um ein Heap Overflow handelt. Mein Programm hat schon längere Zeit einen Fehler, irgendwo überschreibt eine Funktion Speicher. Vor der Strukturänderung betraf dies einen Speicherbereich welcher uninteressant ist. Nun liegen allerdings meine Variable und der wilde Speicher nebeneinander und der Fehler tritt auf.</p>
<p>Nun meine Frage, ist das Szenario realistisch. Oder kann dies so gar nicht auftreten. Wichtiger ist aber wie findet man den Verursacher für die Änderung der Variablen?</p>
<p>Entwickeln tue ich unter Ubuntu Linux 8.04 mit Eclipse als IDE und Debugger, konnte das Problem auf verschiedenen Rechnern (32 und 64 Bit) nachvollziehen.</p>
<p>Vielen Dank und beste Grüße, sjoe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/248144/heap-overflow-finden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 06:14:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/248144.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 20 Aug 2009 09:41:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Heap Overflow finden on Thu, 20 Aug 2009 09:41:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche jetzt schon seit einigen Stunden ein Programm wieder zu laufen zubringen. In diesem Programm ändert sich wie von Geisterhand der Inhalt einer Variable. Der Typ ist bool und der Debugger zeigt den Inhalt solange das Programm gut läuft auch mit false an. Dann stürzt es ab und ich konnte das Problem soweit nachvollziehen das sich diese Variable geändert hat und plötzlich komische Werte besitzt. Mal hat sie den Wert 188, mal 70 oder sonstwas. Der Setter dieser Variablen wird nirgend aufgerufen.<br />
Im SVN konnte ich den Fehler auf einen Versionssprung einkreisen. Allerdings wurde dabei diese Variable garnicht berührt. Es wurden allerdings Variablen entfernt und Code umstrukturiert.</p>
<p>Nun vermute ich das es sich um ein Heap Overflow handelt. Mein Programm hat schon längere Zeit einen Fehler, irgendwo überschreibt eine Funktion Speicher. Vor der Strukturänderung betraf dies einen Speicherbereich welcher uninteressant ist. Nun liegen allerdings meine Variable und der wilde Speicher nebeneinander und der Fehler tritt auf.</p>
<p>Nun meine Frage, ist das Szenario realistisch. Oder kann dies so gar nicht auftreten. Wichtiger ist aber wie findet man den Verursacher für die Änderung der Variablen?</p>
<p>Entwickeln tue ich unter Ubuntu Linux 8.04 mit Eclipse als IDE und Debugger, konnte das Problem auf verschiedenen Rechnern (32 und 64 Bit) nachvollziehen.</p>
<p>Vielen Dank und beste Grüße, sjoe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1763987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1763987</guid><dc:creator><![CDATA[sjoe]]></dc:creator><pubDate>Thu, 20 Aug 2009 09:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Overflow finden on Thu, 20 Aug 2009 09:48:54 GMT]]></title><description><![CDATA[<p>Hast du schon einmal mit valgrind gearbeitet? Wenn nicht, dann wird es Zeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Und hoffentlich kannst du mit ihm etwas Licht ins Dunkel bringen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>P.S. Realistisch ist dein Szenario auf jeden Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1763997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1763997</guid><dc:creator><![CDATA[Valgrinder]]></dc:creator><pubDate>Thu, 20 Aug 2009 09:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Overflow finden on Thu, 20 Aug 2009 10:05:37 GMT]]></title><description><![CDATA[<p>Wenn andere Variablen einfach überschrieben werden, dann hast du irgendwas falsch initialisiert. Vielleicht zeigst du mal die betroffene Codestelle + deine Variablen Initialisierungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1764013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1764013</guid><dc:creator><![CDATA[-insane- 0]]></dc:creator><pubDate>Thu, 20 Aug 2009 10:05:37 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Overflow finden on Thu, 20 Aug 2009 10:15:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/3350">@insane</a><br />
Hm, das Programm ist leider kein 10-Zeiler mehr. Ich wüsste leider nicht welche Code-Fragmente ich hier jetzt zeigen könnte.<br />
Irgendwo wird natürlich eine Variable bool Test = false; angelegt. Aber irgendwo gibst es dann wohl auch ein Stück Code das folgendes machen könnte.</p>
<pre><code class="language-cpp">int a[10];
for(int i=0;i&lt;100;i++)
a[i] = rand();
</code></pre>
<p>Da fällt es mir schwer die richtige Codestelle zu posten.</p>
<p>@Valgrinder<br />
Interessant. Hast du vielleicht noch ein gutes und kurzes Tutorial zu Hand.</p>
<p>Danke, sjoe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1764023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1764023</guid><dc:creator><![CDATA[sjoe]]></dc:creator><pubDate>Thu, 20 Aug 2009 10:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Overflow finden on Thu, 20 Aug 2009 12:45:44 GMT]]></title><description><![CDATA[<p>Das sind etwa die schlimmsten Fehler überhaupt, da sie sich oft erst weit von der Entstehungsstelle entfernt bemerkbar machen. Grundsätzlich kannst du diese schon sehr einschränken, wenn du ein wenig von den fehleranfälligen Low-Level-Dingen wie Arrays und rohe Zeiger wegkommst. Zum Beispiel <code>std::tr1::array</code> oder STL-Container als Ersatz für Arrays: die sind genauso schnell, aber viel sicherer, da sie im Debug-Modus Assertions auf gültige Indizes und solche Dinge durchführen.</p>
<p>In deinem Fall vermute ich auch stark, dass du irgendwo einen Arrayüberlauf hast. Was auch sein könnte, ist ein nicht initialisierter Zeiger, auf den zugegriffen wird, aber das geht viel öfter schief. Aber wenn du die SVN-Änderung einschränken kannst, versuch doch, den geänderten Code auf solche Dinge zu untersuchen.</p>
<p>Ich kenne Valgrind nicht, gut möglich, dass es dir stark hilft. Was du sonst auch noch versuchen könntest, ist die Adresse der <code>bool</code> -Variablen anzuschauen und mit anderen Dingen zu vergleichen. Falls die Variable auf dem Stack liegt, müsste das Array ein wenig weiter vorne stehen - also schau mal, ob vor der <code>bool</code> -Variable noch ein Array deklariert wird. Indem du das temporär durch <code>std::tr1::array</code> ersetzt (von der Schnittstelle her sollte es weitgehend kompatibel sein, sofern du normal über Indizes zugreifst und nicht irgendwelche Zeigerarithmetik-Sachen machst), sollte sich der Fehler schnell zeigen. Aber das ist natürlich nur eine Vermutung, vielleicht liegt der Grund ganz woanders...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1764122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1764122</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 20 Aug 2009 12:45:44 GMT</pubDate></item><item><title><![CDATA[Reply to Heap Overflow finden on Thu, 20 Aug 2009 13:03:01 GMT]]></title><description><![CDATA[<p>So, fertig. Danke für die Tips.<br />
Valgrind hat mir gut bei der Suche geholfen. Mit der Aussage &quot;Conditional jump or move depends on uninitialised value(s)&quot; hat es mich darauf hingewiesen, dass ein Copy-Konstruktur unvollständig war. Da konnte ich anschließend auch im SVN genau nachvollziehen wer den verpfuscht hat.</p>
<p>Grüße, sjoe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1764132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1764132</guid><dc:creator><![CDATA[sjoe]]></dc:creator><pubDate>Thu, 20 Aug 2009 13:03:01 GMT</pubDate></item></channel></rss>