<?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[Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels)]]></title><description><![CDATA[<p>Hey, nachdem ich den gestern hier verlinkten Artikel <a href="http://blog.regehr.org/archives/213" rel="nofollow">(Hier)</a> über undefiniertes Verhalten in C/C++ gelesen hab, ist mir eine Frage gekommen:<br />
Als Beispiel für eine &quot;Type 3 Function&quot;, also eine Funktion, die immer undeiniertes Verhalten an den Tag legt, steht:</p>
<blockquote>
<p>For example, a function that — regardless of input — uses a variable without initializing it is easy to unintentionally write.</p>
</blockquote>
<p>Heißt das jetzt: jedesmal, wenn ich eine nicht initialisierte Variable vewende, ist das undefiniertes Verhalten?</p>
<pre><code class="language-cpp">unsigned function()
{
   int i;
   return i; //definiert?
}
</code></pre>
<p>Darf der Compiler meien Funktion wegoptimieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Was ich dazu im C++-Standard gefunden hab, hat mich irgendwie nicht schlauer werden lassen. Da steht unter 4.10</p>
<blockquote>
<p><em>An lvalue (3.10) of a non-function, non-array type T can be converted to an rvalue. If T is an incomplete type, a program<br />
that necessitates this conversion is ill-formed. If the object to which the lvalue refers is not an object of type T and is<br />
not an object of a type derived from T, or if the object is uninitialized, a program that necessitates this conversion has<br />
undefined behavior.</em></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/287033/frage-zu-undefiniertem-verhalten-bezüglich-des-letzens-verlinkten-artikels</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 17:29:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287033.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 May 2011 18:56:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 18:56:24 GMT]]></title><description><![CDATA[<p>Hey, nachdem ich den gestern hier verlinkten Artikel <a href="http://blog.regehr.org/archives/213" rel="nofollow">(Hier)</a> über undefiniertes Verhalten in C/C++ gelesen hab, ist mir eine Frage gekommen:<br />
Als Beispiel für eine &quot;Type 3 Function&quot;, also eine Funktion, die immer undeiniertes Verhalten an den Tag legt, steht:</p>
<blockquote>
<p>For example, a function that — regardless of input — uses a variable without initializing it is easy to unintentionally write.</p>
</blockquote>
<p>Heißt das jetzt: jedesmal, wenn ich eine nicht initialisierte Variable vewende, ist das undefiniertes Verhalten?</p>
<pre><code class="language-cpp">unsigned function()
{
   int i;
   return i; //definiert?
}
</code></pre>
<p>Darf der Compiler meien Funktion wegoptimieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Was ich dazu im C++-Standard gefunden hab, hat mich irgendwie nicht schlauer werden lassen. Da steht unter 4.10</p>
<blockquote>
<p><em>An lvalue (3.10) of a non-function, non-array type T can be converted to an rvalue. If T is an incomplete type, a program<br />
that necessitates this conversion is ill-formed. If the object to which the lvalue refers is not an object of type T and is<br />
not an object of a type derived from T, or if the object is uninitialized, a program that necessitates this conversion has<br />
undefined behavior.</em></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2066529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066529</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Fri, 20 May 2011 18:56:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 19:02:11 GMT]]></title><description><![CDATA[<p>&quot;undefiniertes Verhalten&quot; bedeutet, daß alles passieren kann. Und wenn er beim Aufruf die Definition vor sich hat (Stichwort: Inlining), kann er die Funktion sicher auch komplett wegoptimieren.<br />
Im Normalfall wird es die Funktion trotzdem geben, weil der Compiler irgendwas für den Linker zur Verfügung stellen muß.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066531</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 20 May 2011 19:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 19:04:41 GMT]]></title><description><![CDATA[<p>Eine <strong>lokale</strong> nicht initialisierte Variabel hat keinen definierten Wert und die Verwendung dieser Variabel führt somit zu UB. Somit ist auch der Rückgabewert deiner Beispielfunktion undefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066534</guid><dc:creator><![CDATA[löälöä]]></dc:creator><pubDate>Fri, 20 May 2011 19:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 19:15:25 GMT]]></title><description><![CDATA[<p>asdfasd schrieb:</p>
<blockquote>
<p>Hey, nachdem ich den gestern hier verlinkten Artikel <a href="http://blog.regehr.org/archives/213" rel="nofollow">(Hier)</a> über undefiniertes Verhalten in C/C++ gelesen hab, ist mir eine Frage gekommen:<br />
Als Beispiel für eine &quot;Type 3 Function&quot;, also eine Funktion, die immer undeiniertes Verhalten an den Tag legt, steht:</p>
<blockquote>
<p>For example, a function that — regardless of input — uses a variable without initializing it is easy to unintentionally write.</p>
</blockquote>
<p>Heißt das jetzt: jedesmal, wenn ich eine nicht initialisierte Variable vewende, ist das undefiniertes Verhalten?</p>
<pre><code class="language-cpp">unsigned function()
{
   int i;
   return i; //definiert?
}
</code></pre>
<p>Darf der Compiler meien Funktion wegoptimieren? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Was ich dazu im C++-Standard gefunden hab, hat mich irgendwie nicht schlauer werden lassen. Da steht unter 4.10</p>
<blockquote>
<p><em>An lvalue (3.10) of a non-function, non-array type T can be converted to an rvalue. If T is an incomplete type, a program<br />
that necessitates this conversion is ill-formed. If the object to which the lvalue refers is not an object of type T and is<br />
not an object of a type derived from T, or if the object is uninitialized, a program that necessitates this conversion has<br />
undefined behavior.</em></p>
</blockquote>
</blockquote>
<p>Das ist schon mal ein Anfang. Die Frage, die sich stellt, ist, ob obiges return-statement eine solche Konvertierung bedingt.</p>
<p>Um das herauszufinden, schauen wir als erstes, was der Standard zu return zu sagen hat (6.6.3):</p>
<blockquote>
<p>A return statement with an expression of non-void type can be used only in functions returning a value; the value of the expression is<br />
returned to the caller of the function. The expression is implicitly converted to the return type of the function in which it appears.</p>
</blockquote>
<p>Der Typ des Rückgabewertes ist int. Der Typ des Argumentes is signed. Also brauchen wir schon mal eine integrlae Konvertierung int-&gt;unsigned (4.7). Diese Konvertierung arbeite allerdings nur mit rvalues, also muss das lvalue zunächst in ein rvalue konvertiert werden (4.1). Die gesamte Konvertierungsprozess ergibt damit eine Standardkonvertierungssequenz (Abschnitt 4).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066539</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 20 May 2011 19:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 19:20:32 GMT]]></title><description><![CDATA[<p>löälöä schrieb:</p>
<blockquote>
<p>Eine <strong>lokale</strong> nicht initialisierte Variabel hat keinen definierten Wert und die Verwendung dieser Variabel führt somit zu UB. Somit ist auch der Rückgabewert deiner Beispielfunktion undefiniert.</p>
</blockquote>
<p>Was genau meinst du mit Verwendung? Wäre denn das hier definiert?</p>
<pre><code class="language-cpp">unsigned i; //nicht initialisierte, lokale Variable
i = 3+4; //Zuweisung legal?
</code></pre>
<p>Abgesehen davon, dass der Kompiler das optimieren wird - wird jetzt i in deinem Sinne &quot;verwendet&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066540</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Fri, 20 May 2011 19:20:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 19:25:03 GMT]]></title><description><![CDATA[<p>asdfasd schrieb:</p>
<blockquote>
<p>löälöä schrieb:</p>
<blockquote>
<p>Eine <strong>lokale</strong> nicht initialisierte Variabel hat keinen definierten Wert und die Verwendung dieser Variabel führt somit zu UB. Somit ist auch der Rückgabewert deiner Beispielfunktion undefiniert.</p>
</blockquote>
<p>Was genau meinst du mit Verwendung? Wäre denn das hier definiert?</p>
</blockquote>
<p>In dem Zusammenhang ist Verwendung im Sinne von &quot;Wert verwenden&quot; gemeint - das heißt die Zuweisung auf eine nicht-initialisierte Variable ist klar definiert (Anweisungen wie <code>i+=5;</code> oder <code>++i;</code> sind dagegen undefiniert, wenn i nicht initialisiert ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066541</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 20 May 2011 19:25:03 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 19:26:13 GMT]]></title><description><![CDATA[<p>Ah, sehr gut!<br />
Danke an alle, die so schnell und kompetent geantwortet haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066542</guid><dc:creator><![CDATA[asdfasd]]></dc:creator><pubDate>Fri, 20 May 2011 19:26:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 19:57:38 GMT]]></title><description><![CDATA[<p>Wir können das Ganze interessanter machen. Wir nehmen an, dass unsigned keine Traprepräsentation hat.</p>
<pre><code class="language-cpp">unsigned foo()
{
   unsigned i;
   std::memmove( &amp;i, &amp;i, sizeof i );
   return i;
}
</code></pre>
<p>definiert 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>
]]></description><link>https://www.c-plusplus.net/forum/post/2066553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066553</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 20 May 2011 19:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 20:57:02 GMT]]></title><description><![CDATA[<p>Es ist ein klein wenig komplizierter. Der Standard unterscheidet zwischen undefiniertem und unspezifiziertem Verhalten.</p>
<p>Undefiniertes Verhalten bedeutet, dass der Standard keinerlei Bedingungen für das Verhalten des Programms setzt - Buffer-Overflows, wilde Zeiger und so fallen in diese Kategorie.</p>
<p>Unspezifiziertes Verhalten betrifft korrekte Programme, deren Verhalten von der Implementation abhängt. Dieses Verhalten muss nicht dokumentiert sein. Uninitialisierte Variablen fallen <strong>unter Umständen</strong> darunter. Zum Beispiel ist</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main() {
  int i;
  std::cout &lt;&lt; i &lt;&lt; std::endl;
}
</code></pre>
<p>ein gültiges Programm, aber was es ausgibt, ist vom Standard nicht vorgegeben. Dagegen erzeugt</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main() {
  int i;
  int array[10] = { };
  std::cout &lt;&lt; array[i] &lt;&lt; std::endl;
}
</code></pre>
<p>undefiniertes Verhalten (sofern die Implementation für i nicht einen Wert zwischen 0 und 9 spezifiziert).</p>
<p>So ist das Verhalten von campers foo-Funktion definiert, aber der Rückgabewert ist nicht spezifiziert. Es ist dann natürlich leicht möglich, mit unspezifizierten Werten undefiniertes Verhalten zu erzeugen.</p>
<p>Ref. ISO/IEC 14882:2003 1.3.11 und 1.3.12.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066583</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 20 May 2011 20:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Fri, 20 May 2011 22:25:14 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Zum Beispiel ist</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main() {
  int i;
  std::cout &lt;&lt; i &lt;&lt; std::endl;
}
</code></pre>
</blockquote>
<p>undefiniert. Der Funktionsaufruf (&lt;&lt;) bedingt ein l- zu rvalue Konvertierung für das Argument i, um den 2. Funktionsparameter zu initialisieren, und das führt zu UB (4.1).</p>
<blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main() {
  int i;
  int array[10] = { };
  std::cout &lt;&lt; array[i] &lt;&lt; std::endl;
}
</code></pre>
<p>undefiniertes Verhalten (sofern die Implementation für i nicht einen Wert zwischen 0 und 9 spezifiziert).</p>
</blockquote>
<p>Ebenso unbedingt undefiniert. der []-Operator benötigt rvalues als Operanden.</p>
<blockquote>
<p>So ist das Verhalten von campers foo-Funktion definiert, aber der Rückgabewert ist nicht spezifiziert.</p>
</blockquote>
<p>Das ist die Frage. Jedenfalls lassen sich auch Argumente dafür finden, dass das Ganze undefiniert wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066603</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 20 May 2011 22:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Sat, 21 May 2011 02:18:06 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<blockquote>
<p>So ist das Verhalten von campers foo-Funktion definiert, aber der Rückgabewert ist nicht spezifiziert.</p>
</blockquote>
<p>Das ist die Frage. Jedenfalls lassen sich auch Argumente dafür finden, dass das Ganze undefiniert wäre.</p>
</blockquote>
<p>Machs doch nicht so spannend, was fällt dir da z.B. ein?<br />
Ich kann mir grad nix vorstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066618</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 21 May 2011 02:18:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu undefiniertem Verhalten (bezüglich des letzens verlinkten Artikels) on Sat, 21 May 2011 04:03:37 GMT]]></title><description><![CDATA[<p>Warum überleg ihr, was passiert, wenn man Müll programmiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2066620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2066620</guid><dc:creator><![CDATA[Ohjehhhh]]></dc:creator><pubDate>Sat, 21 May 2011 04:03:37 GMT</pubDate></item></channel></rss>