mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-27 15:41:46 +00:00
patch to add missing warning on sizeof wrong parameter
for __builtin___strlcpy_chk/__builtin___strlcat_chk. Patch by Jacques Fortier with monir change by me and addition of test. rdar://18259539 llvm-svn: 217700
This commit is contained in:
parent
7e954ea063
commit
ab4fe98b4a
@ -3188,8 +3188,11 @@ unsigned FunctionDecl::getMemoryFunctionKind() const {
|
||||
return Builtin::BImemmove;
|
||||
|
||||
case Builtin::BIstrlcpy:
|
||||
case Builtin::BI__builtin___strlcpy_chk:
|
||||
return Builtin::BIstrlcpy;
|
||||
|
||||
case Builtin::BIstrlcat:
|
||||
case Builtin::BI__builtin___strlcat_chk:
|
||||
return Builtin::BIstrlcat;
|
||||
|
||||
case Builtin::BI__builtin_memcmp:
|
||||
|
@ -4485,7 +4485,8 @@ void Sema::CheckStrlcpycatArguments(const CallExpr *Call,
|
||||
IdentifierInfo *FnName) {
|
||||
|
||||
// Don't crash if the user has the wrong number of arguments
|
||||
if (Call->getNumArgs() != 3)
|
||||
unsigned NumArgs = Call->getNumArgs();
|
||||
if ((NumArgs != 3) && (NumArgs != 4))
|
||||
return;
|
||||
|
||||
const Expr *SrcArg = ignoreLiteralAdditions(Call->getArg(1), Context);
|
||||
|
@ -1,4 +1,4 @@
|
||||
// RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wno-string-plus-int -triple=i686-apple-darwin9
|
||||
// RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wstrlcpy-strlcat-size -Wno-string-plus-int -triple=i686-apple-darwin9
|
||||
// This test needs to set the target because it uses __builtin_ia32_vec_ext_v4si
|
||||
|
||||
int test1(float a, int b) {
|
||||
@ -184,12 +184,12 @@ void test18() {
|
||||
void *ptr;
|
||||
|
||||
ptr = __builtin___memccpy_chk(dst, src, '\037', sizeof(src), sizeof(dst));
|
||||
result = __builtin___strlcpy_chk(dst, src, sizeof(src), sizeof(dst));
|
||||
result = __builtin___strlcat_chk(dst, src, sizeof(src), sizeof(dst));
|
||||
result = __builtin___strlcpy_chk(dst, src, sizeof(dst), sizeof(dst));
|
||||
result = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst));
|
||||
|
||||
ptr = __builtin___memccpy_chk(dst, src, '\037', sizeof(src)); // expected-error {{too few arguments to function call}}
|
||||
ptr = __builtin___strlcpy_chk(dst, src, sizeof(src), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}}
|
||||
ptr = __builtin___strlcat_chk(dst, src, sizeof(src), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}}
|
||||
ptr = __builtin___strlcpy_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}}
|
||||
ptr = __builtin___strlcat_chk(dst, src, sizeof(dst), sizeof(dst)); // expected-warning {{incompatible integer to pointer conversion}}
|
||||
}
|
||||
|
||||
void no_ms_builtins() {
|
||||
@ -202,3 +202,23 @@ void unavailable() {
|
||||
__builtin_operator_new(0); // expected-error {{'__builtin_operator_new' is only available in C++}}
|
||||
__builtin_operator_delete(0); // expected-error {{'__builtin_operator_delete' is only available in C++}}
|
||||
}
|
||||
|
||||
// rdar://18259539
|
||||
size_t strlcpy(char * restrict dst, const char * restrict src, size_t size);
|
||||
size_t strlcat(char * restrict dst, const char * restrict src, size_t size);
|
||||
|
||||
void Test19(void)
|
||||
{
|
||||
static char b[40];
|
||||
static char buf[20];
|
||||
|
||||
strlcpy(buf, b, sizeof(b)); // expected-warning {{size argument in 'strlcpy' call appears to be size of the source; expected the size of the destination}} \\
|
||||
// expected-note {{change size argument to be the size of the destination}}
|
||||
__builtin___strlcpy_chk(buf, b, sizeof(b), __builtin_object_size(buf, 0)); // expected-warning {{size argument in '__builtin___strlcpy_chk' call appears to be size of the source; expected the size of the destination}} \
|
||||
// expected-note {{change size argument to be the size of the destination}}
|
||||
|
||||
strlcat(buf, b, sizeof(b)); // expected-warning {{size argument in 'strlcat' call appears to be size of the source; expected the size of the destination}} \
|
||||
// expected-note {{change size argument to be the size of the destination}}
|
||||
__builtin___strlcat_chk(buf, b, sizeof(b), __builtin_object_size(buf, 0)); // expected-warning {{size argument in '__builtin___strlcat_chk' call appears to be size of the source; expected the size of the destination}} \
|
||||
// expected-note {{change size argument to be the size of the destination}}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user