<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Enodev.fr / Christophe's log (Posts about Clang)</title><link>https://www.enodev.fr/</link><description></description><atom:link href="https://www.enodev.fr/categories/clang.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Tue, 16 Jan 2024 22:07:07 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Given enough compilers, all bugs are shallow</title><link>https://www.enodev.fr/posts/given-enough-compilers-all-bugs-are-shallow.html</link><dc:creator>Christophe Vu-Brugier</dc:creator><description>&lt;p&gt;This post title is a poorly paraphrased version of
&lt;a href="https://en.wikipedia.org/wiki/Linus's_Law"&gt;Linus' law&lt;/a&gt; &lt;em&gt;"given enough
eyeballs, all bugs are shallow"&lt;/em&gt;. What I want to illustrate is that
using more than one compiler allows to notice more bugs.&lt;/p&gt;
&lt;p&gt;I compiled some C++ code at work with Clang instead of GCC and it
spotted the following issue with &lt;code&gt;sleep()&lt;/code&gt; that GCC ignored:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As noticed by Clang, the argument of sleep is an &lt;code&gt;unsigned int&lt;/code&gt;, so
&lt;code&gt;sleep(0.5)&lt;/code&gt; is converted to &lt;code&gt;sleep(0)&lt;/code&gt;. This is what happens when
Pythonistas dare write some C code (Python's &lt;code&gt;time.sleep()&lt;/code&gt; accepts a
floating point number of seconds).&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;clang-3.8&lt;span class="w"&gt; &lt;/span&gt;-Wall&lt;span class="w"&gt; &lt;/span&gt;-Werror&lt;span class="w"&gt; &lt;/span&gt;test-sleep.c&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;test-sleep
&lt;span class="go"&gt;test-sleep.c:5:8: error: implicit conversion from 'double' to 'unsigned int' changes value from 0.5 to 0 [-Werror,-Wliteral-conversion]&lt;/span&gt;
&lt;span class="go"&gt;        sleep(0.5);&lt;/span&gt;
&lt;span class="go"&gt;        ~~~~~ ^~~&lt;/span&gt;
&lt;span class="go"&gt;1 error generated.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This is not to say that Clang is better than GCC: both are great
compilers. But the effort of compiling a code base with GCC and Clang
is worth it because it catches more bugs.&lt;/p&gt;</description><category>C</category><category>Clang</category><category>GCC</category><category>Programming</category><guid>https://www.enodev.fr/posts/given-enough-compilers-all-bugs-are-shallow.html</guid><pubDate>Sun, 31 Jan 2016 17:00:00 GMT</pubDate></item></channel></rss>