Skip to content

Commit 4b3a27e

Browse files
royjacobsongchatelet
authored andcommitted
Add validation for number of arguments of __builtin_memcpy_inline
__builtin_memcpy_inline doesn't use the usual builtin argument validation code, so it crashed when receiving wrong number of argument. Add the missing validation check. Open issue: llvm/llvm-project#52949 Reviewed By: gchatelet Differential Revision: https://reviews.llvm.org/D121965 Committed by gchatelet on behalf of "Roy Jacobson <[email protected]>"
1 parent c79e18d commit 4b3a27e

File tree

2 files changed

+11
-1
lines changed

2 files changed

+11
-1
lines changed

clang/lib/Sema/SemaChecking.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1679,7 +1679,10 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
16791679
if ((ICEArguments & (1 << ArgNo)) == 0) continue;
16801680

16811681
llvm::APSInt Result;
1682-
if (SemaBuiltinConstantArg(TheCall, ArgNo, Result))
1682+
// If we don't have enough arguments, continue so we can issue better
1683+
// diagnostic in checkArgCount(...)
1684+
if (ArgNo < TheCall->getNumArgs() &&
1685+
SemaBuiltinConstantArg(TheCall, ArgNo, Result))
16831686
return true;
16841687
ICEArguments &= ~(1 << ArgNo);
16851688
}
@@ -1943,6 +1946,8 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
19431946
case Builtin::BI__builtin_nontemporal_store:
19441947
return SemaBuiltinNontemporalOverloaded(TheCallResult);
19451948
case Builtin::BI__builtin_memcpy_inline: {
1949+
if (checkArgCount(*this, TheCall, 3))
1950+
return ExprError();
19461951
auto ArgArrayConversionFailed = [&](unsigned Arg) {
19471952
ExprResult ArgExpr =
19481953
DefaultFunctionArrayLvalueConversion(TheCall->getArg(Arg));

clang/test/Sema/builtins-memcpy-inline.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,8 @@ void test_memcpy_inline_implicit_conversion(void *ptr) {
4242
__builtin_memcpy_inline(ptr, a, 5);
4343
__builtin_memcpy_inline(a, ptr, 5);
4444
}
45+
46+
void test_memcpy_inline_num_args(void *dst, void *src) {
47+
__builtin_memcpy_inline(); // expected-error {{too few arguments to function call}}
48+
__builtin_memcpy_inline(dst, src, 4, NULL); // expected-error {{too many arguments to function call}}
49+
}

0 commit comments

Comments
 (0)