]> granicus.if.org Git - clang/commitdiff
Fix the argument index error of __builtin___memccpy_chk
authorSteven Wu <stevenwu@apple.com>
Wed, 24 Sep 2014 04:37:33 +0000 (04:37 +0000)
committerSteven Wu <stevenwu@apple.com>
Wed, 24 Sep 2014 04:37:33 +0000 (04:37 +0000)
memccpy_check should have source and dest size at arg 3 and 4
rdar://18431336

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@218367 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/Sema/builtin-object-size.c

index 7462869306340da075b73997bb90dc71d39f4b73..5ea862cf88adef6bfa332d6c74764c7c3a387bda 100644 (file)
@@ -365,7 +365,6 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
   // check secure string manipulation functions where overflows
   // are detectable at compile time
   case Builtin::BI__builtin___memcpy_chk:
-  case Builtin::BI__builtin___memccpy_chk:
   case Builtin::BI__builtin___memmove_chk:
   case Builtin::BI__builtin___memset_chk:
   case Builtin::BI__builtin___strlcat_chk:
@@ -375,6 +374,9 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
   case Builtin::BI__builtin___stpncpy_chk:
     SemaBuiltinMemChkCall(*this, FDecl, TheCall, 2, 3);
     break;
+  case Builtin::BI__builtin___memccpy_chk:
+    SemaBuiltinMemChkCall(*this, FDecl, TheCall, 3, 4);
+    break;
   case Builtin::BI__builtin___snprintf_chk:
   case Builtin::BI__builtin___vsnprintf_chk:
     SemaBuiltinMemChkCall(*this, FDecl, TheCall, 1, 3);
index e4b65608816794d997c7eaa9d6439792fed10d06..b1bda0652c146efd3a663f81343ef8d11bb94fe2 100644 (file)
@@ -43,3 +43,12 @@ void f5(void)
   memcpy((char *)NULL + 0x10000, buf, 0x10);
   memcpy1((char *)NULL + 0x10000, buf, 0x10); // expected-error {{argument should be a value from 0 to 3}}
 }
+
+// rdar://18431336
+void f6(void)
+{
+  char b[5];
+  char buf[10];
+  __builtin___memccpy_chk (buf, b, '\0', sizeof(b), __builtin_object_size (buf, 0));
+  __builtin___memccpy_chk (b, buf, '\0', sizeof(buf), __builtin_object_size (b, 0));  // expected-warning {{'__builtin___memccpy_chk' will always overflow destination buffer}}
+}