Summary: The methods in objc can have the same name in the same class, but one be instance and the other class, so that we need to take the instance flag into account when defining unique names for ObjC methods.master
							parent
							
								
									53125b171a
								
							
						
					
					
						commit
						732d23ce4d
					
				| @ -0,0 +1,43 @@ | ||||
| /* | ||||
| * Copyright (c) 2014 - present Facebook, Inc. | ||||
| * All rights reserved. | ||||
| * | ||||
| * This source code is licensed under the BSD style license found in the | ||||
| * LICENSE file in the root directory of this source tree. An additional grant | ||||
| * of patent rights can be found in the PATENTS file in the same directory. | ||||
| */ | ||||
| 
 | ||||
| #import <Foundation/NSObject.h> | ||||
| 
 | ||||
| @interface A : NSObject { | ||||
|     @public int x; | ||||
| } | ||||
| 
 | ||||
| +(A*) meth; | ||||
| 
 | ||||
| @property (nonatomic, readonly) A* meth; | ||||
| 
 | ||||
| @end | ||||
| 
 | ||||
| @implementation A | ||||
| 
 | ||||
| +(A*) meth { | ||||
|     return [A new]; | ||||
| } | ||||
| 
 | ||||
| -(A*) meth { | ||||
|     return nil; | ||||
| } | ||||
| 
 | ||||
| @end | ||||
| 
 | ||||
| int test() { | ||||
|     A* para = [A new]; | ||||
|     A *a = [para meth]; | ||||
|     return a->x; | ||||
| } | ||||
| 
 | ||||
| int test2(A* para) { | ||||
|     A *a = [A meth]; | ||||
|     return a->x; | ||||
| } | ||||
| @ -0,0 +1,68 @@ | ||||
| /* | ||||
| * Copyright (c) 2013 - present Facebook, Inc. | ||||
| * All rights reserved. | ||||
| * | ||||
| * This source code is licensed under the BSD style license found in the | ||||
| * LICENSE file in the root directory of this source tree. An additional grant | ||||
| * of patent rights can be found in the PATENTS file in the same directory. | ||||
| */ | ||||
| 
 | ||||
| package endtoend.objc; | ||||
| 
 | ||||
| import static org.hamcrest.MatcherAssert.assertThat; | ||||
| import static utils.matchers.ResultContainsExactly.containsExactly; | ||||
| import static utils.matchers.ResultContainsNoErrorInMethod.doesNotContain; | ||||
| import static utils.matchers.ResultContainsErrorInMethod.contains; | ||||
| 
 | ||||
| import com.google.common.collect.ImmutableList; | ||||
| 
 | ||||
| import org.junit.BeforeClass; | ||||
| import org.junit.ClassRule; | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import utils.DebuggableTemporaryFolder; | ||||
| import utils.InferException; | ||||
| import utils.InferResults; | ||||
| import utils.InferRunner; | ||||
| 
 | ||||
| public class NPEEqualNamesTest { | ||||
| 
 | ||||
|   public static final String NPE_FILE = | ||||
|       "infer/tests/codetoanalyze/objc/errors/npe/Npe_with_equal_names.m"; | ||||
| 
 | ||||
|   private static ImmutableList<String> inferCmdNPD; | ||||
| 
 | ||||
|   public static final String NULL_DEREFERENCE = "NULL_DEREFERENCE"; | ||||
| 
 | ||||
|   @ClassRule | ||||
|   public static DebuggableTemporaryFolder folderNPD = new DebuggableTemporaryFolder(); | ||||
| 
 | ||||
|   @BeforeClass | ||||
|   public static void runInfer() throws InterruptedException, IOException { | ||||
|     inferCmdNPD = InferRunner.createiOSInferCommandWithMLBuckets( | ||||
|         folderNPD, | ||||
|         NPE_FILE, | ||||
|         "cf", | ||||
|         false); | ||||
|   } | ||||
| 
 | ||||
|   @Test | ||||
|   public void nullDereferenceTest() throws InterruptedException, IOException, InferException { | ||||
|     InferResults inferResults = InferRunner.runInferObjC(inferCmdNPD); | ||||
|     String[] procedures = { | ||||
|         "test", | ||||
|     }; | ||||
|     assertThat( | ||||
|         "Results should contain null pointer dereference error", | ||||
|         inferResults, | ||||
|         containsExactly( | ||||
|             NULL_DEREFERENCE, | ||||
|             NPE_FILE, | ||||
|             procedures | ||||
|         ) | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue