r211215 - Objective-C. Check for integer overflow in Objective-C's

Fariborz Jahanian fjahanian at apple.com
Wed Jun 18 13:49:03 PDT 2014


Author: fjahanian
Date: Wed Jun 18 15:49:02 2014
New Revision: 211215

URL: http://llvm.org/viewvc/llvm-project?rev=211215&view=rev
Log:
Objective-C. Check for integer overflow in Objective-C's
boxed expression. // rdar://16417427

Modified:
    cfe/trunk/lib/Sema/SemaExprObjC.cpp
    cfe/trunk/test/SemaObjC/objc-literal-nsnumber.m

Modified: cfe/trunk/lib/Sema/SemaExprObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprObjC.cpp?rev=211215&r1=211214&r2=211215&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExprObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExprObjC.cpp Wed Jun 18 15:49:02 2014
@@ -555,7 +555,7 @@ ExprResult Sema::BuildObjCBoxedExpr(Sour
         break;
       }
     }
-    
+    CheckForIntOverflow(ValueExpr);
     // FIXME:  Do I need to do anything special with BoolTy expressions?
     
     // Look for the appropriate method within NSNumber.

Modified: cfe/trunk/test/SemaObjC/objc-literal-nsnumber.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/objc-literal-nsnumber.m?rev=211215&r1=211214&r2=211215&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjC/objc-literal-nsnumber.m (original)
+++ cfe/trunk/test/SemaObjC/objc-literal-nsnumber.m Wed Jun 18 15:49:02 2014
@@ -1,10 +1,12 @@
-// RUN: %clang_cc1  -fsyntax-only -fblocks -verify %s
+// RUN: %clang_cc1  -fsyntax-only -fblocks -triple x86_64-apple-darwin10 -verify %s
 // rdar://10111397
 
 #if __LP64__
 typedef unsigned long NSUInteger;
+typedef long NSInteger;
 #else
 typedef unsigned int NSUInteger;
+typedef int NSInteger;
 #endif
 
 @interface NSObject
@@ -13,10 +15,23 @@ typedef unsigned int NSUInteger;
 
 @interface NSNumber : NSObject
 + (NSNumber *)numberWithChar:(char)value;
++ (NSNumber *)numberWithUnsignedChar:(unsigned char)value;
++ (NSNumber *)numberWithShort:(short)value;
++ (NSNumber *)numberWithUnsignedShort:(unsigned short)value;
 + (NSNumber *)numberWithInt:(int)value;
++ (NSNumber *)numberWithUnsignedInt:(unsigned int)value;
++ (NSNumber *)numberWithLong:(long)value;
++ (NSNumber *)numberWithUnsignedLong:(unsigned long)value;
++ (NSNumber *)numberWithLongLong:(long long)value;
++ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value;
 + (NSNumber *)numberWithFloat:(float)value;
++ (NSNumber *)numberWithInteger:(NSInteger)value ;
++ (NSNumber *)numberWithUnsignedInteger:(NSUInteger)value ;
 @end
 
+// rdar://16417427
+int big = 1391126400;
+int thousand = 1000;
 int main() {
   NSNumber * N = @3.1415926535;  // expected-error {{declaration of 'numberWithDouble:' is missing in NSNumber class}}
   NSNumber *noNumber = @__objc_yes; // expected-error {{declaration of 'numberWithBool:' is missing in NSNumber class}}
@@ -32,6 +47,9 @@ int main() {
   int five = 5;
   @-five; // expected-error{{@- must be followed by a number to form an NSNumber object}}
   @+five; // expected-error{{@+ must be followed by a number to form an NSNumber object}}
+  NSNumber *av = @(1391126400000);
+  NSNumber *bv = @(1391126400 * 1000); // expected-warning {{overflow in expression; result is -443003904 with type 'int'}}
+  NSNumber *cv = @(big * thousand);
 }
 
 // Dictionary test





More information about the cfe-commits mailing list