diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 18 | ||||
| -rw-r--r-- | clang/test/Sema/integer-overflow.c | 15 | ||||
| -rw-r--r-- | clang/test/SemaCXX/integer-overflow.cpp | 15 | ||||
| -rw-r--r-- | clang/test/SemaObjC/integer-overflow.m | 18 |
4 files changed, 59 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 8686700a056..80ea1379d4d 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -10225,18 +10225,22 @@ void Sema::CheckForIntOverflow (Expr *E) { SmallVector<Expr *, 2> Exprs(1, E); do { - Expr *E = Exprs.pop_back_val(); + Expr *OriginalE = Exprs.pop_back_val(); + Expr *E = OriginalE->IgnoreParenCasts(); - if (isa<BinaryOperator>(E->IgnoreParenCasts())) { - E->IgnoreParenCasts()->EvaluateForOverflow(Context); + if (isa<BinaryOperator>(E)) { + E->EvaluateForOverflow(Context); continue; } - if (auto InitList = dyn_cast<InitListExpr>(E)) + if (auto InitList = dyn_cast<InitListExpr>(OriginalE)) Exprs.append(InitList->inits().begin(), InitList->inits().end()); - - if (isa<ObjCBoxedExpr>(E)) - E->IgnoreParenCasts()->EvaluateForOverflow(Context); + else if (isa<ObjCBoxedExpr>(OriginalE)) + E->EvaluateForOverflow(Context); + else if (auto Call = dyn_cast<CallExpr>(E)) + Exprs.append(Call->arg_begin(), Call->arg_end()); + else if (auto Message = dyn_cast<ObjCMessageExpr>(E)) + Exprs.append(Message->arg_begin(), Message->arg_end()); } while (!Exprs.empty()); } diff --git a/clang/test/Sema/integer-overflow.c b/clang/test/Sema/integer-overflow.c index 44c2629ebf7..d66ce7ff164 100644 --- a/clang/test/Sema/integer-overflow.c +++ b/clang/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/clang/test/SemaCXX/integer-overflow.cpp b/clang/test/SemaCXX/integer-overflow.cpp index 6abc9561449..956ec157b3f 100644 --- a/clang/test/SemaCXX/integer-overflow.cpp +++ b/clang/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/clang/test/SemaObjC/integer-overflow.m b/clang/test/SemaObjC/integer-overflow.m new file mode 100644 index 00000000000..6d82e2951c1 --- /dev/null +++ b/clang/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 |

