[analyzer] Track runtime types represented by Obj-C Class objects
authorValeriy Savchenko <vsavchenko@apple.com>
Wed, 22 Apr 2020 15:15:03 +0000 (18:15 +0300)
committerValeriy Savchenko <vsavchenko@apple.com>
Wed, 29 Apr 2020 10:35:53 +0000 (13:35 +0300)
commit239c53b72b18d6fd6c5ad9a6d27cd09b950dc97a
treec9f7f3553ccfab68cccbf611f0c440e8460a11c7
parente018b8bbb0ba8ac1bb36931827c2fbc3ec31c1da
[analyzer] Track runtime types represented by Obj-C Class objects

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
15 files changed:
clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
clang/include/clang/StaticAnalyzer/Core/PathSensitive/DynamicType.h
clang/include/clang/StaticAnalyzer/Core/PathSensitive/DynamicTypeInfo.h
clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h
clang/lib/StaticAnalyzer/Checkers/CastValueChecker.cpp
clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
clang/lib/StaticAnalyzer/Checkers/ObjCSuperDeallocChecker.cpp
clang/lib/StaticAnalyzer/Core/CallEvent.cpp
clang/lib/StaticAnalyzer/Core/DynamicType.cpp
clang/lib/StaticAnalyzer/Core/ProgramState.cpp
clang/test/Analysis/cast-value-state-dump.cpp
clang/test/Analysis/class-object-state-dump.m [new file with mode: 0644]
clang/test/Analysis/inlining/InlineObjCClassMethod.m
clang/test/Analysis/inlining/ObjCDynTypePopagation.m
clang/test/Analysis/retain-release-inline.m