http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53802
Bug #: 53802
Summary: Spurious 'may be used uninitialized' related to shifts
Classification: Unclassified
Product: gcc
Version: 4.7.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
AssignedTo: [email protected]
ReportedBy: [email protected]
Trivial changes in the following program suppress the warning:
inline void foo(const unsigned char* mem_, unsigned int* value_)
{
unsigned int value = *mem_;
value <<= 8;
value |= *++mem_;
value <<= 8;
value |= *++mem_;
value <<= 8;
value |= *++mem_;
value <<= 8;
value |= *++mem_;
*value_ = value;
}
inline void bar(unsigned char* dest_, unsigned int value_)
{
if (!value_)
return;
dest_[0] = 0;
dest_[1] = value_ >> 24;
dest_[2] = value_ >> 16;
dest_[3] = value_ >> 8;
dest_[4] = value_;
}
int main()
{
for (unsigned int number = 0xFFFFFFFF; number; number >>= 1)
{
unsigned char buf[5];
bar(buf, number);
unsigned int val;
foo(buf, &val);
if (number != val)
return 0;
}
}
$ gcc main.cpp -O -Wall
main.cpp: In function 'int main()':
main.cpp:6:19: warning: '*((void*)& buf +1)' may be used uninitialized in this
function [-Wmaybe-uninitialized]
main.cpp:31:19: note: '*((void*)& buf +1)' was declared here
main.cpp:12:19: warning: '*((void*)& buf +4)' may be used uninitialized in this
function [-Wmaybe-uninitialized]
main.cpp:31:19: note: '*((void*)& buf +4)' was declared here
main.cpp:10:19: warning: '*((void*)& buf +3)' may be used uninitialized in this
function [-Wmaybe-uninitialized]
main.cpp:31:19: note: '*((void*)& buf +3)' was declared here
main.cpp:8:19: warning: '*((void*)& buf +2)' may be used uninitialized in this
function [-Wmaybe-uninitialized]
main.cpp:31:19: note: '*((void*)& buf +2)' was declared here