[ https://issues.apache.org/jira/browse/STDCXX-904?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12594460#action_12594460 ] Martin Sebor commented on STDCXX-904: ------------------------------------- Reduced test case I sent to HP: {noformat} $ cat u.cpp && aCC -V +O2 +w -c t.cpp void foo (const char*); int main () { struct B { char x [4]; void bar (unsigned n) { for (unsigned i = 3; i != n - 1; --i) x [i] = x [i - n]; } } x; for (unsigned i = 0; i != 1; ++i) { x.bar (i % 4); foo (x.x); } } aCC: HP C/aC++ B3910B A.06.16 [Nov 26 2007] "t.cpp", line 13, procedure main: warning #20206-D: Out of bound access (In expression "memmove(&(&x)->x[2]+1 - (long long)(3 - n),&(&x)->x[(int)(2 - n)]+1 - (long long)(3 - n),3 - n)", &(&x)->x[2]+1 - (long long)(3 - n) (type: char [4]) (defined by (&x)->x) has byte range [0 .. 3], writing byte range [0 .. 4].) {noformat} > [HP aCC 6.16] bogus cadvise warning #20206 in optimized code > ------------------------------------------------------------ > > Key: STDCXX-904 > URL: https://issues.apache.org/jira/browse/STDCXX-904 > Project: C++ Standard Library > Issue Type: Bug > Components: External > Affects Versions: 4.2.1 > Environment: $ uname -sr && aCC -V > HP-UX B.11.31 > aCC: HP C/aC++ B3910B A.06.16 [Nov 26 2007] > Reporter: Travis Vitek > > This is a simplified version of 23.bitset.cpp that shows a bogus out of bound access cadvise warning. > {noformat} > void __rw_bitset (unsigned*, unsigned, const char*, unsigned, unsigned, unsigned); > template > class bitset > { > unsigned bits_ [1]; > public: > bitset (const char *__str, unsigned __pos, unsigned __n) { > __rw_bitset (bits_, _Size, __str, 0, __pos, __n); > } > }; > template > struct test_set > { > char bits_ [_Size + 1]; // includes a null terminator > test_set () { > for (unsigned i = 0; i != _Size; ++i) > bits_ [i] = '0'; > bits_ [_Size] = '\0'; > } > test_set& operator>>= (unsigned n) { > for (unsigned i = _Size - 1; i != n - 1; --i) > bits_ [i] = bits_ [i - n]; > for (unsigned j = n; j != 0; ) > bits_ [--j] = '0'; > return *this; > } > }; > template > void run_test () > { > test_set<_Size> ts0; > const unsigned M = _Size + 1; > for (unsigned i = 0; i != 1; ++i) { > const unsigned n = i % M; > > const test_set<_Size> ts1 = (ts0 >>= n); > (void)&ts1; > const bitset<_Size> bs0 (ts0.bits_, 0, _Size); > } > } > int main (int argc, char *argv[]) > { > run_test<31>(); > return 0; > } > {noformat} > The result of compiling this code with -O2 is... > {noformat} > aCC -c -mt \ > -I/amd/devco/vitek/stdcxx/4.2.x/include \ > -I/amd/devco/vitek/stdcxx/4.2.x/build/include \ > -I/amd/devco/vitek/stdcxx/4.2.x/tests/include \ > -AA +O2 +DD64 +w \ > +W392,655,684,818,819,849 \ > +W2193,2236,2261,2340,2401,2487 \ > +W4227,4229,4231,4235,4237,4249 \ > +W4255,4272,4284,4285,4286,4296,4297 \ > +W3348 u.cpp > "u.cpp", line 29, procedure main: warning #20206-D: Out of bound access \ > (In expression "memmove(&(&ts0)->bits_[30]+1 - (31 - n),&(&ts0)->bits_[(30 - n)]+1 - (31 - n),31 - n)", &(&ts0)->bits_[30]+1 - (31 - n) \ > (type: char [32]) (defined by (&ts0)->bits_) has byte range [0 .. 31], writing byte range [0 .. 60].) > {noformat} > The code compiles without warning if the optimization level is reduced to -O1. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.