Bug 99191 - sanitizer detects undefined behaviour in libgfortran
Summary: sanitizer detects undefined behaviour in libgfortran
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: libfortran (show other bugs)
Version: 11.0
: P3 normal
Target Milestone: 12.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks: ubsan
  Show dependency treegraph
 
Reported: 2021-02-22 09:21 UTC by Vittorio Zecca
Modified: 2021-12-25 14:57 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2021-02-22 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vittorio Zecca 2021-02-22 09:21:52 UTC
! from pr66311.f90
! must be compiled and run with sanitized libgfortran
!../../../gcc-150221/libgfortran/io/write.c:835:7: runtime error: negation of 0x80000000000000000000000000000000 cannot be represented in type '__int128'; cast to an unsigned type to negate this value to itself
!../../../gcc-150221/libgfortran/runtime/string.c:199:11: runtime error: negation of 0x80000000000000000000000000000000 cannot be represented in type '__int128'; cast to an unsigned type to negate this value to itself
      use iso_fortran_env, only : ikinds => integer_kinds

      integer, parameter :: k = ikinds(size(ikinds))

      write(*,*) -huge(0_k)-1

      end
Comment 1 Martin Liška 2021-02-23 08:52:02 UTC
Good, I can confirm that. The code contains a comment about it:

  if (n < 0)
    {
      negative = 1;
      t = -n; /*must use unsigned to protect from overflow*/
    }

Full back-trace:

/home/marxin/Programming/gcc2/libgfortran/io/write.c:835:7: runtime error: negation of 0x80000000000000000000000000000000 cannot be represented in type '__int128'; cast to an unsigned type to negate this value to itself
    #0 0x7ffff7844eec in write_decimal /home/marxin/Programming/gcc2/libgfortran/io/write.c:835
    #1 0x7ffff7846d56 in write_integer /home/marxin/Programming/gcc2/libgfortran/io/write.c:1369
    #2 0x7ffff7849b34 in list_formatted_write_scalar /home/marxin/Programming/gcc2/libgfortran/io/write.c:1894
    #3 0x7ffff784a5eb in _gfortrani_list_formatted_write /home/marxin/Programming/gcc2/libgfortran/io/write.c:1972
    #4 0x7ffff7812440 in wrap_scalar_transfer /home/marxin/Programming/gcc2/libgfortran/io/transfer.c:2382
    #5 0x7ffff7812487 in _gfortran_transfer_integer /home/marxin/Programming/gcc2/libgfortran/io/transfer.c:2393
    #6 0x7ffff78124b7 in _gfortran_transfer_integer_write /home/marxin/Programming/gcc2/libgfortran/io/transfer.c:2399
    #7 0x400873 in check.0 (/home/marxin/Programming/testcases/a.out+0x400873)
    #8 0x4008b0 in MAIN__ (/home/marxin/Programming/testcases/a.out+0x4008b0)
    #9 0x4008e7 in main (/home/marxin/Programming/testcases/a.out+0x4008e7)
    #10 0x7ffff54edb24 in __libc_start_main (/lib64/libc.so.6+0x27b24)
    #11 0x40072d in _start (/home/marxin/Programming/testcases/a.out+0x40072d)

@Janne: Can you please take a look?
Comment 2 Francois-Xavier Coudert 2021-12-25 13:04:37 UTC
Will be fixed by patch at https://gcc.gnu.org/pipermail/fortran/2021-December/057218.html
Comment 3 Francois-Xavier Coudert 2021-12-25 14:57:56 UTC
Fixed.