@@ -229,6 +229,7 @@ class TestBufferOverrun : public TestFixture {
229229 TEST_CASE (buffer_overrun_36);
230230 TEST_CASE (buffer_overrun_37);
231231 TEST_CASE (buffer_overrun_38);
232+ TEST_CASE (buffer_overrun_39);
232233 TEST_CASE (buffer_overrun_errorpath);
233234 TEST_CASE (buffer_overrun_bailoutIfSwitch); // ticket #2378 : bailoutIfSwitch
234235 TEST_CASE (buffer_overrun_function_array_argument);
@@ -3492,15 +3493,7 @@ class TestBufferOverrun : public TestFixture {
34923493 " (void)strxfrm(dest,src,2);\n "
34933494 " (void)strxfrm(dest,src,3);\n " // <<
34943495 " }\n " );
3495- ASSERT_EQUALS (" [test.cpp:6:24]: (error) Buffer is accessed out of bounds: src [bufferAccessOutOfBounds]\n " , errout_str ());
3496- // source size is too small
3497- check (" void f(void) {\n "
3498- " const char src[1] = \" a\" ;\n "
3499- " char dest[3] = \" abc\" ;\n "
3500- " (void)strxfrm(dest,src,1);\n "
3501- " (void)strxfrm(dest,src,2);\n " // <<
3502- " }\n " );
3503- ASSERT_EQUALS (" [test.cpp:5:24]: (error) Buffer is accessed out of bounds: src [bufferAccessOutOfBounds]\n " , errout_str ());
3496+ ASSERT_EQUALS (" " , errout_str ());
35043497 }
35053498
35063499 void buffer_overrun_33 () { // #2019
@@ -3638,6 +3631,50 @@ class TestBufferOverrun : public TestFixture {
36383631 ASSERT_EQUALS (" " , errout_str ());
36393632 }
36403633
3634+ void buffer_overrun_39 () { // #11765
3635+ check (" void f() {\n "
3636+ " char buf[10];\n "
3637+ " memcpy(buf, \" abc\" , 4);\n "
3638+ " }\n " );
3639+ ASSERT_EQUALS (" " , errout_str ());
3640+
3641+ check (" void f() {\n "
3642+ " char buf[128];\n "
3643+ " memcpy(buf, \" abc\" , 5);\n "
3644+ " }\n " );
3645+ ASSERT_EQUALS (" [test.cpp:3:17]: (error) Buffer is accessed out of bounds: \" abc\" [bufferAccessOutOfBounds]\n " ,
3646+ errout_str ());
3647+
3648+ check (" void f() {\n "
3649+ " char buf[128];\n "
3650+ " memcpy(buf, L\" abc\" , 4 * sizeof(wchar_t));\n "
3651+ " }\n " );
3652+ ASSERT_EQUALS (" " , errout_str ());
3653+
3654+ check (" void f() {\n "
3655+ " char buf[128];\n "
3656+ " memcpy(buf, L\" abc\" , 4 * sizeof(wchar_t) + 1);\n "
3657+ " }\n " );
3658+ ASSERT_EQUALS (" [test.cpp:3:17]: (error) Buffer is accessed out of bounds: L\" abc\" [bufferAccessOutOfBounds]\n " ,
3659+ errout_str ());
3660+
3661+ check (" int f(char* s) {\n "
3662+ " return memcmp(s, \"\\ 0\\ 0\\ 0\" , 3);\n "
3663+ " }\n " );
3664+ ASSERT_EQUALS (" " , errout_str ());
3665+
3666+ check (" int f(const char16_t* buf) {\n "
3667+ " return memcmp(buf, u\" abc\" , 4 * sizeof(char16_t));\n "
3668+ " }\n " );
3669+ ASSERT_EQUALS (" " , errout_str ());
3670+
3671+ check (" int f(const char* buf) {\n "
3672+ " return memcmp(buf, &\" abc\" [2], 4 * sizeof(char));\n "
3673+ " }\n " );
3674+ ASSERT_EQUALS (" [test.cpp:2:24]: (error) Buffer is accessed out of bounds: &\" abc\" [2] [bufferAccessOutOfBounds]\n " ,
3675+ errout_str ());
3676+ }
3677+
36413678 void buffer_overrun_errorpath () {
36423679 setMultiline ();
36433680 Settings s = settings0;
@@ -4618,9 +4655,8 @@ class TestBufferOverrun : public TestFixture {
46184655 check (" void f() {\n "
46194656 " mymemset(\" abc\" , 0, 20);\n "
46204657 " }\n " , settings);
4621- TODO_ASSERT_EQUALS (" [test.cpp:2]: (error) Buffer is accessed out of bounds.\n " ,
4622- " " ,
4623- errout_str ());
4658+ ASSERT_EQUALS (" [test.cpp:2:12]: (error) Buffer is accessed out of bounds: \" abc\" [bufferAccessOutOfBounds]\n " ,
4659+ errout_str ());
46244660
46254661 check (" void f() {\n "
46264662 " mymemset(temp, \" abc\" , 4);\n "
0 commit comments