[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#993021: gcc-11: incorrect -Wanalyzer-shift-count-overflow warning



Package: gcc-11
Version: 11.2.0-3
Severity: important
Tags: upstream
Forwarded: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98447

Compiling the following code with "gcc-11 -fanalyzer -c"

void f (unsigned long *p, int r, int i)
{
  int b = 64, n = r % 64;

  while (i >= 0 && b >= 0)
    {
      if (b <= n)
        p[i--] = 1UL << b;
      b -= n;
    }
}

gives:

warn-shiftcount.c: In function ‘f’:
warn-shiftcount.c:8:22: warning: shift by count (‘64’) >= precision of type (‘6’) [-Wanalyzer-shift-count-overflow]
    8 |         p[i--] = 1UL << b;
      |                  ~~~~^~~~
  ‘f’: events 1-5
    |
    |    5 |   while (i >= 0 && b >= 0)
    |      |          ~~~~~~~^~~~~~~~~
    |      |                 |
    |      |                 (1) following ‘true’ branch...
    |    6 |     {
    |    7 |       if (b <= n)
    |      |          ~       
    |      |          |
    |      |          (2) ...to here
    |      |          (3) following ‘true’ branch (when ‘b <= n’)...
    |    8 |         p[i--] = 1UL << b;
    |      |           ~~~    ~~~~~~~~
    |      |            |         |
    |      |            |         (5) shift by count ‘64’ here
    |      |            (4) ...to here

This warning is incorrect, since 1UL << b is in the "if" branch,
where b <= n and n <= 63 (thus b <= 63).

No such issue with gcc-10 and before.

This makes testing of GNU MPFR fail (this testcase was derived from
GNU MPFR's random2.c).

-- System Information:
Debian Release: bookworm/sid
  APT prefers unstable-debug
  APT policy: (500, 'unstable-debug'), (500, 'stable-security'), (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 5.10.0-8-amd64 (SMP w/8 CPU threads)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=POSIX, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled

Versions of packages gcc-11 depends on:
ii  binutils       2.37-4
ii  cpp-11         11.2.0-3
ii  gcc-11-base    11.2.0-3
ii  libc6          2.31-17
ii  libcc1-0       11.2.0-3
ii  libgcc-11-dev  11.2.0-3
ii  libgcc-s1      11.2.0-3
ii  libgmp10       2:6.2.1+dfsg-1
ii  libisl23       0.23-1
ii  libmpc3        1.2.0-1
ii  libmpfr6       4.1.0-3
ii  libstdc++6     11.2.0-3
ii  libzstd1       1.4.8+dfsg-2.1
ii  zlib1g         1:1.2.11.dfsg-2

Versions of packages gcc-11 recommends:
ii  libc6-dev  2.31-17

Versions of packages gcc-11 suggests:
pn  gcc-11-doc       <none>
ii  gcc-11-locales   11.2.0-3
ii  gcc-11-multilib  11.2.0-3

-- no debconf information

-- 
Vincent Lefèvre <vincent@vinc17.net> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)


Reply to: