<?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[Wie Warning Wconversion-null vermeiden?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich probiere gerade unser Projekt warnungsfrei zu kriegen (g++: Wall, clang++: Wall + Wsign-compare). Nur g++ feuert diese Warnung:</p>
<pre><code>warning: passing NULL to non-pointer argument 1 of 'std::basic_ostream&lt;_CharT, _Traits&gt;::__ostream_type&amp; std::basic_ostream&lt;_CharT, _Traits&gt;::operator&lt;&lt;(long int) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;, std::basic_ostream&lt;_CharT, _Traits&gt;::__ostream_type = std::basic_ostream&lt;char&gt;]' [-Wconversion-null]
</code></pre>
<p>Wir haben ein Test-Makro:</p>
<pre><code>#define validateEquals(actualValue, validValue) if (!(actualValue == validValue)) { \
    _errors++; \
    _error = true; \
    std::cerr &lt;&lt; &quot;  equality test failed: &quot; &lt;&lt; actualValue &lt;&lt; &quot; instead of &quot; &lt;&lt; validValue &lt;&lt; std::endl \
              &lt;&lt; &quot;  file: &quot; &lt;&lt; __FILE__ &lt;&lt; &quot; \t line: &quot; &lt;&lt; __LINE__ &lt;&lt; std::endl \
              &lt;&lt; &quot;  statement: &quot; &lt;&lt; #actualValue &lt;&lt; &quot;==&quot;  &lt;&lt; #validValue &lt;&lt; std::endl; \
    return;\
  }
</code></pre>
<p>Und das wird an der gewarnten Stelle so aufgerufen:</p>
<pre><code>void* mesh = static_cast&lt;void*&gt; ( vertex.mesh() );
  validateEquals ( mesh, NULL );
</code></pre>
<p>Also wenn ich es richtig verstehe, ist das Problem, dass NULL==0 ist. Der Test könnte also falsch positiv sein,, wenn vertex.mesh() den Wert 0 anstelle des NULL Pointer zurückgibt.</p>
<p>Ich denke die Gefahr von falsch positiven Tests ist hier recht gering. Aber wie kann man das ganze so gestalten, dass die Warnung verschwindet?</p>
<p>nullptr ist leider keine Lösung, da wir uns z.Z. auf C++ 98 beschränken.</p>
<p>Viele Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327251/wie-warning-wconversion-null-vermeiden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 13:10:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327251.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 31 Jul 2014 10:36:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 10:37:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich probiere gerade unser Projekt warnungsfrei zu kriegen (g++: Wall, clang++: Wall + Wsign-compare). Nur g++ feuert diese Warnung:</p>
<pre><code>warning: passing NULL to non-pointer argument 1 of 'std::basic_ostream&lt;_CharT, _Traits&gt;::__ostream_type&amp; std::basic_ostream&lt;_CharT, _Traits&gt;::operator&lt;&lt;(long int) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;, std::basic_ostream&lt;_CharT, _Traits&gt;::__ostream_type = std::basic_ostream&lt;char&gt;]' [-Wconversion-null]
</code></pre>
<p>Wir haben ein Test-Makro:</p>
<pre><code>#define validateEquals(actualValue, validValue) if (!(actualValue == validValue)) { \
    _errors++; \
    _error = true; \
    std::cerr &lt;&lt; &quot;  equality test failed: &quot; &lt;&lt; actualValue &lt;&lt; &quot; instead of &quot; &lt;&lt; validValue &lt;&lt; std::endl \
              &lt;&lt; &quot;  file: &quot; &lt;&lt; __FILE__ &lt;&lt; &quot; \t line: &quot; &lt;&lt; __LINE__ &lt;&lt; std::endl \
              &lt;&lt; &quot;  statement: &quot; &lt;&lt; #actualValue &lt;&lt; &quot;==&quot;  &lt;&lt; #validValue &lt;&lt; std::endl; \
    return;\
  }
</code></pre>
<p>Und das wird an der gewarnten Stelle so aufgerufen:</p>
<pre><code>void* mesh = static_cast&lt;void*&gt; ( vertex.mesh() );
  validateEquals ( mesh, NULL );
</code></pre>
<p>Also wenn ich es richtig verstehe, ist das Problem, dass NULL==0 ist. Der Test könnte also falsch positiv sein,, wenn vertex.mesh() den Wert 0 anstelle des NULL Pointer zurückgibt.</p>
<p>Ich denke die Gefahr von falsch positiven Tests ist hier recht gering. Aber wie kann man das ganze so gestalten, dass die Warnung verschwindet?</p>
<p>nullptr ist leider keine Lösung, da wir uns z.Z. auf C++ 98 beschränken.</p>
<p>Viele Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411335</guid><dc:creator><![CDATA[Horus107]]></dc:creator><pubDate>Thu, 31 Jul 2014 10:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 10:52:42 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich würde behaupten, dass es sich um einen Bug handelt. Die Warnung besagt, dass du <code>NULL</code> als nicht-Zeiger verwendest (bei der formatierten Ausgabe an den <code>std::ostream</code> !). Das kann nicht sein da ein <code>std::ostream::operator&lt;&lt; (void const*)</code> existieren müsste, wobei dann gar keine Konvertierung von <code>NULL</code> in einen <code>long int</code> vorgenommen werden sollte.<br />
Siehe: <a href="http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt" rel="nofollow">http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt</a></p>
<p>Edit: Operator-Signatur korrigiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411337</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 31 Jul 2014 10:52:42 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 10:53:30 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Ich würde behaupten, dass es sich um einen Bug handelt.</p>
</blockquote>
<p>Bug bei mir im Programm?</p>
<blockquote>
<p>Die Warnung besagt, dass du <code>NULL</code> als nicht-Zeiger verwendest (bei der formatierten Ausgabe an den <code>std::ostream</code> !). Das kann nicht sein da ein <code>operator&lt;&lt; (std::ostream&amp;, void const*)</code> existieren müsste, wobei dann gar keine Konvertierung von <code>NULL</code> in einen <code>long int</code> vorgenommen werden sollte.<br />
Siehe: <a href="http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt" rel="nofollow">http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt</a></p>
</blockquote>
<p>Ok. Aber wie kann man das nun am besten Warnungsfrei hinkriegen? Die Ausgabe cout &lt;&lt; NULL; scheint kein echtes Problem zu sein, es wird 0 ausgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411338</guid><dc:creator><![CDATA[Horus107]]></dc:creator><pubDate>Thu, 31 Jul 2014 10:53:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 10:59:07 GMT]]></title><description><![CDATA[<p>Horus107 schrieb:</p>
<blockquote>
<p>Ok. Aber wie kann man das nun am besten Warnungsfrei hinkriegen? Die Ausgabe cout &lt;&lt; NULL; scheint kein echtes Problem zu sein, es wird 0 ausgegeben.</p>
</blockquote>
<p>Ich weiss nicht was es bringt (vielleicht auch nichts), aber du könntest mal die Zeile in der du das Makro aufrufst ändern zu:</p>
<pre><code>validateEquals ( mesh, static_cast&lt;void*&gt;(NULL) );
</code></pre>
<p>Ich glaube jetzt im nachhinein, dass es nicht einmal garantiert ist, dass <code>NULL</code> eher als Zeiger als als <code>long</code> ausgewertet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411341</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 31 Jul 2014 10:59:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 11:13:32 GMT]]></title><description><![CDATA[<p>Also, das funktioniert soweit, dass die Warnung weg ist. Allerdings ist immernoch 0==NULL, es gibt also einen Fall, wo der Test nicht fehlschlägt es aber sollte.<br />
Aber ich denke, dass kann man mal als sehr theoretisch und recht unwahrscheinlich einstufen.</p>
<p>Vielen Dank für Deine Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411344</guid><dc:creator><![CDATA[Horus107]]></dc:creator><pubDate>Thu, 31 Jul 2014 11:13:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 11:17:59 GMT]]></title><description><![CDATA[<p>Horus107 schrieb:</p>
<blockquote>
<p>Allerdings ist immernoch 0==NULL,[...]</p>
</blockquote>
<p>Und das ist auch gut so!</p>
<p>Horus107 schrieb:</p>
<blockquote>
<p>Allerdings ist immernoch 0==NULL, es gibt also einen Fall, wo der Test nicht fehlschlägt es aber sollte.<br />
Aber ich denke, dass kann man mal als sehr theoretisch und recht unwahrscheinlich einstufen.</p>
</blockquote>
<p>Ich kann dir leider nicht weiterhelfen solange ich nicht weiss, was <code>vertex::mesh()</code> tut. Jedenfalls gibt es immer genau dann einen Fehler, wenn der Rückgabewert davon nicht 0 ist, das ist hoffentlich klar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411346</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Thu, 31 Jul 2014 11:17:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 11:22:32 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Horus107 schrieb:</p>
<blockquote>
<p>Allerdings ist immernoch 0==NULL,[...]</p>
</blockquote>
<p>Und das ist auch gut so!</p>
</blockquote>
<p>Es ist (ancheinend) C++ Standard, aber eigentlich ist für mich der NULL Pointer nicht gleich dem Zahlwert 0, so rein intuitiv.</p>
<blockquote>
<p>Jedenfalls gibt es immer genau dann einen Fehler, wenn der Rückgabewert davon nicht 0 ist, das ist hoffentlich klar.</p>
</blockquote>
<p>Und das ist auch gut so! <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="🙂"
    /> Ich will ja testen, ob die Funktion einen NULL Pointer zurückgibt.</p>
<p>Aber soweit passt erstmal alles.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411347</guid><dc:creator><![CDATA[Horus107]]></dc:creator><pubDate>Thu, 31 Jul 2014 11:22:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wie Warning Wconversion-null vermeiden? on Thu, 31 Jul 2014 11:38:08 GMT]]></title><description><![CDATA[<p>NULL ist 0 (oder 0ull) in C++. NULL ist nicht ((void*)0). Grund ist, dass NULL sowohl für Zeiger als auch für Memberfunktionszeiger funktionieren sollte, aber ((void*)0) nicht in einen Memberfunktionszeiger konvertierbar ist.</p>
<p>Falls du kannst, würde ich alle NULLs mit <code>nullptr</code> ersetzen, wobei du nullptr mit</p>
<pre><code class="language-cpp">const // It is a const object...
class nullptr_t 
{
  public:
    template&lt;class T&gt;
    inline operator T*() const // convertible to any type of null non-member pointer...
    { return 0; }

    template&lt;class C, class T&gt;
    inline operator T C::*() const   // or any type of null member pointer...
    { return 0; }

  private:
    void operator&amp;() const;  // Can't take address of nullptr

} nullptr = {};
</code></pre>
<p>auch in C++98 verwenden kannst. (Der Hack wäre <code>#define NULL nullptr</code> , bessser aber von Hand ersetzen.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2411350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2411350</guid><dc:creator><![CDATA[nullbutter]]></dc:creator><pubDate>Thu, 31 Jul 2014 11:38:08 GMT</pubDate></item></channel></rss>