@@ -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);
@@ -3484,23 +3485,6 @@ class TestBufferOverrun : public TestFixture {
34843485 " (void)strxfrm(dest,src,3);\n " // <<
34853486 " }\n " );
34863487 ASSERT_EQUALS (" [test.cpp:6:19]: (error) Buffer is accessed out of bounds: dest [bufferAccessOutOfBounds]\n " , errout_str ());
3487- // source size is too small
3488- check (" void f(void) {\n "
3489- " const char src[2] = \" ab\" ;\n "
3490- " char dest[3] = \" abc\" ;\n "
3491- " (void)strxfrm(dest,src,1);\n "
3492- " (void)strxfrm(dest,src,2);\n "
3493- " (void)strxfrm(dest,src,3);\n " // <<
3494- " }\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 ());
35043488 }
35053489
35063490 void buffer_overrun_33 () { // #2019
@@ -3638,6 +3622,44 @@ class TestBufferOverrun : public TestFixture {
36383622 ASSERT_EQUALS (" " , errout_str ());
36393623 }
36403624
3625+ void buffer_overrun_39 () { // #11765
3626+ check (" void f() {\n "
3627+ " char buf[10];\n "
3628+ " memcpy(buf, \" abc\" , 4);\n "
3629+ " }\n " );
3630+ ASSERT_EQUALS (" " , errout_str ());
3631+
3632+ check (" void f() {\n "
3633+ " char buf[128];\n "
3634+ " memcpy(buf, \" abc\" , 5);\n "
3635+ " }\n " );
3636+ ASSERT_EQUALS (" [test.cpp:3:17]: (warning) Buffer is accessed out of bounds: \" abc\" [bufferAccessOutOfBounds]\n " ,
3637+ errout_str ());
3638+
3639+ check (" void f() {\n "
3640+ " char buf[128];\n "
3641+ " memcpy(buf, L\" abc\" , 4 * sizeof(wchar_t));\n "
3642+ " }\n " );
3643+ ASSERT_EQUALS (" " , errout_str ());
3644+
3645+ check (" void f() {\n "
3646+ " char buf[128];\n "
3647+ " memcpy(buf, L\" abc\" , 4 * sizeof(wchar_t) + 1);\n "
3648+ " }\n " );
3649+ ASSERT_EQUALS (" [test.cpp:3:17]: (warning) Buffer is accessed out of bounds: L\" abc\" [bufferAccessOutOfBounds]\n " ,
3650+ errout_str ());
3651+
3652+ check (" int f(char* s) {\n "
3653+ " return memcmp(s, \"\\ 0\\ 0\\ 0\" , 3);\n "
3654+ " }\n " );
3655+ ASSERT_EQUALS (" " , errout_str ());
3656+
3657+ check (" int f(const char16_t* buf) {\n "
3658+ " return memcmp(buf, u\" abc\" , 4 * sizeof(char16_t));\n "
3659+ " }\n " );
3660+ ASSERT_EQUALS (" " , errout_str ());
3661+ }
3662+
36413663 void buffer_overrun_errorpath () {
36423664 setMultiline ();
36433665 Settings s = settings0;
@@ -4618,9 +4640,8 @@ class TestBufferOverrun : public TestFixture {
46184640 check (" void f() {\n "
46194641 " mymemset(\" abc\" , 0, 20);\n "
46204642 " }\n " , settings);
4621- TODO_ASSERT_EQUALS (" [test.cpp:2]: (error) Buffer is accessed out of bounds.\n " ,
4622- " " ,
4623- errout_str ());
4643+ ASSERT_EQUALS (" [test.cpp:2:12]: (warning) Buffer is accessed out of bounds: \" abc\" [bufferAccessOutOfBounds]\n " ,
4644+ errout_str ());
46244645
46254646 check (" void f() {\n "
46264647 " mymemset(temp, \" abc\" , 4);\n "
0 commit comments