<?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[Aliasing Probleme]]></title><description><![CDATA[<p>Hallo,<br />
ich hab gerade ziemliche Probleme mit einem Datencontainer und Aliasing.<br />
Wenn ich das ganze mit dem g++ und O0 oder 01 bzw. -fno-strict-aliasing kompiliere, geht alles einwandfrei, mit O2 oder 03 ohne -fno-strict-aliasing bekomme ich merkwürdige Probleme mit Pointern.<br />
Nun caste ich desöftern Pointer hin-u. her, und zwar (soweit ich das überblicken kann) zwischen basis -u. abgeleiteten Klassen (beide nicht-virtuell), sowie zwischen void* und Klassen-Pointern (vorallem, weil teils mit malloc gearbeitet werden muss).<br />
Ich will nicht auf -fno-strict-aliasing angewiesen sein, deshalb würde mich mal interessieren, was genau ich denn nun beachten muss, um Probleme zu vermeiden. Meinem Verständnis nach sollten Casts zwischen verwandten Klassen ja in Ordnung sein, ebenso Casts von void* auf Klassen (schon weil z.B. malloc void* ausspucht [ja, ich weiß, dass malloc in C++ zu vermeiden ist]).<br />
Leider spuckt der g++ auch keine passenden Warnungen aus (was er bei trivalen Beispielen zum Thema Aliasing ja durchaus tut).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236778/aliasing-probleme</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 18:11:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236778.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 19 Mar 2009 18:59:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 18:59:16 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich hab gerade ziemliche Probleme mit einem Datencontainer und Aliasing.<br />
Wenn ich das ganze mit dem g++ und O0 oder 01 bzw. -fno-strict-aliasing kompiliere, geht alles einwandfrei, mit O2 oder 03 ohne -fno-strict-aliasing bekomme ich merkwürdige Probleme mit Pointern.<br />
Nun caste ich desöftern Pointer hin-u. her, und zwar (soweit ich das überblicken kann) zwischen basis -u. abgeleiteten Klassen (beide nicht-virtuell), sowie zwischen void* und Klassen-Pointern (vorallem, weil teils mit malloc gearbeitet werden muss).<br />
Ich will nicht auf -fno-strict-aliasing angewiesen sein, deshalb würde mich mal interessieren, was genau ich denn nun beachten muss, um Probleme zu vermeiden. Meinem Verständnis nach sollten Casts zwischen verwandten Klassen ja in Ordnung sein, ebenso Casts von void* auf Klassen (schon weil z.B. malloc void* ausspucht [ja, ich weiß, dass malloc in C++ zu vermeiden ist]).<br />
Leider spuckt der g++ auch keine passenden Warnungen aus (was er bei trivalen Beispielen zum Thema Aliasing ja durchaus tut).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1682983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1682983</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 19 Mar 2009 18:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 19:07:51 GMT]]></title><description><![CDATA[<p>Etwas Code und ein dazugehörender Fehler würde helfen.</p>
<p>Aber schon mal so vorweg: &quot;malloc + Klassen&quot; klingt schon mal nicht gut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1682991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1682991</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Thu, 19 Mar 2009 19:07:51 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 20:47:08 GMT]]></title><description><![CDATA[<p>Da ich das Problem noch nicht wirklich klar lokalisieren kann, kann ich auch keinen Code posten (und ich werde nicht die gesamten 1000 Zeilen des Containers + 1000 Zeilen der Unit-Tests veröffentlichen).<br />
malloc wird benutzt, um einen Memory-Pool zu allokieren, in den dann die eigentlichen Instanzen gepackt werden.</p>
<p>Mir gehts ja generell ums Aliasing - da mir eben noch nicht ganz klar ist, woher überhaupt Probleme kommen könnten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683034</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 19 Mar 2009 20:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 20:56:33 GMT]]></title><description><![CDATA[<p>Es ist schwer, da irgendetwas zu sagen, ohne grundsätzliche Problemstellung. Normalerweise funktionieren Zeigern, sofern man nicht ganz seltsame Dinge macht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Du sagst, du hättest Up- und Downcasts? Bei Downcast verwendest du womöglich <code>dynamic_cast</code> . Hast du in der Basisklasse mindestens eine virtuelle Funktion? Mindestens den Destruktor <code>virtual</code> gemacht? Denn dies ist für einen erfolgreichen <code>dynamic_cast</code> nötig.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683041</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 19 Mar 2009 20:56:33 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 21:31:28 GMT]]></title><description><![CDATA[<p>Ich benutze nur static_cast und die Klassen besitzen auch keine virtuellen Funktionen (dürfen sie auch nicht).</p>
<p>edit: und das Problem wird noch dadurch verschärft, dass ich es nur mit dem g++ 4.3.1 reproduzieren kann, nicht aber mit einem 4.1 oder 4.2 (auch nicht mit -fstrict-aliasing)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683059</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 19 Mar 2009 21:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 21:29:33 GMT]]></title><description><![CDATA[<p>Ein Cast von void* nach T ist genau dann erlaubt, wenn der void* durch einen Cast von T nach void* erzeugt wurde.</p>
<p>Konkret:</p>
<pre><code class="language-cpp">class Base {};
class Derived : public Base {};

void foo()
{
    Derived d;
    Derived* pd = &amp;d;
    void* pv = pd;

    Derived* pd2 = static_cast&lt;Derived&gt;(pv); // OK
    Base* pb = static_cast&lt;Base&gt;(pv); // FEHLER!!!
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1683068</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683068</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 19 Mar 2009 21:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 21:41:23 GMT]]></title><description><![CDATA[<p>Hast du die Probleme auch wenn du operator new verwendest zum allokieren?<br />
Ich weiss nicht ob malloc garantiert das richtige alignment fuer alle Klassen zu liefern. operator new muesste das aber tun...</p>
<p>was sind denn die genauen Probleme die auftreten?</p>
<p>wobei ich sagen muss, ich kenne &quot;-fno-strict-aliasing&quot; garnicht. Was macht es denn genau? Hab das jetzt auf die schnelle in der gcc docu nicht gefunden. Waere interessant zu wissen was es genau tut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>[edit]<br />
Ach, doch noch gefunden.<br />
Sieht doch dann ziemlich deutlich aus, oder?</p>
<blockquote>
<p>Allows the compiler to assume the strictest aliasing rules applicable to the language being compiled. For C (and C++), this activates optimizations based on the type of expressions. In particular, an object of one type is assumed never to reside at the same address as an object of a different type, unless the types are almost the same.</p>
</blockquote>
<p>das erklaert IMHO ziemlich deutlich warum du mit -fno-strict-aliasing die gewuenschten resultate hast - wenn du so mit rohem speicher umgehst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683076</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 19 Mar 2009 21:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Thu, 19 Mar 2009 21:49:18 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>was sind denn die genauen Probleme die auftreten?</p>
</blockquote>
<p>Naja, wie so Pointer-Problemchen halt aussehen - es passiert nicht das, was passieren soll. Elemente in den Datencontainer einfügen hat keinen Effekt, die interne Integrität wird zerschossen (Pointer ins Nirvana) etc.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>wobei ich sagen muss, ich kenne &quot;-fno-strict-aliasing&quot; garnicht. Was macht es denn genau? Hab das jetzt auf die schnelle in der gcc docu nicht gefunden. Waere interessant zu wissen was es genau tut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Das schaltet halt das strenge Aliasing aus.<br />
Laut Standard dürfen zwei Pointer inkompatiblen Typs nicht auf den selben Speicher verweisen.<br />
Beim Optimieren mit striktem Aliasing geht der Compiler bei Pointern unterschiedlichen Typs davon aus, dass sie auf unterschiedlichen Speicher zeigen und hat damit mehr Möglichkeiten, den Code um zu sortieren, weil der Zugriff auf einen Pointer keine Seiteneffekte auf andere haben sollte.</p>
<p>Edit: meine Frage hat ursprünglich auch primär auf das Problem mit den abgeleiteten Klassen gezielt. Die malloc Geschichte ist einmalig beim Initialisieren im Code und wenn das nicht funktionieren würde, sollte (naja...) mir eigentlich alles um die Ohren fliegen.</p>
<p>Ich hab keine Aussage gefunden, nach der das Aliasing auch bei Klassen einer Hierarchie problematisch ist, aber imho wäre es ja reichlich irrsinnig, wenn dem so wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683082</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Thu, 19 Mar 2009 21:49:18 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 15:08:43 GMT]]></title><description><![CDATA[<p>Also ich hab jetzt kein malloc mehr drin und die Probleme sind tatsächlich weniger geworden, aber leider auch nicht ganz verschwunden.</p>
<p>Mein Container hat eine size() Funktion, die die Entfernung zwischen begin() und end() Iterator berechnet.<br />
Nach dem Einfügen eines Elements und nachfolgender Ausgabe von size() ist die immernoch 0, obwohl das Element scheinbar eingetragen wurde.<br />
Nach dem Einfügen eines zweiten Elements und nachfolgender Ausgabe von size() ist sie plötzlich (korrekterweise) 2.<br />
Und nun wirds ganz lustig: Rufe ich nach dem ersten einfügen size() zweimal hintereinander auf, bekomm ich erst 0 und dann 1 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /><br />
Füge ich in die size() z.B. direkt eine Ausgabe ein, funktioniert auch alles so wies soll.<br />
Und wie gesagt, nur wenn der g++ mit striktem Aliasing optimiert. Da wird irgendwie der Code inkorrekt umgebaut.</p>
<p>Die einzigen Casts, die ich in dem Prozess finden kann, sind beim Einfügen eines Elements, eben die vorher erwähnten Upcasts mit static_cast von Basis -zu abgeleiteter Klasse. Das ist nötig, weil die Basisklasse nur die Verlinkung der Elemente zur Verfügung stellt, die abgeleitete Klasse enthält noch das eigentliche Datenelement (die Konstruktion ist nötig, um ein End-Element zu realisieren, das selbst keine Instanz der Daten enthält).</p>
<p>Ich versuche daraus ein Beispiel zu konstruieren, aber das ist nicht so einfach (vorallem so, dass der Fehler auch auftritt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683468</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 20 Mar 2009 15:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 15:40:54 GMT]]></title><description><![CDATA[<p>Zeig doch erst mal nur deine size()-Funktion...<br />
Die sollte ja eigtl nur</p>
<p><code>(last-first)/sizeof(T)</code><br />
(ggf. noch nen cast von fist bzw last nach size_t - weiß nicht, ob der nötig ist...)</p>
<p>lauten, oder!?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683486</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 20 Mar 2009 15:40:54 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 15:54:38 GMT]]></title><description><![CDATA[<p>nö, die lautet:</p>
<pre><code class="language-cpp">size_type size() const{
	return std::distance(this-&gt;begin(), this-&gt;end());
}
</code></pre>
<p>Und auch eine selbstgeschriebene Schleife ändert da nichts.</p>
<p>Edit: Übrigens habe ich gerade festgestellt, dass ich die Begriffe Up u-Downcast verdreht habe. Mit Upcast meinte ich Basisklasse-&gt;Abgeleitete Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683488</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 20 Mar 2009 15:54:38 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 15:54:32 GMT]]></title><description><![CDATA[<p>maximAL schrieb:</p>
<blockquote>
<p>nö, die lautet:</p>
<pre><code class="language-cpp">size_type size() const{
	return std::distance(this-&gt;begin(), this-&gt;end());
}
</code></pre>
<p>Und auch eine selbstgeschriebene Schleife ändert da nichts.</p>
</blockquote>
<p>na gut - das is natürlich hübscher ^^ erzeugt aber vrmtl den gleichen code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
hmm... na dann musst du wohl wirklich mal nen bissl mehr quelltext zeigen ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683497</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 20 Mar 2009 15:54:32 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 16:03:09 GMT]]></title><description><![CDATA[<p>Entweder du zeigst uns Code wie du Zeiger benutzt od wo die Fehler liegen (debugging) oder das Raetselraten geht weiter. Vielleicht helfen auch Kompilerwarnungen wie -Wall oder -Weffc++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683499</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 20 Mar 2009 16:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 16:13:20 GMT]]></title><description><![CDATA[<p>also einfach mal so aus dem Code gepflückt:</p>
<pre><code class="language-cpp">iterator insert(iterator loc, const value_type&amp; val){
  element_base_type *inserted = (this-&gt;m_free_end_element.get_next());
  static_cast&lt;element_type*&gt;(inserted)-&gt;set_value(val);

  this-&gt;move(loc.get_element(), inserted);

  return iterator(inserted);
}

void move(element_base_type *loc, element_base_type *element){
  element-&gt;get_prev()-&gt;set_next(element-&gt;get_next());
  element-&gt;get_next()-&gt;set_prev(element-&gt;get_prev());

  element-&gt;set_prev(loc-&gt;get_prev());
  element-&gt;set_next(loc);

  loc-&gt;get_prev()-&gt;set_next(element);
  loc-&gt;set_prev(element);
}
</code></pre>
<p>Der Punkt ist natürlich, dass das Problem nicht einfach <em>hier</em> auftritt. Der Code wird an X Stellen benutzt und funktioniert meisstens wunderbar. Nur hier und da macht der Compiler was beim Optimieren kaputt, da spielen auch noch alle möglichen Randbedingungen mit rein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683503</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 20 Mar 2009 16:13:20 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 16:33:46 GMT]]></title><description><![CDATA[<p>Warum redest du dann vom &quot;einfachen hinzufügen&quot; und zeigst jz nur funktionen zum verschieben und in der irgendwo (jedenfalls nicht speziell vorn oder hinten - so eine fkt sollte es doch aber schon geben!? ^^) einfügen?</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683520</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 20 Mar 2009 16:33:46 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Fri, 20 Mar 2009 16:36:09 GMT]]></title><description><![CDATA[<p>Insert fügt einen wert vor dem iterator ein. Das move ist nötig, weil der Container schon einen Pool an belegten und nicht belegten Objekten besitzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683521</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Fri, 20 Mar 2009 16:36:09 GMT</pubDate></item><item><title><![CDATA[Reply to Aliasing Probleme on Sat, 21 Mar 2009 02:48:54 GMT]]></title><description><![CDATA[<p>mini-update: Werden die ursprünglichen Klassen-Deklarationen von element_base_type und element_type mit <code>__attribute__((__may_alias__))</code> versehen, so funktioniert wieder alles wie gewünscht. Da es auch nur Casts zwischen diesen beiden Typen gibt ( <code>static_cast&lt;element_type*&gt;(element_base_type_pointer)</code> ), scheint der Compiler da wirklich bei beiden Typen das Aliasing durcheinander zu bringen, was eigentlich nicht passieren sollte, da sie verwandt sind.<br />
Ich werd nochmal versuchen, einen aktuelleren gcc 4.3.3 aufzutreiben, um auszuschliessen, dass das ein Bug nur von 4.3.1 ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1683688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1683688</guid><dc:creator><![CDATA[maximAL]]></dc:creator><pubDate>Sat, 21 Mar 2009 02:48:54 GMT</pubDate></item></channel></rss>