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

Bug#1032130: gcc-12: incorrect -Wanalyzer-shift-count-overflow warning



Package: gcc-12
Version: 12.2.0-14
Severity: normal
Tags: upstream
Forwarded: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98447

On the following program

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;
    }
}

gcc-12 emits the following incorrect warning:

$ gcc-12 -fanalyzer -c warn-shiftcount.c
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
    |

Here, due to the "n = r % 64", one has n <= 63, so that "1UL << b"
can be executed only when b <= 63, and the shift is necessarily valid
(no overflow).

Note: gcc-11 is affected too, but not gcc-10.

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

Kernel: Linux 6.1.0-5-amd64 (SMP w/8 CPU threads; PREEMPT)
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-12 depends on:
ii  binutils       2.40-2
ii  cpp-12         12.2.0-14
ii  gcc-12-base    12.2.0-14
ii  libc6          2.36-8
ii  libcc1-0       12.2.0-14
ii  libgcc-12-dev  12.2.0-14
ii  libgcc-s1      12.2.0-14
ii  libgmp10       2:6.2.1+dfsg1-1.1
ii  libisl23       0.25-1
ii  libmpc3        1.3.1-1
ii  libmpfr6       4.2.0-1
ii  libstdc++6     12.2.0-14
ii  libzstd1       1.5.4+dfsg2-3
ii  zlib1g         1:1.2.13.dfsg-1

Versions of packages gcc-12 recommends:
ii  libc6-dev  2.36-8

Versions of packages gcc-12 suggests:
ii  gcc-12-doc       12.2.0-1
ii  gcc-12-locales   12.2.0-14
ii  gcc-12-multilib  12.2.0-14

-- 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: