warn-bad-memaccess.cpp revision e452c78072156c14cd9998733e3b4b28b6fc7fd7
1202e123d0d680af6d1754b22246ea63fb3604931Chandler Carruth// RUN: %clang_cc1 -fsyntax-only -Wnon-pod-memset -verify %s 27ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth 3e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregorextern "C" void *memset(void *, int, unsigned); 47ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth 57ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth// Several POD types that should not warn. 67ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct S1 {} s1; 77ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct S2 { int x; } s2; 87ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct S3 { float x, y; S1 s[4]; void (*f)(S1**); } s3; 97ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth 1043fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth// We use the C++11 concept of POD for this warning, so ensure a non-aggregate 1143fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth// still warns. 1243fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruthclass C1 { 1343fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth int x, y, z; 1443fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruthpublic: 1543fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth void foo() {} 1643fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth} c1; 1743fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth 187ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth// Non-POD types that should warn. 197ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct X1 { X1(); } x1; 207ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct X2 { ~X2(); } x2; 217ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct X3 { virtual void f(); } x3; 227ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct X4 : X2 {} x4; 237ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthstruct X5 : virtual S1 {} x5; 247ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth 257ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruthvoid test_warn() { 267ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&x1, 0, sizeof x1); // \ 277ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-warning {{destination for this memset call is a pointer to a non-POD type}} \ 287ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-note {{explicitly cast the pointer to silence this warning}} 297ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&x2, 0, sizeof x2); // \ 307ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-warning {{destination for this memset call is a pointer to a non-POD type}} \ 317ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-note {{explicitly cast the pointer to silence this warning}} 327ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&x3, 0, sizeof x3); // \ 337ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-warning {{destination for this memset call is a pointer to a non-POD type}} \ 347ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-note {{explicitly cast the pointer to silence this warning}} 357ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&x4, 0, sizeof x4); // \ 367ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-warning {{destination for this memset call is a pointer to a non-POD type}} \ 377ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-note {{explicitly cast the pointer to silence this warning}} 387ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&x5, 0, sizeof x5); // \ 397ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-warning {{destination for this memset call is a pointer to a non-POD type}} \ 407ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // expected-note {{explicitly cast the pointer to silence this warning}} 417ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth} 427ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth 43134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruthvoid test_nowarn(void *void_ptr) { 44134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth int i, *iptr; 45134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth float y; 46134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth char c; 47134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth 48134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth memset(&i, 0, sizeof i); 49134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth memset(&iptr, 0, sizeof iptr); 50134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth memset(&y, 0, sizeof y); 51134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth memset(&c, 0, sizeof c); 52134cb4442d6205e0226944ead4c7ede425fba206Chandler Carruth memset(void_ptr, 0, 42); 537ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&s1, 0, sizeof s1); 547ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&s2, 0, sizeof s2); 557ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth memset(&s3, 0, sizeof s3); 5643fa33b4bedc28d2faa17d678ad1f40eb42817a1Chandler Carruth memset(&c1, 0, sizeof c1); 577ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth 587ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // Unevaluated code shouldn't warn. 597ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth (void)sizeof memset(&x1, 0, sizeof x1); 607ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth 617ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth // Dead code shouldn't warn. 627ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth if (false) memset(&x1, 0, sizeof x1); 637ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth} 64e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregor 65e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregornamespace N { 66e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregor void *memset(void *, int, unsigned); 67e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregor void test_nowarn() { 68e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregor N::memset(&x1, 0, sizeof x1); 69e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregor } 70e452c78072156c14cd9998733e3b4b28b6fc7fd7Douglas Gregor} 71