mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 08:46:08 +00:00

Summary: Objective-C Class objects can be used to do a dynamic dispatch on class methods. The analyzer had a few places where we tried to overcome the dynamic nature of it and still guess the actual function that is being called. That was done mostly using some simple heuristics covering the most widespread cases (e.g. [[self class] classmethod]). This solution introduces a way to track types represented by Class objects and work with that instead of direct AST matching. rdar://problem/50739539 Differential Revision: https://reviews.llvm.org/D78286
39 lines
940 B
Objective-C
39 lines
940 B
Objective-C
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection \
|
|
// RUN: -verify %s 2>&1 | FileCheck %s
|
|
|
|
// expected-no-diagnostics
|
|
|
|
void clang_analyzer_printState();
|
|
|
|
@interface NSObject {
|
|
}
|
|
+ (id)alloc;
|
|
+ (Class)class;
|
|
- (id)init;
|
|
- (Class)class;
|
|
@end
|
|
|
|
@interface Parent : NSObject
|
|
@end
|
|
@interface Child : Parent
|
|
@end
|
|
|
|
void foo(id A, id B);
|
|
|
|
@implementation Child
|
|
+ (void)test {
|
|
id ClassAsID = [self class];
|
|
id Object = [[ClassAsID alloc] init];
|
|
Class TheSameClass = [Object class];
|
|
|
|
clang_analyzer_printState();
|
|
// CHECK: "class_object_types": [
|
|
// CHECK-NEXT: { "symbol": "conj_$[[#]]{Class, LC[[#]], S[[#]], #[[#]]}", "dyn_type": "Child", "sub_classable": true },
|
|
// CHECK-NEXT: { "symbol": "conj_$[[#]]{Class, LC[[#]], S[[#]], #[[#]]}", "dyn_type": "Child", "sub_classable": true }
|
|
// CHECK-NEXT: ]
|
|
|
|
// Let's make sure that the information is not GC'd away.
|
|
foo(ClassAsID, TheSameClass);
|
|
}
|
|
@end
|