<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>www.jugpadova.it: Bug storico...</title>
    <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Java User Group [Padova]</description>
    <item>
      <title>Bug storico...</title>
      <description>&lt;p&gt;...presente nel &lt;span class="caps"&gt;JDK&lt;/span&gt;, e probabilmente nella maggior parte delle implementazioni di algoritmi con approccio &amp;#8220;divide et impera&amp;#8221;.&lt;/p&gt;


	&lt;p&gt;Quanti di noi non hanno mai scritto questa semplice e innocente riga di codice (con &lt;code&gt;low&lt;/code&gt; e &lt;code&gt;high&lt;/code&gt; di tipo &lt;code&gt;int&lt;/code&gt;)?&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;int mid = (low+high)/2;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Il problema è che la somma dei due interi può risultare in un overflow&amp;#8230;gosh&amp;#8230;&lt;/p&gt;


	&lt;p&gt;L&amp;#8217;implementazione corretta sarebbe qualcosa di simile a:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;int mid = low + ((high-low)/2);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Provate a cercare in qualunque libro di algoritmi e vedrete che anche i grandi sbagliano. Io ho guardato in &lt;a href="http://www.awprofessional.com/title/0201896850" title="Volume 3"&gt;&amp;#8216;The Art of Computer Programming&amp;#8217;&lt;/a&gt;), e anche l&amp;#8217;implementazione dell&amp;#8217;algoritmo di ricerca binaria di &lt;a href="http://www-cs-faculty.stanford.edu/~knuth/"&gt;Donald E. Knuth&lt;/a&gt; soffre dello stesso bug.&lt;/p&gt;


	&lt;p&gt;Per quanto riguarda il &lt;span class="caps"&gt;JDK&lt;/span&gt;, il bug si trova (almeno) nel metodo &lt;code&gt;binarySearch&lt;/code&gt; della classe &lt;code&gt;java.utils.Arrays&lt;/code&gt;. A me non è mai capitato, ma ve l&amp;#8217;immaginate la sorpresa (per non dire altro) di vedervi sollevare un ArrayIndexOutOfBoundsException da un metodo di quella classe?&lt;/p&gt;


	&lt;p&gt;L&amp;#8217;annuncio e la discussione del bug li fa lo stesso autore della classe, Josh Bloch, in questo &lt;a href="http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html"&gt;blog&lt;/a&gt;.&lt;/p&gt;
</description>
      <pubDate>Fri, 16 Jun 2006 07:03:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:7f51b64c-cec4-4722-a2f4-027b31a9f1fd</guid>
      <author>Lucio Benfante</author>
      <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico</link>
      <category>Programmazione</category>
      <category>bug</category>
      <category>binary</category>
      <category>search</category>
      <category>overflow</category>
      <trackback:ping>http://www.jugpadova.it/articles/trackback/923</trackback:ping>
    </item>
    <item>
      <title>"Bug storico..." by Lucio Benfante</title>
      <description>&lt;p&gt;In realtà, leggendolo più attentamente, l&amp;#8217;implementazione dell&amp;#8217;algoritmo di Knuth è corretta, ma non per il motivo espresso da riffraff.&lt;/p&gt;


	&lt;p&gt;riffraff, hai ragione se ci limitiamo alla descrizione dell&amp;#8217;algoritmo, con l&amp;#8217;ipotesi che le operazioni espresse in essa, diciamo così, &amp;#8220;in astratto&amp;#8221; vengano poi implementate in modo che ne mantangano esattamente la semantica.&lt;/p&gt;


	&lt;p&gt;Ma Knuth ne dà anche un&amp;#8217;implementazione in MIX, usando il registro A per trovare l&amp;#8217;indice intermedio:&lt;/p&gt;


&lt;pre&gt;&lt;code&gt;ENTA 0,1
INCA 0,2
SRB 1&lt;/code&gt;&lt;/pre&gt;

	&lt;p&gt;Tale registro ha la dimensione di una &amp;#8220;word&amp;#8221;, cioè 5 byte (da 6 bit) più il segno. Quindi va in overflow se si cerca di memorizzarvici un valore più grande di 1073741823.&lt;/p&gt;


	&lt;p&gt;L&amp;#8217;algoritmo però è corretto perchè ciò che viene sommato è il contenuto dei due registri I1 e I2, che sono da 2 byte più il segno, quindi la loro somma non potrà mai mandare in overflow il registro A.&lt;/p&gt;</description>
      <pubDate>Sat, 17 Jun 2006 11:32:12 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:623ea685-c671-4ff9-8872-09be0ae3d05d</guid>
      <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico#comment-1012</link>
    </item>
    <item>
      <title>"Bug storico..." by riffraff</title>
      <description>&lt;p&gt;no.. espresso male: è l&amp;#8217;interazione tra algoritmo e linguaggio, poveracci gli int no hanno niente di male in se :)&lt;/p&gt;</description>
      <pubDate>Fri, 16 Jun 2006 14:38:51 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:3d504135-bcac-406d-961e-6df0e22928ab</guid>
      <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico#comment-954</link>
    </item>
    <item>
      <title>"Bug storico..." by riffraff</title>
      <description>&lt;p&gt;non è l&amp;#8217;algoritmo sbagliato è il linguaggio, se la promozione tra tipi fosse implicita ( o se avessero usato BigInteger dall&amp;#8217;inizio) il problema non sarebbe esistito.&lt;/p&gt;


	&lt;p&gt;IIRC knuth parla dell&amp;#8217;algoritmo in astratto (i.e. parlando di limiti considera  +/- infinito ma nell&amp;#8217;aritmetica degli interi sulle cpu che conosco questi non esistono) quindi forse non si è sbagliato.. d&amp;#8217;altronde preferisco pensare che l&amp;#8217;abbia fatto :)&lt;/p&gt;</description>
      <pubDate>Fri, 16 Jun 2006 14:33:27 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f0b7ca64-14ef-41d3-bc63-45d5fe46803c</guid>
      <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico#comment-953</link>
    </item>
    <item>
      <title>"Bug storico..." by Lucio Benfante</title>
      <description>&lt;p&gt;Citando Knuth: &amp;#8220;Beware of bugs in the above code; I have only proved it 
correct, not tried it.&amp;#8221; :)&lt;/p&gt;</description>
      <pubDate>Fri, 16 Jun 2006 12:38:17 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:ecbf5edd-c029-4e7f-8125-16b98b40c588</guid>
      <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico#comment-941</link>
    </item>
    <item>
      <title>"Bug storico..." by Andrea Nasato</title>
      <description>&lt;p&gt;Beh dai, basta che l&amp;#8217;array su cui fai la ricerca binaria abbia meno di 2^30 elementi :)&lt;/p&gt;</description>
      <pubDate>Fri, 16 Jun 2006 11:50:25 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:e6738b99-dc2f-44dc-98b6-c458cb36f49e</guid>
      <link>http://www.jugpadova.it/articles/2006/06/16/bug-storico#comment-937</link>
    </item>
  </channel>
</rss>

