[Bug sanitizer/66908] New: Uninitialized variable when compiled with UBsan
m.guseva at samsung dot com
gcc-bugzilla@gcc.gnu.org
Fri Jul 17 10:48:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66908
Bug ID: 66908
Summary: Uninitialized variable when compiled with UBsan
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: sanitizer
Assignee: unassigned at gcc dot gnu.org
Reporter: m.guseva at samsung dot com
CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org,
jakub at gcc dot gnu.org, kcc at gcc dot gnu.org
Target Milestone: ---
Created attachment 36002
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36002&action=edit
Reproducer
When compiled with "-fsanitize=shift,bounds" the gcc reports that "i" variable
maybe uninitialized:
gcc -O2 -fsanitize=shift,bounds -std=gnu89 -Werror=maybe-uninitialized -c
testcase.c
testcase.c: In function Б─≤fooБ─≥:
testcase.c:21:36: error: Б─≤i.1Б─≥ may be used uninitialized in this function
[-Werror=maybe-uninitialized]
res[i] = ((data->scale[i] + tab[i]) << mult);
It's not true in original source code however in produced gimple the "i.1" is
initialized in <D.3009> block but may be used in block <D.3010>:
23 if (mult.0 > 31) goto <D.3009>; else goto <D.3010>;
24 <D.3009>:
25 D.3011 = (unsigned long) mult.0;
26 D.3012 = data->scale[i];
27 D.3013 = (int) D.3012;
28 i.1 = i;
29 UBSAN_BOUNDS (0B, i.1, 21);
30 D.3015 = tab[i.1];
31 D.3016 = (int) D.3015;
32 D.3017 = D.3013 + D.3016;
33 D.3018 = (unsigned long) D.3017;
34 __builtin___ubsan_handle_shift_out_of_bounds (&*.Lubsan_data0, D.3018,
D.3011);
35 goto <D.3019>;
36 <D.3010>:
37 <D.3019>:
38 D.3020 = (long unsigned int) i;
39 D.3021 = D.3020 * 4;
40 D.3022 = res + D.3021;
41 D.3012 = data->scale[i];
42 D.3013 = (int) D.3012;
43 UBSAN_BOUNDS (0B, i.1, 21);
Discovered in gcc 4.9.2, reproduced on trunk with "-std=gnu89".
More information about the Gcc-bugs
mailing list