https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94247
Bug ID: 94247
Summary: Wrong char-subscripts warning for limited-range index
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: roland.illig at gmx dot de
Target Milestone: ---
#define MAXID 20
static const char shft[MAXID] = {1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6};
int hashstr(const char *s) {
char c;
char k = 0;
unsigned int sum = 0;
while( (c = *s++) != '\0' && k < MAXID-1 ) {
sum += c + (c<<shft[k++]);
}
return (int)(sum >> 1);
}
The above program is a slight variation of the OpenJDK code in
src/hotspot/share/libadt/dict.cpp. It uses a char for indexing an array, which
triggers this warning:
dict.cpp: In function ‘int hashstr(const char*)’:
dict.cpp:10:28: warning: array subscript has type ‘char’ [-Wchar-subscripts]
sum += c + (c<<shft[k++]);
At optimization levels 1 and beyond, the possible range for k is determined
correctly, and the compiler generates the same code, no matter if k has type
char or unsigned int or any other integer type.
The warning is a false positive, and the compiler already knows this. Therefore
the warning should not be generated.