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