From: Volodymyr Sapsai Date: Tue, 27 Mar 2018 21:29:05 +0000 (+0000) Subject: [Sema] Emit -Winteger-overflow for arguments in function calls, ObjC messages. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6049e5437bf2e1fd7eb53d145d40bca86b940990;p=clang [Sema] Emit -Winteger-overflow for arguments in function calls, ObjC messages. rdar://problem/35539384 Reviewers: ahatanak, nicholas, rsmith, jkorous-apple Reviewed By: jkorous-apple Subscribers: cfe-commits, jkorous-apple Differential Revision: https://reviews.llvm.org/D42938 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@328671 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 8686700a05..80ea1379d4 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -10225,18 +10225,22 @@ void Sema::CheckForIntOverflow (Expr *E) { SmallVector Exprs(1, E); do { - Expr *E = Exprs.pop_back_val(); + Expr *OriginalE = Exprs.pop_back_val(); + Expr *E = OriginalE->IgnoreParenCasts(); - if (isa(E->IgnoreParenCasts())) { - E->IgnoreParenCasts()->EvaluateForOverflow(Context); + if (isa(E)) { + E->EvaluateForOverflow(Context); continue; } - if (auto InitList = dyn_cast(E)) + if (auto InitList = dyn_cast(OriginalE)) Exprs.append(InitList->inits().begin(), InitList->inits().end()); - - if (isa(E)) - E->IgnoreParenCasts()->EvaluateForOverflow(Context); + else if (isa(OriginalE)) + E->EvaluateForOverflow(Context); + else if (auto Call = dyn_cast(E)) + Exprs.append(Call->arg_begin(), Call->arg_end()); + else if (auto Message = dyn_cast(E)) + Exprs.append(Message->arg_begin(), Message->arg_end()); } while (!Exprs.empty()); } diff --git a/test/Sema/integer-overflow.c b/test/Sema/integer-overflow.c index 44c2629ebf..d66ce7ff16 100644 --- a/test/Sema/integer-overflow.c +++ b/test/Sema/integer-overflow.c @@ -158,6 +158,21 @@ uint64_t check_integer_overflows(int i) { return ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024))); } +void check_integer_overflows_in_function_calls() { +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + (void)f0(4608 * 1024 * 1024); + +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + uint64_t x = f0(4608 * 1024 * 1024); + +// expected-warning@+2 {{overflow in expression; result is 536870912 with type 'int'}} + uint64_t (*f0_ptr)(uint64_t) = &f0; + (void)(*f0_ptr)(4608 * 1024 * 1024); + +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + (void)f2(0, f0(4608 * 1024 * 1024)); +} + struct s { unsigned x; unsigned y; diff --git a/test/SemaCXX/integer-overflow.cpp b/test/SemaCXX/integer-overflow.cpp index 6abc956144..956ec157b3 100644 --- a/test/SemaCXX/integer-overflow.cpp +++ b/test/SemaCXX/integer-overflow.cpp @@ -169,3 +169,18 @@ uint64_t check_integer_overflows(int i) { //expected-note {{declared here}} // expected-warning@+1 2{{overflow in expression; result is 536870912 with type 'int'}} return ((4608 * 1024 * 1024) + ((uint64_t)(4608 * 1024 * 1024))); } + +void check_integer_overflows_in_function_calls() { +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + (void)f0(4608 * 1024 * 1024); + +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + uint64_t x = f0(4608 * 1024 * 1024); + +// expected-warning@+2 {{overflow in expression; result is 536870912 with type 'int'}} + uint64_t (*f0_ptr)(uint64_t) = &f0; + (void)(*f0_ptr)(4608 * 1024 * 1024); + +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + (void)f2(0, f0(4608 * 1024 * 1024)); +} diff --git a/test/SemaObjC/integer-overflow.m b/test/SemaObjC/integer-overflow.m new file mode 100644 index 0000000000..6d82e2951c --- /dev/null +++ b/test/SemaObjC/integer-overflow.m @@ -0,0 +1,18 @@ +// RUN: %clang_cc1 -Wno-objc-root-class -fsyntax-only -verify %s + +@interface Foo +@end + +@implementation Foo +- (int)add:(int)a with:(int)b { + return a + b; +} + +- (void)testIntegerOverflows { +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + (void)[self add:0 with:4608 * 1024 * 1024]; + +// expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} + (void)[self add:0 with:[self add:4608 * 1024 * 1024 with:0]]; +} +@end