Subject: bug#38369: closed (Re: bug#38369: Guile 2.9.5 miscompiles crc32 procedure)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 17 Jan 2020 13:55:02 +0000

Your bug report

#38369: Guile 2.9.5 miscompiles crc32 procedure

which was filed against the guile package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
38369: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=38369
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#38369: Guile 2.9.5 miscompiles crc32 procedure
From: Ludovic Courtès <[email-masked]>
To: [email-masked], Andy Wingo <[email-masked]>
Date: Fri, 17 Jan 2020 14:54:26 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Ludovic Courtès <[email-masked]> skribis:

> The valid result is:
>
> scheme@(guix build debug-link)> (debuglink-crc32 (open-input-string "a"))
> $5 = 3904355907
> scheme@(guix build debug-link)> (version)
> $6 = "2.2.6"
>
>
> The incorrect result is:
>
> scheme@(guix build debug-link)> (debuglink-crc32 (open-input-string "a"))
> $9 = 397917763
> scheme@(guix build debug-link)> (version)
> $10 = "2.9.5"

This was fixed in 08bd2f0dcb42a281596cacc714ad476e872d441d (in 2.9.7).

Ludo’.

Subject: Guile 2.9.5 miscompiles crc32 procedure
From: Ludovic Courtès <[email-masked]>
To: [email-masked]
Date: Sun, 24 Nov 2019 21:56:07 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

The (guix build debug-link) module has this function:

--8<---------------cut here---------------start------------->8---
(define %crc32-table
  ;; CRC table taken from "(gdb) Separate Debug Files".
  ;; TODO: Wouldn't it be nice to generate it "from source" with a macro?
  #(#x00000000 #x77073096 #xee0e612c #x990951ba #x076dc419
    #x706af48f #xe963a535 #x9e6495a3 #x0edb8832 #x79dcb8a4
    #xe0d5e91e #x97d2d988 #x09b64c2b #x7eb17cbd #xe7b82d07
    #x90bf1d91 #x1db71064 #x6ab020f2 #xf3b97148 #x84be41de
    #x1adad47d #x6ddde4eb #xf4d4b551 #x83d385c7 #x136c9856
    #x646ba8c0 #xfd62f97a #x8a65c9ec #x14015c4f #x63066cd9
    #xfa0f3d63 #x8d080df5 #x3b6e20c8 #x4c69105e #xd56041e4
    #xa2677172 #x3c03e4d1 #x4b04d447 #xd20d85fd #xa50ab56b
    #x35b5a8fa #x42b2986c #xdbbbc9d6 #xacbcf940 #x32d86ce3
    #x45df5c75 #xdcd60dcf #xabd13d59 #x26d930ac #x51de003a
    #xc8d75180 #xbfd06116 #x21b4f4b5 #x56b3c423 #xcfba9599
    #xb8bda50f #x2802b89e #x5f058808 #xc60cd9b2 #xb10be924
    #x2f6f7c87 #x58684c11 #xc1611dab #xb6662d3d #x76dc4190
    #x01db7106 #x98d220bc #xefd5102a #x71b18589 #x06b6b51f
    #x9fbfe4a5 #xe8b8d433 #x7807c9a2 #x0f00f934 #x9609a88e
    #xe10e9818 #x7f6a0dbb #x086d3d2d #x91646c97 #xe6635c01
    #x6b6b51f4 #x1c6c6162 #x856530d8 #xf262004e #x6c0695ed
    #x1b01a57b #x8208f4c1 #xf50fc457 #x65b0d9c6 #x12b7e950
    #x8bbeb8ea #xfcb9887c #x62dd1ddf #x15da2d49 #x8cd37cf3
    #xfbd44c65 #x4db26158 #x3ab551ce #xa3bc0074 #xd4bb30e2
    #x4adfa541 #x3dd895d7 #xa4d1c46d #xd3d6f4fb #x4369e96a
    #x346ed9fc #xad678846 #xda60b8d0 #x44042d73 #x33031de5
    #xaa0a4c5f #xdd0d7cc9 #x5005713c #x270241aa #xbe0b1010
    #xc90c2086 #x5768b525 #x206f85b3 #xb966d409 #xce61e49f
    #x5edef90e #x29d9c998 #xb0d09822 #xc7d7a8b4 #x59b33d17
    #x2eb40d81 #xb7bd5c3b #xc0ba6cad #xedb88320 #x9abfb3b6
    #x03b6e20c #x74b1d29a #xead54739 #x9dd277af #x04db2615
    #x73dc1683 #xe3630b12 #x94643b84 #x0d6d6a3e #x7a6a5aa8
    #xe40ecf0b #x9309ff9d #x0a00ae27 #x7d079eb1 #xf00f9344
    #x8708a3d2 #x1e01f268 #x6906c2fe #xf762575d #x806567cb
    #x196c3671 #x6e6b06e7 #xfed41b76 #x89d32be0 #x10da7a5a
    #x67dd4acc #xf9b9df6f #x8ebeeff9 #x17b7be43 #x60b08ed5
    #xd6d6a3e8 #xa1d1937e #x38d8c2c4 #x4fdff252 #xd1bb67f1
    #xa6bc5767 #x3fb506dd #x48b2364b #xd80d2bda #xaf0a1b4c
    #x36034af6 #x41047a60 #xdf60efc3 #xa867df55 #x316e8eef
    #x4669be79 #xcb61b38c #xbc66831a #x256fd2a0 #x5268e236
    #xcc0c7795 #xbb0b4703 #x220216b9 #x5505262f #xc5ba3bbe
    #xb2bd0b28 #x2bb45a92 #x5cb36a04 #xc2d7ffa7 #xb5d0cf31
    #x2cd99e8b #x5bdeae1d #x9b64c2b0 #xec63f226 #x756aa39c
    #x026d930a #x9c0906a9 #xeb0e363f #x72076785 #x05005713
    #x95bf4a82 #xe2b87a14 #x7bb12bae #x0cb61b38 #x92d28e9b
    #xe5d5be0d #x7cdcefb7 #x0bdbdf21 #x86d3d2d4 #xf1d4e242
    #x68ddb3f8 #x1fda836e #x81be16cd #xf6b9265b #x6fb077e1
    #x18b74777 #x88085ae6 #xff0f6a70 #x66063bca #x11010b5c
    #x8f659eff #xf862ae69 #x616bffd3 #x166ccf45 #xa00ae278
    #xd70dd2ee #x4e048354 #x3903b3c2 #xa7672661 #xd06016f7
    #x4969474d #x3e6e77db #xaed16a4a #xd9d65adc #x40df0b66
    #x37d83bf0 #xa9bcae53 #xdebb9ec5 #x47b2cf7f #x30b5ffe9
    #xbdbdf21c #xcabac28a #x53b39330 #x24b4a3a6 #xbad03605
    #xcdd70693 #x54de5729 #x23d967bf #xb3667a2e #xc4614ab8
    #x5d681b02 #x2a6f2b94 #xb40bbe37 #xc30c8ea1 #x5a05df1b
    #x2d02ef8d))

(define (debuglink-crc32 port)
  "Compute the 32-bit CRC used in in '.gnu_debuglink' over the data read from
PORT and return it."                      ;(info "(gdb) Separate Debug Files")
  (let loop ((crc #xffffffff))
    (let ((byte (get-u8 port)))
      (if (eof-object? byte)
          (logand (lognot crc) #xffffffff)
          (let* ((index (logand (logxor crc byte) #xff))
                 (lhs   (vector-ref %crc32-table index)))
            (loop (logxor lhs (ash crc -8))))))))
--8<---------------cut here---------------end--------------->8---

The valid result is:

--8<---------------cut here---------------start------------->8---
scheme@(guix build debug-link)> (debuglink-crc32 (open-input-string "a"))
$5 = 3904355907
scheme@(guix build debug-link)> (version)
$6 = "2.2.6"
--8<---------------cut here---------------end--------------->8---

The incorrect result is:

--8<---------------cut here---------------start------------->8---
scheme@(guix build debug-link)> (debuglink-crc32 (open-input-string "a"))
$9 = 397917763
scheme@(guix build debug-link)> (version)
$10 = "2.9.5"
--8<---------------cut here---------------end--------------->8---

When adding ‘pk’ calls, I see that (ash crc -8) returns crc as-is.

Thoughts?

The interpreter gets it right:

--8<---------------cut here---------------start------------->8---
scheme@(guix build debug-link)> ,o interp #t
scheme@(guix build debug-link)> (define (debuglink-crc32 port)
  "Compute the 32-bit CRC used in in '.gnu_debuglink' over the data read from
PORT and return it."                      ;(info "(gdb) Separate Debug Files")
  (let loop ((crc #xffffffff))
    (let ((byte (get-u8 port)))
      (if (eof-object? byte)
          (logand (lognot crc) #xffffffff)
          (let* ((index (logand (logxor crc byte) #xff))
                 (lhs   (vector-ref %crc32-table index)))
            (loop (logxor lhs (ash crc -8))))))))

scheme@(guix build debug-link)> (debuglink-crc32 (open-input-string "a"))
$13 = 3904355907
scheme@(guix build debug-link)> (version)
$14 = "2.9.5"
--8<---------------cut here---------------end--------------->8---

Ludo’.