<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Aug 4, 2016 at 4:55 PM, Bruno Cardoso Lopes via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: bruno<br>
Date: Thu Aug  4 18:55:22 2016<br>
New Revision: 277787<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=277787&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=277787&view=rev</a><br>
Log:<br>
[Sema] Add sizeof diagnostics for bzero<br>
<br>
For memset (and others) we can get diagnostics like:<br>
<br>
  struct stat { int x; };<br>
  void foo(struct stat *stamps) {<br>
    bzero(stamps, sizeof(stamps));<br>
    memset(stamps, 0, sizeof(stamps));<br>
  }<br>
<br>
  t.c:7:28: warning: 'memset' call operates on objects of type 'struct stat' while the size is based on a different type 'struct stat *' [-Wsizeof-pointer-memaccess]<br>
    memset(stamps, 0, sizeof(stamps));<br>
           ~~~~~~            ^~~~~~<br>
  t.c:7:28: note: did you mean to dereference the argument to 'sizeof' (and multiply it by the number of elements)?<br>
    memset(stamps, 0, sizeof(stamps));<br>
                             ^~~~~~<br>
<br>
This patch implements the same class of warnings for bzero.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D22525" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D22525</a><br>
<br>
rdar://problem/18963514<br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/Decl.cpp<br>
    cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp<br>
    cfe/trunk/test/SemaCXX/warn-<wbr>memset-bad-sizeof.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/Decl.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=277787&r1=277786&r2=277787&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/AST/<wbr>Decl.cpp?rev=277787&r1=277786&<wbr>r2=277787&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/AST/Decl.cpp (original)<br>
+++ cfe/trunk/lib/AST/Decl.cpp Thu Aug  4 18:55:22 2016<br>
@@ -3408,6 +3408,10 @@ unsigned FunctionDecl::<wbr>getMemoryFunction<br>
   case Builtin::BIstrlen:<br>
     return Builtin::BIstrlen;<br>
<br>
+  case Builtin::BI__builtin_bzero:<br>
+  case Builtin::BIbzero:<br>
+    return Builtin::BIbzero;<br>
+<br>
   default:<br>
     if (isExternC()) {<br>
       if (FnInfo->isStr("memset"))<br>
@@ -3430,6 +3434,8 @@ unsigned FunctionDecl::<wbr>getMemoryFunction<br>
         return Builtin::BIstrndup;<br>
       else if (FnInfo->isStr("strlen"))<br>
         return Builtin::BIstrlen;<br>
+      else if (FnInfo->isStr("bzero"))<br>
+        return Builtin::BIbzero;<br>
     }<br>
     break;<br>
   }<br>
<br>
Modified: cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=277787&r1=277786&r2=277787&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp?rev=277787&<wbr>r1=277786&r2=277787&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp (original)<br>
+++ cfe/trunk/lib/Sema/<wbr>SemaChecking.cpp Thu Aug  4 18:55:22 2016<br>
@@ -6179,13 +6179,15 @@ void Sema::CheckMemaccessArguments(<wbr>const<br>
<br>
   // It is possible to have a non-standard definition of memset.  Validate<br>
   // we have enough arguments, and if not, abort further checking.<br>
-  unsigned ExpectedNumArgs = (BId == Builtin::BIstrndup ? 2 : 3);<br>
+  unsigned ExpectedNumArgs =<br>
+      (BId == Builtin::BIstrndup || Builtin::BIbzero ? 2 : 3);<br></blockquote><div><br></div><div>This looks suspicious.  Should it be (BId == Builtin::BIstrndup || Bld == Builtin::BIbzero ? 2 : 3);<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
   if (Call->getNumArgs() < ExpectedNumArgs)<br>
     return;<br>
<br>
-  unsigned LastArg = (BId == Builtin::BImemset ||<br>
+  unsigned LastArg = (BId == Builtin::BImemset || BId == Builtin::BIbzero ||<br>
                       BId == Builtin::BIstrndup ? 1 : 2);<br>
-  unsigned LenArg = (BId == Builtin::BIstrndup ? 1 : 2);<br>
+  unsigned LenArg =<br>
+      (BId == Builtin::BIbzero || BId == Builtin::BIstrndup ? 1 : 2);<br>
   const Expr *LenExpr = Call->getArg(LenArg)-><wbr>IgnoreParenImpCasts();<br>
<br>
   if (<wbr>CheckMemorySizeofForComparison<wbr>(*this, LenExpr, FnName,<br>
<br>
Modified: cfe/trunk/test/SemaCXX/warn-<wbr>memset-bad-sizeof.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-memset-bad-sizeof.cpp?rev=277787&r1=277786&r2=277787&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>SemaCXX/warn-memset-bad-<wbr>sizeof.cpp?rev=277787&r1=<wbr>277786&r2=277787&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/warn-<wbr>memset-bad-sizeof.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/warn-<wbr>memset-bad-sizeof.cpp Thu Aug  4 18:55:22 2016<br>
@@ -1,5 +1,6 @@<br>
 // RUN: %clang_cc1 -fsyntax-only -verify -Wno-sizeof-array-argument %s<br>
 //<br>
+extern "C" void *bzero(void *, unsigned);<br>
 extern "C" void *memset(void *, int, unsigned);<br>
 extern "C" void *memmove(void *s1, const void *s2, unsigned n);<br>
 extern "C" void *memcpy(void *s1, const void *s2, unsigned n);<br>
@@ -47,6 +48,19 @@ void f(Mat m, const Foo& const_foo, char<br>
   memset(heap_buffer, 0, sizeof(heap_buffer));  // \<br>
       // expected-warning {{'memset' call operates on objects of type 'char' while the size is based on a different type 'char *'}} expected-note{{did you mean to provide an explicit length?}}<br>
<br>
+  bzero(&s, sizeof(&s));  // \<br>
+      // expected-warning {{'bzero' call operates on objects of type 'S' while the size is based on a different type 'S *'}} expected-note{{did you mean to remove the addressof in the argument to 'sizeof' (and multiply it by the number of elements)?}}<br>
+  bzero(ps, sizeof(ps));  // \<br>
+      // expected-warning {{'bzero' call operates on objects of type 'S' while the size is based on a different type 'S *'}} expected-note{{did you mean to dereference the argument to 'sizeof' (and multiply it by the number of elements)?}}<br>
+  bzero(ps2, sizeof(ps2));  // \<br>
+      // expected-warning {{'bzero' call operates on objects of type 'S' while the size is based on a different type 'PS' (aka 'S *')}} expected-note{{did you mean to dereference the argument to 'sizeof' (and multiply it by the number of elements)?}}<br>
+  bzero(ps2, sizeof(typeof(ps2)));  // \<br>
+      // expected-warning {{argument to 'sizeof' in 'bzero' call is the same pointer type}}<br>
+  bzero(ps2, sizeof(PS));  // \<br>
+      // expected-warning {{argument to 'sizeof' in 'bzero' call is the same pointer type}}<br>
+  bzero(heap_buffer, sizeof(heap_buffer));  // \<br>
+      // expected-warning {{'bzero' call operates on objects of type 'char' while the size is based on a different type 'char *'}} expected-note{{did you mean to provide an explicit length?}}<br>
+<br>
   memcpy(&s, 0, sizeof(&s));  // \<br>
       // expected-warning {{'memcpy' call operates on objects of type 'S' while the size is based on a different type 'S *'}} expected-note{{did you mean to remove the addressof in the argument to 'sizeof' (and multiply it by the number of elements)?}}<br>
   memcpy(0, &s, sizeof(&s));  // \<br>
@@ -73,6 +87,21 @@ void f(Mat m, const Foo& const_foo, char<br>
   memset(arr, 0, sizeof(arr));<br>
   memset(parr, 0, sizeof(parr));<br>
<br>
+  bzero((void*)&s, sizeof(&s));<br>
+  bzero(&s, sizeof(s));<br>
+  bzero(&s, sizeof(S));<br>
+  bzero(&s, sizeof(const S));<br>
+  bzero(&s, sizeof(volatile S));<br>
+  bzero(&s, sizeof(volatile const S));<br>
+  bzero(&foo, sizeof(CFoo));<br>
+  bzero(&foo, sizeof(VFoo));<br>
+  bzero(&foo, sizeof(CVFoo));<br>
+  bzero(ps, sizeof(*ps));<br>
+  bzero(ps2, sizeof(*ps2));<br>
+  bzero(ps2, sizeof(typeof(*ps2)));<br>
+  bzero(arr, sizeof(arr));<br>
+  bzero(parr, sizeof(parr));<br>
+<br>
   memcpy(&foo, &const_foo, sizeof(Foo));<br>
   memcpy((void*)&s, 0, sizeof(&s));<br>
   memcpy(0, (void*)&s, sizeof(&s));<br>
@@ -96,12 +125,17 @@ void f(Mat m, const Foo& const_foo, char<br>
   int iarr[14];<br>
   memset(&iarr[0], 0, sizeof iarr);<br>
   memset(iarr, 0, sizeof iarr);<br>
+  bzero(&iarr[0], sizeof iarr);<br>
+  bzero(iarr, sizeof iarr);<br>
<br>
   int* iparr[14];<br>
   memset(&iparr[0], 0, sizeof iparr);<br>
   memset(iparr, 0, sizeof iparr);<br>
+  bzero(&iparr[0], sizeof iparr);<br>
+  bzero(iparr, sizeof iparr);<br>
<br>
   memset(m, 0, sizeof(Mat));<br>
+  bzero(m, sizeof(Mat));<br>
<br>
   // Copy to raw buffer shouldn't warn either<br>
   memcpy(&foo, &arr, sizeof(Foo));<br>
@@ -114,12 +148,21 @@ void f(Mat m, const Foo& const_foo, char<br>
     for (;;) {}<br>
     &s;<br>
   }), 0, sizeof(s));<br>
+<br>
+  bzero(({<br>
+    if (0) {}<br>
+    while (0) {}<br>
+    for (;;) {}<br>
+    &s;<br>
+  }), sizeof(s));<br>
 }<br>
<br>
 namespace ns {<br>
 void memset(void* s, char c, int n);<br>
+void bzero(void* s, int n);<br>
 void f(int* i) {<br>
   memset(i, 0, sizeof(i));<br>
+  bzero(i, sizeof(i));<br>
 }<br>
 }<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>