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