<?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[(lesender) Zugriff auf dafault-initialized Array Members UB?]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319345/lesender-zugriff-auf-dafault-initialized-array-members-ub</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 20:13:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319345.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Aug 2013 21:44:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 12 Jun 2014 00:32:50 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2345952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2345952</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 12 Jun 2014 00:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Wed, 14 Aug 2013 21:56:59 GMT]]></title><description><![CDATA[<p>In C ist es UB, in C++ vermute ich mal genauso:</p>
<blockquote>
<p>3.17.2<br />
indeterminate value<br />
either an unspecified value or a trap representation</p>
</blockquote>
<p>Der einzige Typ, der in C keine Trap value hat, ist unsigned char.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2345954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2345954</guid><dc:creator><![CDATA[dranhaber]]></dc:creator><pubDate>Wed, 14 Aug 2013 21:56:59 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Wed, 14 Aug 2013 22:14:35 GMT]]></title><description><![CDATA[<p>n3337 schrieb:</p>
<blockquote>
<p>4.1 Lvalue-to-rvalue conversion [conv.lval]<br />
1 A glvalue (3.10) of a non-function, non-array type T can be converted to a prvalue. If T is an incomplete<br />
type, a program that necessitates this conversion is ill-formed. If the object to which the glvalue refers is not<br />
an object of type T and is not an object of a type derived from T, or <strong>if the object is uninitialized</strong>, a program<br />
that necessitates this conversion has <strong>undefined behavior</strong>. If T is a non-class type, the type of the prvalue is<br />
the cv-unqualified version of T. Otherwise, the type of the prvalue is T.54</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2345956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2345956</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 14 Aug 2013 22:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 07:29:58 GMT]]></title><description><![CDATA[<p>Ja, aber das ist ja gerade der Punkt: <em>default-initialized</em> heißt <em>initialized</em>. <em>uninitialized</em> hieße, dass du bspw. durch die Initialisierungsliste auf ein Member zugreifst welches noch gar nicht initialisiert wurde (da es nach dem Member deklariert ist was gerade initialisiert wird). Dein Beispiel ist natürlich vollkommen in Ordnung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2345984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2345984</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 15 Aug 2013 07:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 07:46:45 GMT]]></title><description><![CDATA[<p>Swordfish schrieb:</p>
<blockquote>
<p>der Zugriff auf default-initialized Array Members UB sei oder nicht.</p>
<pre><code class="language-cpp">int foo[ 10 ];
for( std::size_t i = 0; i &lt; sizeof foo / sizeof *foo; ++i )
    std::cout &lt;&lt; foo[ i ];
</code></pre>
</blockquote>
<p>Ich sehe ebenfalls nicht, dass der Zugriff UB sein sollte, hoechstens das der Wert undefiniert bzw. willkuerlich ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2345993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2345993</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 15 Aug 2013 07:46:45 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 07:47:58 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ja, aber das ist ja gerade der Punkt: <em>default-initialized</em> heißt <em>initialized</em>.</p>
</blockquote>
<p>Dann wirst du erklären müssen, welche Magie<br />
&quot;otherwise, no initialization is performed.&quot;<br />
doch zu einer Initialisierung (=Speichern eines <em>bestimmten</em> Anfangswertes in einer Variablen) führt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2345994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2345994</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 15 Aug 2013 07:47:58 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 08:00:05 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Ja, aber das ist ja gerade der Punkt: <em>default-initialized</em> heißt <em>initialized</em>.</p>
</blockquote>
<p>Dann wirst du erklären müssen, welche Magie<br />
&quot;otherwise, no initialization is performed.&quot;<br />
doch zu einer Initialisierung (=Speichern eines <em>bestimmten</em> Anfangswertes in einer Variablen) führt.</p>
</blockquote>
<p>Ich habe mich selber in die Falle gelockt.<br />
Nein, es wird nicht initialisiert, nicht wie du es (richtig) definiert hast.<br />
Aber.</p>
<blockquote>
<p>if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value.</p>
</blockquote>
<p>Der Standard sagt, <strong>dass das Objekt einen Wert hat</strong>, was impliziert, dass es vollständig konstruiert wurde.</p>
<p>Ich habe mich nur durch den Standard verwirren lassen, der default-initialization nicht immer zusammen schreibt. Beispiel:</p>
<blockquote>
<p>If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type with a user-provided default constructor.</p>
</blockquote>
<p>Also wenn <em>default initialization != initialization</em>, dann ist der Standard wirklich sehr ... inkonsistent was die Namensgebung angeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2345997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2345997</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 15 Aug 2013 08:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 09:53:21 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ich habe mich nur durch den Standard verwirren lassen, der default-initialization nicht immer zusammen schreibt. Beispiel:</p>
<blockquote>
<p>If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type with a user-provided default constructor.</p>
</blockquote>
<p>Also wenn <em>default initialization != initialization</em>, dann ist der Standard wirklich sehr ... inkonsistent was die Namensgebung angeht.</p>
</blockquote>
<p>default initialization != default-initialization != initialization</p>
<p>Logisch. Sind ja drei unterschiedliche Ausdrücke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346024</guid><dc:creator><![CDATA[tupfaufdemi]]></dc:creator><pubDate>Thu, 15 Aug 2013 09:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 14:43:41 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Aber.</p>
<blockquote>
<p>if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value.</p>
</blockquote>
<p>Der Standard sagt, <strong>dass das Objekt einen Wert hat</strong>, was impliziert, dass es vollständig konstruiert wurde.</p>
</blockquote>
<p>Da liest du, glaube ich, zuviel hinein. Es geht ja ohnehin nur um Sklare oder Arrays aus Skalaren. Von Konstruktion zu sprechen, ist hier also schon mal fehl am Platz.</p>
<p>M.A.n sagt die Passage nicht viel mehr aus, als dass der an der Stelle des Objektes gespeicherte Wert tatsächlich der Wert <em>dieses</em> Objektes ist und nicht etwa ein Überbleibsel eines Objektes, da vielleicht vorher dort existiert hat. Das ist wesentlich in Hinblick auf die Aliasregeln:</p>
<p>n3337 schrieb:</p>
<blockquote>
<p>3.10/10 Lvalues and rvalues [basic.lval]<br />
If a program attempts to <strong>access the stored value of an object</strong> through a glvalue of other than one of the<br />
following types the behavior is undefined:52<br />
...</p>
</blockquote>
<p>Das maßgebliche Objekt ist das neu deklarierte Objekt, nicht das alte, in das der alte Wert ursprünglich geschrieben wurde.</p>
<p>Nicht alle Initialisierungsformen werden in Abschnitt 8.5 behandelt. Ein wichtiger Fall wir in 3.9/2 (memcpy&amp;co.) genannt.</p>
<pre><code class="language-cpp">int a = 10;
int b; // b hier nicht initialisiert
memcpy( &amp;b, &amp;a, sizeof b );
cout &lt;&lt; b; // b ist hier (nat.) initialisiert
</code></pre>
<p>allerdings spezifiziert 3.9/2 nicht ausdrücklich die Methode, mit der diese Kopie gemacht wird, man könnte ja auch direkt selbst Bytes kopieren.</p>
<p>Das führt aber zu einem Problem:</p>
<pre><code class="language-cpp">void mymemcpy(void* dst, const void* src, size_t size)
{
    char* dst_ = (char*)dst;
    const char* src_ = (const char*)src;
    while ( size-- )
        *dst_++ = *src_++;
}

int foo()
{
    char x[10];
    char y[10];
    mymemcpy(y,x,10); // definiert oder UB?
}
</code></pre>
<p>das soll wahrscheinlich wohldefiniert sein, allerdings wird es jedenfalls nicht ausdrücklich im Standard erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346088</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 15 Aug 2013 14:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 15:20:31 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int foo()
{
    char x[10];
    char y[10];
    mymemcpy(y,x,10); // definiert oder UB?
}
</code></pre>
<p>das soll wahrscheinlich wohldefiniert sein, allerdings wird es jedenfalls nicht ausdrücklich im Standard erlaubt.</p>
</blockquote>
<p>Das ist natürlich nicht erlaubt. Hast du vielleicht ein <code>= {}</code> bei <code>char x[10]</code> vergessen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346094</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 15 Aug 2013 15:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Thu, 15 Aug 2013 15:31:24 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">int foo()
{
    char x[10];
    char y[10];
    mymemcpy(y,x,10); // definiert oder UB?
}
</code></pre>
<p>das soll wahrscheinlich wohldefiniert sein, allerdings wird es jedenfalls nicht ausdrücklich im Standard erlaubt.</p>
</blockquote>
<p>Das ist natürlich nicht erlaubt. Hast du vielleicht ein <code>= {}</code> bei <code>char x[10]</code> vergessen?</p>
</blockquote>
<p>Nichts vergessen. Und wir haben</p>
<p>n3337 3.9/2 schrieb:</p>
<blockquote>
<p>For any object (other than a base-class subobject) of trivially copyable type T, whether or not the object<br />
holds a valid value of type T, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.40[/quote</p>
</blockquote>
<p>Dies Passage ist m.A.n. die Lizenz, den Zustand jedes beliebigen trivial kopierbaren Objektes untersuchen zu dürfen. In diesem Fall (char/unsigned char) ist nun Objekt- und Wertrepräsentation identisch, so dass beim Kopieren</p>
<pre><code class="language-cpp">*dst_++ = *src_++;
</code></pre>
<p>einerseits der Wert des Objektes als auch die zugrundeliegenden Bytes kopiert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346097</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 15 Aug 2013 15:31:24 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Fri, 16 Aug 2013 21:11:27 GMT]]></title><description><![CDATA[<p>Uff. Hab ich wiedermanl Mist geschrieben.<br />
Danke für die Erklärung!</p>
<p>Also so wie ich das jetzt verstehe:</p>
<pre><code class="language-cpp">void foo()
{
    int a, b, c, d;

    memcpy(&amp;b, &amp;a, sizeof(a));   // OK
    mymemcpy(&amp;c, &amp;a, sizeof(a)); // OK
    d = a;                       // UB
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2346547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346547</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 16 Aug 2013 21:11:27 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Fri, 16 Aug 2013 21:19:50 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Uff. Hab ich wiedermanl Mist geschrieben.<br />
Danke für die Erklärung!</p>
<p>Also so wie ich das jetzt verstehe:</p>
<pre><code class="language-cpp">void foo()
{
    int a, b, c, d;

    memcpy(&amp;b, &amp;a, sizeof(a));   // OK
    mymemcpy(&amp;c, &amp;a, sizeof(a)); // OK
    d = a;                       // UB
}
</code></pre>
</blockquote>
<p>Ist jedenfalls meine Ansicht. Ausserdem</p>
<pre><code class="language-cpp">struct foo { int x; };
void bar()
{
    foo bar;
    foo bar = baz; // ok
    cout &lt;&lt; bar.x; // UB
    cout &lt;&lt; baz.x; // ??? wahrscheinlich ok
}
</code></pre>
<p>Noch spannender wird das, wenn man den Copyctor selbst definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346549</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 16 Aug 2013 21:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 02:26:10 GMT]]></title><description><![CDATA[<p>Hm...<br />
Ich hätte gesagt</p>
<pre><code class="language-cpp">void bar()
{
    foo bar;
    foo baz = bar; // keine Ahnung
    cout &lt;&lt; bar.x; // UB
    cout &lt;&lt; baz.x; // UB
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2346567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346567</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 17 Aug 2013 02:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 07:10:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Von Konstruktion zu sprechen, ist hier also schon mal fehl am Platz.</p>
</blockquote>
<p>Da meinte ich eher, dass das Objekt, hier ein Skalar, in einem gültigen (=benutzbaren) Zustand ist.<br />
Ich traue aber meinen Augen nicht, wenn ich lese,</p>
<pre><code>int a, b = a;
</code></pre>
<p>Soll UB sein. Nur da der Wert nicht spezifiziert ist, heißt das doch nicht, dass man ihn nicht benutzen darf...</p>
<blockquote>
<p>Dies Passage ist m.A.n. die Lizenz, den Zustand jedes beliebigen trivial kopierbaren Objektes untersuchen zu dürfen.</p>
</blockquote>
<p>Aber ein Array ist doch kein Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346575</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 17 Aug 2013 07:10:03 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 07:11:41 GMT]]></title><description><![CDATA[<pre><code>foo baz = bar; // keine Ahnung
</code></pre>
<p>Wohldefiniertes Verhalten, da ein Kopierkonstruktor implizit definiert wurde. Und bar ist zu dem Zeitpunkt ein lvalue das auf ein vollständig konstruiertes Objekt verweist. Wo könnte da auch nur annähernd ein Problem sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346576</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 17 Aug 2013 07:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 07:26:11 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Nur da der Wert nicht spezifiziert ist,</p>
</blockquote>
<p>ist er nicht.<br />
Der Wert ist <em>unbestimmt</em> (indeterminate), was etwas völlig anderes als unspezifiziert darstellt, an anderer Stelle ist im Standard von singulären Iteratoren und ungültigen Zeigern die Rede, was im Grunde das gleiche Konzept ist. Die dürfen auch nicht angefasst werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346578</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 17 Aug 2013 07:26:11 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 08:29:34 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Nur da der Wert nicht spezifiziert ist,</p>
</blockquote>
<p>ist er nicht.<br />
Der Wert ist <em>unbestimmt</em> (indeterminate), was etwas völlig anderes als unspezifiziert darstellt, an anderer Stelle ist im Standard von singulären Iteratoren und ungültigen Zeigern die Rede, was im Grunde das gleiche Konzept ist. Die dürfen auch nicht angefasst werden.</p>
</blockquote>
<p>Ich sehe unspezifiziert als</p>
<blockquote>
<p>Certain other aspects and operations of the abstract machine are described in this International Standard as unspeciﬁed (for example, order of evaluation of arguments to a function). Where possible, this International Standard deﬁnes a set of allowable behaviors. These deﬁne the nondeterministic aspects of the abstract machine. An instance of the abstract machine can thus have more than one possible execution for a given program and a given input</p>
</blockquote>
<p>was hier auch zutrifft, ausgehend von dem Intervall möglicher Werte kann diese Variable nur X verschiedene Zustände annehmen.</p>
<p>Wobei du natürlich Recht hast, ich darf die Begriffe die ja explizit im Standard definiert und verwendet werden nicht mischen.</p>
<p>Trotzdem ist es doch für die Natur der Sprache unerheblich, ob bei einer Zuweisung a = b der rechte Operand einen unbestimmten Wert hat oder bspw. einen vom Programmierer zufällig ausgedachten. Er hat einen, also wird a auch einen haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346584</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 17 Aug 2013 08:29:34 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 08:54:56 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>ausgehend von dem Intervall möglicher Werte kann diese Variable nur X verschiedene Zustände annehmen.</p>
</blockquote>
<p>Das mag so sein. Nur ist es eben nicht möglich, diesen Zustand (direkt - d.h. auslesen über l-zu-rvalue-Umwandlung) zu ermitteln.<br />
Anders gesagt: Der Wert den ein Compiler in diesem Fall liefert, muss nichts mit dem tatsächlich am Ort der Variablen gespeicherten Wert (wie er sich aus den dort befindlichen Bytes ergeben würde) zu tun haben und er muss nat. auch nicht gleich bleiben, wenn man ihn ein Zweites mal liest. Klassisch undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346587</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 17 Aug 2013 08:54:56 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 08:58:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Der Wert den ein Compiler in diesem Fall liefert, muss nichts mit dem tatsächlich am Ort der Variablen gespeicherten Wert (wie er sich aus den dort befindlichen Bytes ergeben würde) zu tun haben und er muss nat. auch nicht gleich bleiben, wenn man ihn ein Zweites mal liest. Klassisch undefiniertes Verhalten.</p>
</blockquote>
<p>Ahh... das heißt, bei jeder lvalue-to-rvalue Umwandlung wird ein undeterministischer Wert zurückgegeben? Ich habe es so verstanden, das die Variable einen unbestimmten aber festen Wert hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346589</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sat, 17 Aug 2013 08:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sat, 17 Aug 2013 23:15:08 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ahh... das heißt, bei jeder lvalue-to-rvalue Umwandlung wird ein undeterministischer Wert zurückgegeben? Ich habe es so verstanden, das die Variable einen unbestimmten aber festen Wert hat.</p>
</blockquote>
<p>Wozu die ganze Diskussion? Alles wurde schon mit dem dritten Post geklärt. Fettgedruckter Text: &quot;Lvalue-to-rvalue conversion&quot; &quot;if the object is uninitialized&quot; &quot;undefined behavior&quot;. Schwer zu glauben, wie man das missverstehen kann. Ausser natürlich, du verstehst &quot;undefined behaviour&quot; nicht, dann frag aber bitte direkt nach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346739</guid><dc:creator><![CDATA[facepalm]]></dc:creator><pubDate>Sat, 17 Aug 2013 23:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sun, 18 Aug 2013 07:28:03 GMT]]></title><description><![CDATA[<p>Erkläre mir mal folgendes:</p>
<pre><code>foo bar = baz; // ok
</code></pre>
<p>Wieso ist das Ok, obwohl beim unterliegenden kopieren der Member auch das uninitialisierte x einem anderen zugewiesen wird (was doch eigentlich eine <em>lvalue-to-rvalue conversion</em> beinhaltet), und laut unserer Diskussion UB ist?</p>
<blockquote>
<p>Ausser natürlich, du verstehst &quot;undefined behaviour&quot; nicht, dann frag aber bitte direkt nach.</p>
</blockquote>
<p>Ich kenne das sehr viel genauer als du, denke ich. Sag mir zum Beispiel, ob der Standard irgendwelche Anforderungen an den Programmablauf richtet, welcher vor dem UB im Programm liegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346757</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 18 Aug 2013 07:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sun, 18 Aug 2013 13:40:12 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Erkläre mir mal folgendes:</p>
<pre><code>foo bar = baz; // ok
</code></pre>
<p>Wieso ist das Ok, obwohl beim unterliegenden kopieren der Member auch das uninitialisierte x einem anderen zugewiesen wird (was doch eigentlich eine <em>lvalue-to-rvalue conversion</em> beinhaltet), und laut unserer Diskussion UB ist?</p>
</blockquote>
<p>Das musst du camper fragen nicht mich.</p>
<p>[lol]</p>
<blockquote>
<p>Wo könnte da auch nur annähernd ein Problem sein?</p>
</blockquote>
<p>[/lol]</p>
<p>Nicht das lvalue-to-rvalue von baz ist das Problem, sondern das lvalue-to-rvalue von baz.x (was uninitialized ist), was aber automatisch im impliziten Kopierkonstruktor vorkommt.</p>
<p>Was jedenfalls eindeutig UB ist, ist</p>
<p>Sone schrieb:</p>
<blockquote>
<p>Ich traue aber meinen Augen nicht, wenn ich lese,</p>
<pre><code>int a, b = a;
</code></pre>
<p>Soll UB sein.</p>
</blockquote>
<p>Nach meinem Verständnis:</p>
<pre><code class="language-cpp">foo a, b;
&amp;a; // ok
memcpy(&amp;a, &amp;b, sizeof(a)); // ok
assert(memcmp(&amp;a, &amp;b, sizeof(a)) == 0); // ok
cout &lt;&lt; a.x; // UB, a.x invalid (uninitialized)
</code></pre>
<p>Der Standard unterscheided zwischen validen Werten und invaliden. Ein Objekt über unsigned char-Pointer zuzugreifen ist immer erlaubt, es auszulesen nur, wenn der Wert valide ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346811</guid><dc:creator><![CDATA[facepalm]]></dc:creator><pubDate>Sun, 18 Aug 2013 13:40:12 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sun, 18 Aug 2013 14:05:20 GMT]]></title><description><![CDATA[<p>Nun, es scheint so, dass auch ein etwas anderes Verstaendnis von UB hatte. Folgt man <a href="http://en.wikipedia.org/wiki/Undefined_behavior" rel="nofollow">http://en.wikipedia.org/wiki/Undefined_behavior</a> und anderen Artikeln folgt, so muss</p>
<pre><code class="language-cpp">int a, b;
a = b;
</code></pre>
<p>UB sein, weil das Resultat <code>a</code> der Operation <code>=</code> undefiniert ist, eben weil <code>b</code> undefiniert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346814</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Sun, 18 Aug 2013 14:05:20 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sun, 18 Aug 2013 14:23:27 GMT]]></title><description><![CDATA[<p>Bei <a href="http://Stackoverflow.com" rel="nofollow">Stackoverflow.com</a> gibt es eine ähnliche Diskussion darüber: <a href="http://stackoverflow.com/questions/14935722/does-initialization-entail-lvalue-to-rvalue-conversion-is-int-x-x-ub" rel="nofollow">Does initialization entail lvalue-to-rvalue conversion? Is `int x = x;` UB?</a><br />
Wie soll man eigentlich korrekte C++ Programme schreiben, wenn man sich noch nicht einmal darüber einig ist, was UB ist und was nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346822</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sun, 18 Aug 2013 14:23:27 GMT</pubDate></item><item><title><![CDATA[Reply to (lesender) Zugriff auf dafault-initialized Array Members UB? on Sun, 18 Aug 2013 15:09:43 GMT]]></title><description><![CDATA[<blockquote>
<p>Was jedenfalls eindeutig UB ist</p>
</blockquote>
<p>Ach, <strong>du weißt</strong> es? Woher weißt du das?</p>
<blockquote>
<p>Nicht das lvalue-to-rvalue von baz ist das Problem, sondern das lvalue-to-rvalue von baz.x (was uninitialized ist), was aber automatisch im impliziten Kopierkonstruktor vorkommt.</p>
</blockquote>
<p>Siehe oben. Woher weißt du, dass eine <em>lvalue-to-rvalue</em> Umwandlung nötig ist?</p>
<p>Th69 schrieb:</p>
<blockquote>
<p>Wie soll man eigentlich korrekte C++ Programme schreiben, wenn man sich noch nicht einmal darüber einig ist, was UB ist und was nicht?</p>
</blockquote>
<p>Der Fall &quot;initialisiere eine Variable mit einer uninitialisierten anderen Variable&quot; ist eine Ausnahme. Es gibt kaum Fälle in C++ wo es völlig unklar ist ob etwas erlaubt ist oder nicht. <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>Und: was heißt hier <strong>korrekt</strong>? Dieser hier diskutierte Fall führt schon zu sowieso nicht korrektem Code - wer schreibt sowas? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2346831</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2346831</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 18 Aug 2013 15:09:43 GMT</pubDate></item></channel></rss>