Bug 32720

Summary: глючит -D_FORTIFY_SOURCE -flto, off by one
Product: Sisyphus Reporter: Big Benis <big.benis>
Component: gcc5Assignee: Gleb F-Malinovskiy <glebfm>
Status: CLOSED WONTFIX QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: evg, glebfm
Version: unstable   
Hardware: all   
OS: Linux   

Description Big Benis 2016-11-06 08:14:37 MSK
В github.com/svpv/ppmd-mini у меня есть такой код:

   102      char fname[0x1FF];
   103      size_t fnlen = hdr.fnlen & 0x1FF;
   104      if (fread(fname, fnlen, 1, stdin) != 1)
   105          return 1;

gcc5 выдает такое предупреждение:

$ make
gcc -Ilib -g -O3 -flto -fvisibility=hidden -Wall -Wextra -o ppmd-mini ppmd-mini.c lib/Ppmd8.c lib/Ppmd8Enc.c lib/Ppmd8Dec.c
In function ‘__fread_alias’,
    inlined from ‘decompress’ at ppmd-mini.c:104:9:
/usr/include/bits/stdio2.h:290:9: warning: call to ‘__fread_chk_warn’ declared with attribute warning: fread called with bigger size * nmemb than length of destination buffer
  return __fread_chk (__ptr, __bos0 (__ptr), __size, __n, __stream);
         ^

То есть он считает, что размер (hdr.fnlen & 0x1FF) может переполнить буфер fname[0x1FF]. А я так не считаю. Причем если заменить на frname[0x200], то всё становится нормально. Ну что сказать, компилятор глюкавый. Где-то там у него плюс-минус один - это вообще, как два пишем три в уме.

Причем если убрать -flto, то предупреждения нету.

$ gcc -Ilib -g -O3  -fvisibility=hidden -Wall -Wextra -o ppmd-mini ppmd-mini.c lib/Ppmd8.c lib/Ppmd8Enc.c lib/Ppmd8Dec.c                                    
$

То есть эта приблизительная арифметика где-то в кишках у него сидит очень глубоко.

Причем gcc6 уже не глючит. В связи с этим, и не только с этим, агитирую за скорейший переход на gcc6.

$ ~/gcc-6/bin/gcc -D_FORTIFY_SOURCE=2 -Ilib -g -O3 -flto -fvisibility=hidden -Wall -Wextra -o ppmd-mini ppmd-mini.c lib/Ppmd8.c lib/Ppmd8Enc.c lib/Ppmd8Dec.c
$
Comment 1 Dmitry V. Levin 2018-07-13 02:41:15 MSK
(In reply to comment #0)
> Причем gcc6 уже не глючит. В связи с этим, и не только с этим, агитирую за
> скорейший переход на gcc6.

Спасибо, давно уже перешли.