/* Test to verify that past-the-end multibyte writes via lvalues of wider types than char are diagnosed. { dg-do compile } { dg-require-effective-target int32plus } { dg-options "-O2 -Wall -Wno-array-bounds" } { dg-additional-options "-mtune=generic" { target { i?86-*-* x86_64-*-* } } } */ typedef __INT16_TYPE__ int16_t; typedef __INT32_TYPE__ int32_t; typedef __INT64_TYPE__ int64_t; typedef __SIZE_TYPE__ size_t; void* memcpy (void*, const void*, size_t); char* strcpy (char*, const char*); char a4[4], a8[8], a16[16]; const char s4[] = "1234"; const char t4[] = "4321"; void test_memcpy_cond (int i) { char *p = a4 + 1; const char *q = i ? s4 : t4; // On strictly aligned target the call below is left unchanged and // triggers (inaccurately) a -Warray-bounds. The test suppresses // the warning above, which then lets -Wstringop-overrflow detect // the overflow just before expansion. // On other targets it's transformed into a store of a 4-byte integer // which is detected by -Wstringop-overrflow in the strlen pass (i.e., // before it gets to expansion). memcpy (p, q, 4); // { dg-warning "writing 4 bytes into a region of size 3" } } void test_int16 (void) { char *p = a4 + 1; *(int16_t*)p = 0; // { dg-warning "writing 4 bytes into a region of size 3" "pr102706" { target { vect_slp_v2hi_store_unalign } } } *(int16_t*)(p + 2) = 0; // { dg-warning "writing 2 bytes into a region of size 1" "pr102706" { xfail { vect_slp_v2hi_store_unalign } } } } void test_int32 (void) { char *p = a8 + 3; *(int32_t*)p = 0; *(int32_t*)(p + 2) = 0; // { dg-warning "writing 4 bytes into a region of size 3" } } void test_int64 (void) { char *p = a16 + 5; *(int64_t*)p = 0; *(int64_t*)(p + 5) = 0; // { dg-warning "writing 8 bytes into a region of size 6" } }