<?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[finde den Fehler]]></title><description><![CDATA[<p>Aus &lt;complex&gt; unverändert seit gcc-3.0</p>
<pre><code class="language-cpp">///  Extraction operator for complex values.
  template&lt;typename _Tp, typename _CharT, class _Traits&gt;
    basic_istream&lt;_CharT, _Traits&gt;&amp;
    operator&gt;&gt;(basic_istream&lt;_CharT, _Traits&gt;&amp; __is, complex&lt;_Tp&gt;&amp; __x)
    {
      _Tp __re_x, __im_x;
      _CharT __ch;
      __is &gt;&gt; __ch;
      if (__ch == '(') 
	{
	  __is &gt;&gt; __re_x &gt;&gt; __ch;
	  if (__ch == ',') 
	    {
	      __is &gt;&gt; __im_x &gt;&gt; __ch;
	      if (__ch == ')') 
		__x = complex&lt;_Tp&gt;(__re_x, __im_x);
	      else
		__is.setstate(ios_base::failbit);
	    }
	  else if (__ch == ')') 
	    __x = __re_x;
	  else
	    __is.setstate(ios_base::failbit);
	}
      else 
	{
	  __is.putback(__ch);
	  __is &gt;&gt; __re_x;
	  __x = __re_x;
	}
      return __is;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/306285/finde-den-fehler</link><generator>RSS for Node</generator><lastBuildDate>Sat, 08 Aug 2026 07:36:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/306285.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Jul 2012 20:39:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 20:39:18 GMT]]></title><description><![CDATA[<p>Aus &lt;complex&gt; unverändert seit gcc-3.0</p>
<pre><code class="language-cpp">///  Extraction operator for complex values.
  template&lt;typename _Tp, typename _CharT, class _Traits&gt;
    basic_istream&lt;_CharT, _Traits&gt;&amp;
    operator&gt;&gt;(basic_istream&lt;_CharT, _Traits&gt;&amp; __is, complex&lt;_Tp&gt;&amp; __x)
    {
      _Tp __re_x, __im_x;
      _CharT __ch;
      __is &gt;&gt; __ch;
      if (__ch == '(') 
	{
	  __is &gt;&gt; __re_x &gt;&gt; __ch;
	  if (__ch == ',') 
	    {
	      __is &gt;&gt; __im_x &gt;&gt; __ch;
	      if (__ch == ')') 
		__x = complex&lt;_Tp&gt;(__re_x, __im_x);
	      else
		__is.setstate(ios_base::failbit);
	    }
	  else if (__ch == ')') 
	    __x = __re_x;
	  else
	    __is.setstate(ios_base::failbit);
	}
      else 
	{
	  __is.putback(__ch);
	  __is &gt;&gt; __re_x;
	  __x = __re_x;
	}
      return __is;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2235025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235025</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 23 Jul 2012 20:39:18 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 20:49:32 GMT]]></title><description><![CDATA[<p>Es wird nie überprüft, ob das Einlesen erfolgreich war, daher ist der Wert von __ch jedes mal undefiniert im Fehlerfall. Des Weiteren wird in diesem Fall ein Zeichen zurück in den Stream geworfen, das dort nicht herkommt (Zeile 27).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235027</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 23 Jul 2012 20:49:32 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 21:30:03 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Es wird nie überprüft, ob das Einlesen erfolgreich war, daher ist der Wert von __ch jedes mal undefiniert im Fehlerfall. Des Weiteren wird in diesem Fall ein Zeichen zurück in den Stream geworfen, das dort nicht herkommt (Zeile 27).</p>
</blockquote>
<p>Nein. Wenn das Einlesen nicht erfolgreich war, macht das putback nichts. Und wenn der Character zufällig '(' ist, dann schlägt trotz vorherigem zufälligem Erfolg die nachfolgende Prüfung auf ',' fehl, so dass es nicht zu einem &quot;false positive&quot; kommen kann.</p>
<p>Ehrlich gesagt: Keine Ahnung, was camper meint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235036</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 21:30:03 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 21:40:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">///  Extraction operator for complex values.
  template&lt;typename _Tp, typename _CharT, class _Traits&gt;
    basic_istream&lt;_CharT, _Traits&gt;&amp;
    operator&gt;&gt;(basic_istream&lt;_CharT, _Traits&gt;&amp; __is, complex&lt;_Tp&gt;&amp; __x)
    {
      _Tp __re_x, __im_x;
      _CharT __ch;
      __is &gt;&gt; __ch; // schlägt fehlt, __ch enthält irgendwas, aber nicht '('
      if (__ch == '(') // nöp
	{
            // ...
	}
      else 
	{
	  __is.putback(__ch); // irgendwas wird zurückgeworfen
	  __is &gt;&gt; __re_x;
	  __x = __re_x;
	}
      return __is;
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2235039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235039</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 23 Jul 2012 21:40:21 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 21:51:10 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Es wird nie überprüft, ob das Einlesen erfolgreich war, daher ist der Wert von __ch jedes mal undefiniert im Fehlerfall. Des Weiteren wird in diesem Fall ein Zeichen zurück in den Stream geworfen, das dort nicht herkommt (Zeile 27).</p>
</blockquote>
<p>Das ist nicht so tragisch wie es aussieht.</p>
<p>Angenommen, das erste Einlesen läuft schief. Dann ist bei __is schon ein Failbit gesetzt.</p>
<ol>
<li>__ch ist zufällig ungleich ')': Es wird ein zufälliges Zeichen zurückgeschoben, State wird intern auf failbit gesetzt =&gt; ok</li>
<li>__ch ist zufällig gleich '(': __re_x wird eingelesen, danach wird (da sich __ch noch nicht geändert hat), der State auf failbit gesetzt =&gt; ok</li>
</ol>
<p>[quote=Standard, $26.4.6.13]Requires: The input values shall be convertible to T.<br />
If bad input is encountered, calls is.setstate(ios_base::failbit)<br />
[/quote]</p>
<p>Das einzige, was man kritisieren könnte, ist, dass nach einem clearen des States ein zufälliges Zeichen im Stream steckt. Es steht im Standard aber nichts darüber, was schon alles aus dem Stream gelesen werden sein muss.<br />
Wenn die Eingabe z.B. &quot;(1,bad)&quot; ist, steht nachher ganz sicher nicht mehr das gleiche drin.</p>
<p>Es gibt noch einen weiteren Fall: Bei &quot;__is &gt;&gt; __im_x &gt;&gt; __ch;&quot; tritt ein Fehler auf; dann ist __ch aber noch &quot;(&quot; und der State wird auf fail gesetzt =&gt; ok.</p>
<p>Das von Kellerautomat kann es also nicht sein.</p>
<p>BTW <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>:</p>
<p>Standard, $27.7.2.3.34 schrieb:</p>
<blockquote>
<p>Behaves as an unformatted input function (as described in 27.7.2.3, paragraph 1), except that<br />
the function first clears eofbit. After constructing a sentry object, if !good() calls setstate(failbit)<br />
which may throw an exception, and return. If rdbuf() is not null, calls rdbuf-&gt;sputbackc(). If<br />
rdbuf() is null, or if sputbackc() returns traits::eof(), calls setstate(badbit) (which may throw<br />
ios_base::failure (27.5.5.4)).</p>
</blockquote>
<p>Es wirft etwas zurück, aber das ist kein Problem (s.o.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235042</guid><dc:creator><![CDATA[fehlerfall]]></dc:creator><pubDate>Mon, 23 Jul 2012 21:51:10 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 21:55:10 GMT]]></title><description><![CDATA[<p>EDIT: Oh, ich hab den Fehler! Wenn rdbuf() null ist, wird setstate(badbit) gesetzt, anstatt das vorgeschriebene setstate(failbit).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235044</guid><dc:creator><![CDATA[fehlerfall]]></dc:creator><pubDate>Mon, 23 Jul 2012 21:55:10 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 21:57:11 GMT]]></title><description><![CDATA[<p>Drücke ich mich so unklar aus? Selbst der Standard stimmt mir doch zu:</p>
<blockquote>
<p><strong>Behaves as an unformatted input function (as described in 27.7.2.3, paragraph 1),</strong> except that<br />
the function first clears eofbit. After constructing a sentry object, if !good() calls setstate(failbit)<br />
which may throw an exception, and return. If rdbuf() is not null, calls rdbuf-&gt;sputbackc(). If<br />
rdbuf() is null, or if sputbackc() returns traits::eof(), calls setstate(badbit) (which may throw<br />
ios_base::failure (27.5.5.4)).</p>
</blockquote>
<p>Das heißt es passiert im Fehlerfall <strong>nichts</strong>!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235045</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 21:57:11 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 22:00:00 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Drücke ich mich so unklar aus?</p>
</blockquote>
<p>Nein, nicht du, der Standard. In dem Fall sehe ich den Fehler doch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235047</guid><dc:creator><![CDATA[fehlerfall]]></dc:creator><pubDate>Mon, 23 Jul 2012 22:00:00 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 22:22:19 GMT]]></title><description><![CDATA[<p>Und soweit ich weiß, ist es undefiniert, ein Zeichen in einen Stream zu putback()-en, wenn man vorher noch keins rausgenommen hat...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235056</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 23 Jul 2012 22:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 22:31:12 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Und soweit ich weiß, ist es undefiniert, ein Zeichen in einen Stream zu putback()-en, wenn man vorher noch keins rausgenommen hat...</p>
</blockquote>
<p>Man hat ja auch keines rausgenommen, schließlich ist die Aktion gescheitert. Dann scheitert auch putback, da zwischenzeitlich kein clear erfolgt.</p>
<p>War das Lesen jedoch erfolgreich, dann ist auch das (dann funktionierende) putback wohldefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235063</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 22:31:12 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 22:42:36 GMT]]></title><description><![CDATA[<p>Ok, so gut kenne ich mich mit den IO-Streams nicht aus. Dann ist der Fehler, dass der Wert von __x im Fehlerfall verändert wird, nämlich auf den undefinierten Wert von __re_x.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235071</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 23 Jul 2012 22:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 22:43:44 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Ok, so gut kenne ich mich mit den IO-Streams nicht aus. Dann ist der Fehler, dass der Wert von __x im Fehlerfall verändert wird, nämlich auf den undefinierten Wert von __re_x.</p>
</blockquote>
<p>Auch dies ist bei den IO-Streams so vorgesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235072</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 22:43:44 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 22:44:49 GMT]]></title><description><![CDATA[<p>Wenn das einlesen fehlschlägt, sollte das Objekt doch unverändert bleiben, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235073</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 23 Jul 2012 22:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 23:00:37 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Wenn das einlesen fehlschlägt, sollte das Objekt doch unverändert bleiben, oder nicht?</p>
</blockquote>
<p>Wird oft so angenommen, ist aber im Allgemeinen falsch. Zumindest ist es nicht so bei short, int, float, double, bool &amp; Co., die hier wohl imitiert werden sollen.</p>
<p>Jetzt wirst du sicherlich einwenden, dass dann auch hier nicht sicher ist, dass __ch nicht verändert wird, das wäre aber auch falsch, da für char wieder andere Regeln gelten.</p>
<p>Ja, die ganzen Regeln sind teilweise ziemlich arkan, man muss sich wirklich tief reindenken, um zu sehen, was der Sinn hinter den Definitionen ist. Im alten Standard war auch einiges sehr schlecht formuliert, das wurde in C++11 verbessert.</p>
<p>Einen Fehler sehe ich aber immer noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235080</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 23:00:37 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 23:11:16 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Einen Fehler sehe ich aber immer noch nicht.</p>
</blockquote>
<p>Hast du doch schon angesprochen:<br />
Falls</p>
<pre><code class="language-cpp">__is &gt;&gt; __ch
</code></pre>
<p>fehlschlägt, hat __ch weiter einen unbestimmten Wert, die folgende Abfrage wäre also UB. I.d.R. wird der Code sicher trotzdem funktionieren, allerdings wird valgrind damit nicht glücklich.<br />
Die Zeichextraktoren verhalten sich bei Fehler anders als die arthmetischen Extraktoren, denn im Fehlerfall gibt num_get im Zweifel 0 zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235083</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 23 Jul 2012 23:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Mon, 23 Jul 2012 23:31:57 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Einen Fehler sehe ich aber immer noch nicht.</p>
</blockquote>
<p>Hast du doch schon angesprochen:<br />
Falls</p>
<pre><code class="language-cpp">__is &gt;&gt; __ch
</code></pre>
<p>fehlschlägt, hat __ch weiter einen unbestimmten Wert, die folgende Abfrage wäre also UB.</p>
</blockquote>
<p>Laut Standard vielleicht, der Implementierer des GCC weiß aber ganz genau (und wir ebenfalls), dass der Computer nicht wirklich die Festplatte löschen wird, sondern bloß gegen irgendeinen Müllwert vergleicht. Da er beide Pfade abgedeckt hat (entweder ist das Zeichen zufällig '(' oder eben nicht), kann also nichts passieren.</p>
<blockquote>
<p>I.d.R. wird der Code sicher trotzdem funktionieren, allerdings wird valgrind damit nicht glücklich.</p>
</blockquote>
<p>valgrind defineirt aber nicht, was ein Fehler ist oder nicht, sondern im Zweifelsfalle die korrekte Funktion unter allen Umständen. Diese ist gegeben, sofern man den Code nur mit dem GCC (oder einem anderen nicht-geisteskranken Compiler) übersetzt.</p>
<blockquote>
<p>Die Zeichextraktoren verhalten sich bei Fehler anders als die arthmetischen Extraktoren, denn im Fehlerfall gibt num_get im Zweifel 0 zurück.</p>
</blockquote>
<p>Hmm, eigentlich lese ich den Standard so, dass bei char-Typen keine Änderung erfolgt:</p>
<blockquote>
<p>template&lt;class charT, class traits&gt;<br />
basic_istream&lt;charT,traits&gt;&amp; operator&gt;&gt;(basic_istream&lt;charT,traits&gt;&amp; in,<br />
charT&amp; c);<br />
template&lt;class traits&gt;<br />
basic_istream&lt;char,traits&gt;&amp; operator&gt;&gt;(basic_istream&lt;char,traits&gt;&amp; in,<br />
unsigned char&amp; c);<br />
template&lt;class traits&gt;<br />
basic_istream&lt;char,traits&gt;&amp; operator&gt;&gt;(basic_istream&lt;char,traits&gt;&amp; in,<br />
signed char&amp; c);</p>
<p>Eﬀects: Behaves like a formatted input member (as described in 27.7.2.2.1) of in. After a sentry<br />
object is constructed a character is extracted from in, if one is available, and stored in c. Otherwise,<br />
the function calls in.setstate(failbit).</p>
</blockquote>
<p>Da steht weder was von num_get, noch dass das c im Fehlerfall überhaupt angepackt wird. Bei den &quot;formatted input membern&quot; steht auch nur allgemeines Gelaber, num_get taucht erst speziell bei den &quot;arithmetic extractors&quot; auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235090</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 23 Jul 2012 23:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 00:23:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Einen Fehler sehe ich aber immer noch nicht.</p>
</blockquote>
<p>Hast du doch schon angesprochen:<br />
Falls</p>
<pre><code class="language-cpp">__is &gt;&gt; __ch
</code></pre>
<p>fehlschlägt, hat __ch weiter einen unbestimmten Wert, die folgende Abfrage wäre also UB.</p>
</blockquote>
<p>Laut Standard vielleicht, der Implementierer des GCC weiß aber ganz genau (und wir ebenfalls), dass der Computer nicht wirklich die Festplatte löschen wird, sondern bloß gegen irgendeinen Müllwert vergleicht. Da er beide Pfade abgedeckt hat (entweder ist das Zeichen zufällig '(' oder eben nicht), kann also nichts passieren.</p>
</blockquote>
<p>Du bist also gcc-Entwickler? Für mich sieht das erher so aus als ob der Compiler auf die Idee kommen könnte, den Extraktor zu inlinen und dann zu entscheiden, dass der Kontrollpfad, der Fehlschlag anzeigt, nie betreten werden wird, folglich eliminiert werden kann, weil ja andernfalls UB die Folge wäre.<br />
Wenn das bis jetzt noch nicht passiert ist, dann vielleicht nur, weil noch niemand die richtige Kombination aus -O99 -funroll-everything und -finline-limit=infinite gefunden hat.</p>
<blockquote>
<p>I.d.R. wird der Code sicher trotzdem funktionieren, allerdings wird valgrind damit nicht glücklich.</p>
</blockquote>
<p>valgrind defineirt aber nicht, was ein Fehler ist oder nicht, sondern im Zweifelsfalle die korrekte Funktion unter allen Umständen. Diese ist gegeben, sofern man den Code nur mit dem GCC (oder einem anderen nicht-geisteskranken Compiler) übersetzt.[/quote]Das kommentiere ich jetzt mal nicht.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<p>Die Zeichextraktoren verhalten sich bei Fehler anders als die arthmetischen Extraktoren, denn im Fehlerfall gibt num_get im Zweifel 0 zurück.</p>
</blockquote>
<p>Hmm, eigentlich lese ich den Standard so, dass bei char-Typen keine Änderung erfolgt:</p>
</blockquote>
<p>genau.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235096</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Jul 2012 00:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 01:23:32 GMT]]></title><description><![CDATA[<p>Das selbe Problem gibt's dann nochmal mit <code>__re_x</code> im äusseren <code>else</code> Zweig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235100</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Jul 2012 01:23:32 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 01:37:33 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Das selbe Problem gibt's dann nochmal mit <code>__re_x</code> im äusseren <code>else</code> Zweig.</p>
</blockquote>
<p>Das ist dann aber ein arithmetischer Extraktor, der num_get aufruft, und dabei kommt dann 0 heraus.<br />
Ich habe jetzt erst mal mit</p>
<pre><code class="language-cpp">+      if (__is.fail())
+        {
+          __x = _Tp();
+        }
+      else if (__ch == '(')
-      if (__ch == '(')
</code></pre>
<p>gepatcht, und das beseitigt das Problem fürs Erste.<br />
__ch zu intialisieren dürfte auch helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235102</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Jul 2012 01:37:33 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 02:45:47 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Das selbe Problem gibt's dann nochmal mit <code>__re_x</code> im äusseren <code>else</code> Zweig.</p>
</blockquote>
<p>Das ist dann aber ein arithmetischer Extraktor, der num_get aufruft, und dabei kommt dann 0 heraus.</p>
</blockquote>
<p>ich = Brett vorm Kopf<br />
Das mit num_get hattest du ja schon geschrieben. Ich hab's auch gelesen und mir gedacht &quot;aha, sehr interessant, jaja *mit-dem-kopf-nicke*&quot;.<br />
10 Sekunden später war's anscheinend wieder weg *g*.</p>
<p>Naja, danke für die wiederholte Erklärung <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/2235106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235106</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 24 Jul 2012 02:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 07:36:16 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Für mich sieht das erher so aus als ob der Compiler auf die Idee kommen könnte, den Extraktor zu inlinen und dann zu entscheiden, dass der Kontrollpfad, der Fehlschlag anzeigt, nie betreten werden wird, folglich eliminiert werden kann, weil ja andernfalls UB die Folge wäre.</p>
</blockquote>
<p>Wage ich zu bezweifeln.<br />
Der Compiler &quot;denkt&quot; ja nicht in UB oder nicht UB. Weil UB ist ja nur ein Standardausdruck. UB gibt es ja nicht. Es ist immer definiert was passiert.</p>
<p>Auch wenn man uU alle Variablen kennen muss um es vorauszusagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235123</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 24 Jul 2012 07:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 08:39:14 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Für mich sieht das erher so aus als ob der Compiler auf die Idee kommen könnte, den Extraktor zu inlinen und dann zu entscheiden, dass der Kontrollpfad, der Fehlschlag anzeigt, nie betreten werden wird, folglich eliminiert werden kann, weil ja andernfalls UB die Folge wäre.</p>
</blockquote>
<p>Wage ich zu bezweifeln.<br />
Der Compiler &quot;denkt&quot; ja nicht in UB oder nicht UB. Weil UB ist ja nur ein Standardausdruck. UB gibt es ja nicht. Es ist immer definiert was passiert.</p>
<p>Auch wenn man uU alle Variablen kennen muss um es vorauszusagen.</p>
</blockquote>
<p>Der Compiler &quot;denkt&quot; in impliziten Nebenbedingungen.<br />
In</p>
<pre><code class="language-cpp">int x; cin &gt;&gt; x;
if ( x * x &gt;= x )
   cout &lt;&lt; x;
else
   cout &lt;&lt; &quot;Überlauf&quot;;
</code></pre>
<p>&quot;weiß&quot; der Compiler, dass die Bedingung überflüssig ist, und wird sie eliminieren.</p>
<p>Und - um auf den ursprünglichen Code zurückzukommen - durch statische Analyse zu entdecken, dass in einem Ausführungspfad auf eine nicht initialisierte Variable zugegriffen wird, ist in solchen relative einfachen Fällen durchaus möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235138</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Jul 2012 08:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 08:41:20 GMT]]></title><description><![CDATA[<p>Ein schlechts Beispiel. Was ist wenn x hinreichend groß ist und ein Overflow entsteht?</p>
<p>Und die Ausgabe Overflow ist auch blödsinn, weil bei x*x so zu sagen mehrere Overflows entstehen können</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235143</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Tue, 24 Jul 2012 08:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 08:51:32 GMT]]></title><description><![CDATA[<p>Ramanujan schrieb:</p>
<blockquote>
<p>Ein schlechts Beispiel. Was ist wenn x hinreichend groß ist und ein Overflow entsteht?</p>
</blockquote>
<p>Dann hat man undefiniertes Verhalten.<br />
Das heißt im Klartext:<br />
entweder es gibt keinen Überlauf, dann ist x*x &gt;=x.<br />
oder es gibt undefiniertes Verhalten, dann kann <em>alles</em> passieren, z.B. x ausgegeben werden oder das übergelaufenene Etwas als &gt;= x gelten. Zusammengenommen ist es völlig legitim, wenn in jedem Fall x ausgegeben wird, also kann der Optimizer sich die Abfrage und den else-Zweig sparen und völlig standardkonform bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235147</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 24 Jul 2012 08:51:32 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 08:54:21 GMT]]></title><description><![CDATA[<p>Ramanujan schrieb:</p>
<blockquote>
<p>Ein schlechts Beispiel. Was ist wenn x hinreichend groß ist und ein Overflow entsteht?</p>
</blockquote>
<p>Das ist es, worauf camper hinauswill. Ein arithmetischer Überlauf ist an der Stelle undefiniertes Verhalten, deshalb <strong>darf der Compiler diesen Fall ignorieren</strong> und so tun, als gäbe es hier nie Überlauf. Er darf also annehmen, dass die Bedingung immer true ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235150</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 24 Jul 2012 08:54:21 GMT</pubDate></item><item><title><![CDATA[Reply to finde den Fehler on Tue, 24 Jul 2012 09:34:04 GMT]]></title><description><![CDATA[<p>Hm, ok. Ist dann auch sowas undefiniert:</p>
<p>unsigned u = -1;</p>
<p>Oder kann man davon ausgehen, dass in u die Zahl 2^32 - 1 steht, falls int 32 bit groß ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2235165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2235165</guid><dc:creator><![CDATA[Ramanujan]]></dc:creator><pubDate>Tue, 24 Jul 2012 09:34:04 GMT</pubDate></item></channel></rss>