On Tue, Jul 19, 2022 at 04:56:02PM +0000, Matthias Klose wrote:

> This package currently fails to build (at least on the amd64
> architecture) with link time optimizations enabled.

Hello, I believe we have a gcc bug here.

Try to build libspectrum after applying this patch:

diff -ru libspectrum-1.5.0.orig/szx.c libspectrum-1.5.0/szx.c
--- libspectrum-1.5.0.orig/szx.c        2021-02-27 03:02:21.000000000 +0000
+++ libspectrum-1.5.0/szx.c     2022-07-19 18:56:44.740953365 +0000
@@ -2545,6 +2545,11 @@
   error = read_chunk_header( id, &data_length, buffer, end );
   if( error ) return error;
 
+  unsigned l1 = data_length;
+  printf("Data length (unsigned): %u\n", l1);
+  unsigned long l2 = l1;
+  printf("Data length (unsigned long): %lu\n", l2);
+
   if( end - *buffer < data_length ) {
     libspectrum_print_error(
       LIBSPECTRUM_ERROR_CORRUPT,

When the build fails run test/test manually and observe the output:

Data length (unsigned): 4294901760
Data length (unsigned long): 18446744073709486080

GCC is converting 0xFFFF0000 into 0xFFFFFFFFFFFF0000 when casting an
unsigned into an unsigned long.

The problem only happens with -O2, if you put this around that
function...

   #pragma GCC push_options
   #pragma GCC optimize ("-O2")
   /* ... */
   #pragma GCC pop_options

...then the problem goes away. GCC in bullseye (4:10.2.1-1) can build
this same package without problems.

Berto

Reply via email to