clang-1/lib/Checker
Marcin Swiderski 6a02b609c2 Added method for handling CXXOperatorCallExpr differently from CallExpr if CXXOperatorCallExpr represents method call.
Also fixed returning ExpolodedNodeSet from VisitCXXMethodCallExpr.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119684 91177308-0d34-0410-b5e6-96231b3b80d8
2010-11-18 06:29:23 +00:00
..
AdjustedReturnValueChecker.cpp MemRegion can refer to ASTContext without external help. 2010-08-11 06:10:55 +00:00
AggExprVisitor.cpp Now initializer of C++ record type is visited as block-level expr. 2010-11-01 09:09:44 +00:00
AnalysisConsumer.cpp Make sure to always check the result of 2010-11-12 07:15:47 +00:00
AnalysisManager.cpp Reapply r108617. 2010-07-19 01:31:21 +00:00
AnalyzerStatsChecker.cpp Make sure to always check the result of 2010-11-12 07:15:47 +00:00
ArrayBoundChecker.cpp do not bind temporaries to non-const references 2010-09-09 10:51:37 +00:00
AttrNonNullChecker.cpp Teach AttrNonNullChecker about transparent unions. Fixes crash reported in <rdar://problem/8642434>. 2010-11-09 02:11:43 +00:00
BasicConstraintManager.cpp Fold additive constants, and support comparsions of the form $sym+const1 <> const2 2010-06-18 22:49:11 +00:00
BasicObjCFoundationChecks.cpp Move classes into anonymous namespaces. 2010-10-22 16:33:16 +00:00
BasicObjCFoundationChecks.h Convert GRSimpleAPIChecks in BasicObjCFoundationChecks to be Checkers. 2010-10-20 23:38:56 +00:00
BasicStore.cpp Added mapping from 'this' to it's SymbolicRegion in BasicStoreManager::getInitialStore. 2010-11-17 06:22:54 +00:00
BasicValueFactory.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
BugReporter.cpp Refactored BugReporter to refer to EndNode as ErrorNode. We currently make the assumption that EndNode == ErrorNode, but upcoming changes will break this. 2010-09-16 03:50:38 +00:00
BugReporterVisitors.cpp Reapply 112850 and 112839 with a constructor for the BinaryOperatorData struct. Clang would zero out the enum and pointer in the struct in some conditions, but GCC would never zero out the values. 2010-09-02 23:30:22 +00:00
BuiltinFunctionChecker.cpp Add a new symbol type, SymbolExtent, to represent the extents of memory regions that may not be known at compile-time (such as those created by malloc). This replaces the old setExtent/getExtent API on Store, which used the GRState's GDM to store SVals. 2010-07-04 00:00:41 +00:00
CFRefCount.cpp Tweak retain/release checker diagnostics to specify a leak occurs because an object is not referenced later in the path, 2010-10-15 22:50:23 +00:00
CMakeLists.txt Unbreak the CMake build. 2010-10-10 09:17:09 +00:00
CStringChecker.cpp Teach the CStringChecker and PthreadLockChecker about non-identifier 2010-11-01 23:16:05 +00:00
CallAndMessageChecker.cpp Tweak nil receiver checker to not warning about 64-bit return values. 2010-09-30 00:37:10 +00:00
CastSizeChecker.cpp Don't assert in CastSizeChecker when the casted-to pointee is an incomplete type. Fixes PR 8050. 2010-09-01 20:35:38 +00:00
CastToStructChecker.cpp Introduce Type::isStructureOrClassType(), which does the obvious 2010-04-26 21:31:17 +00:00
CheckDeadStores.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
CheckObjCDealloc.cpp Add clang support for IBOutletCollection. 2010-05-19 17:38:06 +00:00
CheckObjCInstMethSignature.cpp Add raw_ostream operators to NamedDecl for convenience. Switch over all users of getNameAsString on a stream. 2010-04-17 09:33:03 +00:00
CheckSecuritySyntaxOnly.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
CheckSizeofPointer.cpp Move 'LocalCheckers.h' to the 'Checkers' subdirectory. 2010-01-26 22:59:55 +00:00
Checker.cpp
CheckerHelpers.cpp Zap unused UnaryOperator::OffsetOf. 2010-08-13 01:36:11 +00:00
ChrootChecker.cpp comment out unused function 2010-10-11 05:38:10 +00:00
CocoaConventions.cpp Correctly handle 'Class<...>' when examining Cocoa conventions in the static analyzer. Fixes a crash reported in <rdar://problem/8272168>. Patch by Henry Mason! 2010-08-05 00:19:24 +00:00
DereferenceChecker.cpp Tweak null dereference checker to give better diagnostics for null dereferences resulting from array accesses. 2010-10-26 00:06:13 +00:00
DivZeroChecker.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
Environment.cpp Add optional record of "location" SVals in the environment. When we analyzing loads/stores, we lose the location SVal, which makes it difficult to recover in some cases (e.g., for post diagnostics). This is prep for pending changes to GRExprEngine. 2010-09-03 01:07:02 +00:00
ExplodedGraph.cpp
FixedAddressChecker.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
FlatStore.cpp - Allow making ElementRegions with complex offsets (expressions or symbols) for the purpose of bounds-checking. 2010-08-16 01:15:17 +00:00
FrontendActions.cpp Break Frontend's dependency on Rewrite, Checker and CodeGen in shared library configuration 2010-06-15 17:48:49 +00:00
GRBlockCounter.cpp Since we now may have basicblocks with the same block is in different function, 2010-03-23 05:05:02 +00:00
GRCXXExprEngine.cpp Added method for handling CXXOperatorCallExpr differently from CallExpr if CXXOperatorCallExpr represents method call. 2010-11-18 06:29:23 +00:00
GRCoreEngine.cpp Handle member initializer in C++ ctor. 2010-11-16 07:52:17 +00:00
GRExprEngine.cpp Added method for handling CXXOperatorCallExpr differently from CallExpr if CXXOperatorCallExpr represents method call. 2010-11-18 06:29:23 +00:00
GRExprEngineExperimentalChecks.cpp Add experimental chroot check which checks improper use of chroot(). Patch by 2010-10-10 05:45:30 +00:00
GRExprEngineExperimentalChecks.h Add experimental chroot check which checks improper use of chroot(). Patch by 2010-10-10 05:45:30 +00:00
GRExprEngineInternalChecks.h Implement: <rdar://problem/6351970> rule request: warn if @synchronized mutex can be nil 2010-09-10 03:05:40 +00:00
GRState.cpp Rename GRState::getSVal() -> getRawSVal() and getSimplifiedSVal() -> getSVal(). 2010-09-09 07:13:00 +00:00
HTMLDiagnostics.cpp llvm::errs() is non-buffered, so it doesn't need to be flushed. 2010-06-28 15:56:07 +00:00
IdempotentOperationChecker.cpp Refine IdempotentOperationChecker::PathWasCompletelyAnalyzed() to also check 2010-11-13 05:12:26 +00:00
LLVMConventionsChecker.cpp Remove dead code, caught by unused function warnings. 2010-08-15 01:15:58 +00:00
MacOSXAPIChecker.cpp Checker: random include cleanup. 2010-03-27 21:19:47 +00:00
Makefile BUILD_ARCHIVE is the default for libraries, no need to set it. 2010-07-18 00:14:47 +00:00
MallocChecker.cpp "I see dead code". IdempotentOperationChecker::isTruncationExtensionAssignment 2010-09-03 04:34:38 +00:00
ManagerRegistry.cpp
MemRegion.cpp Disallow the use of UnknownVal as the index for ElementRegions. UnknownVals can be used as 2010-09-15 03:13:30 +00:00
NSAutoreleasePoolChecker.cpp Overhaul the AST representation of Objective-C message send 2010-04-21 00:45:42 +00:00
NSErrorChecker.cpp Add raw_ostream operators to NamedDecl for convenience. Switch over all users of getNameAsString on a stream. 2010-04-17 09:33:03 +00:00
NoReturnFunctionChecker.cpp the big refactoring bits of PR3782. 2010-03-30 20:24:48 +00:00
OSAtomicChecker.cpp MemRegion can refer to ASTContext without external help. 2010-08-11 06:10:55 +00:00
ObjCAtSyncChecker.cpp Only enable the ObjCAtSyncChecker when the translation unit uses Objective-C. 2010-11-08 16:52:54 +00:00
ObjCUnusedIVarsChecker.cpp Don't warn about unamed bitfield ivars in the ObjCUnusedIvarsChecker. Fixes <rdar://problem/8481311>. 2010-10-28 02:16:22 +00:00
PathDiagnostic.cpp Simplify code and remove comment that is no longer relevant. 2010-07-07 12:24:14 +00:00
PlistDiagnostics.cpp Break Frontend's dependency on Rewrite, Checker and CodeGen in shared library configuration 2010-06-15 17:48:49 +00:00
PointerArithChecker.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
PointerSubChecker.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
PthreadLockChecker.cpp Teach the CStringChecker and PthreadLockChecker about non-identifier 2010-11-01 23:16:05 +00:00
README.txt Adds a README for the Clang static analyzer to document its design and work flow. The contents are taken from email notes by kremenek and xuzhongxing. 2010-11-15 23:19:25 +00:00
RangeConstraintManager.cpp zap dead ctor 2010-08-26 01:17:33 +00:00
RegionStore.cpp RegionStore/BasicStore: do not return UndefinedVal for accesses to concrete addresses; instead return UnknownVal. This 2010-11-11 23:10:10 +00:00
ReturnPointerRangeChecker.cpp do not bind temporaries to non-const references 2010-09-09 10:51:37 +00:00
ReturnUndefChecker.cpp Add range of return value expression in ReturnUndefChecker. Patch by Jim Goodnow II! 2010-08-31 01:35:32 +00:00
SVals.cpp Disallow the use of UnknownVal as the index for ElementRegions. UnknownVals can be used as 2010-09-15 03:13:30 +00:00
SValuator.cpp Relax assertion in SValuator so that we don't crash when analyzing a call via a function pointer that 2010-11-15 20:09:42 +00:00
SimpleConstraintManager.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
SimpleConstraintManager.h - Allow making ElementRegions with complex offsets (expressions or symbols) for the purpose of bounds-checking. 2010-08-16 01:15:17 +00:00
SimpleSValuator.cpp "I see dead code". IdempotentOperationChecker::isTruncationExtensionAssignment 2010-09-03 04:34:38 +00:00
StackAddrLeakChecker.cpp Detabify. 2010-08-22 01:00:03 +00:00
Store.cpp Disallow the use of UnknownVal as the index for ElementRegions. UnknownVals can be used as 2010-09-15 03:13:30 +00:00
StreamChecker.cpp Fix null pointer dereference in StreamChecker::Fseek (reported in PR 8081) and simplify surrounding checking logic. 2010-09-07 20:45:26 +00:00
SymbolManager.cpp Enabled relaxed LiveVariables analysis in the path-sensitive engine to increase the coverage of bugs. Primarily affects IdempotentOperationChecker. 2010-08-27 22:46:32 +00:00
UndefBranchChecker.cpp Constify all references to Stmt* and CFGBlock* in libChecker. 2010-07-20 06:22:24 +00:00
UndefCapturedBlockVarChecker.cpp Checker: random include cleanup. 2010-03-27 21:19:47 +00:00
UndefResultChecker.cpp Checker: random include cleanup. 2010-03-27 21:19:47 +00:00
UndefinedArraySubscriptChecker.cpp Checker: random include cleanup. 2010-03-27 21:19:47 +00:00
UndefinedAssignmentChecker.cpp For GRExprEngine::EvalBind() (and called visitors), unifiy StoreE and AssignE. Now StoreE (const Stmt*) represents the expression where the store took place, which is the assignment expression if it takes place in an assignment. This removes some conceptual dissidence as well as removes an extra parameter from the Checker::PreVisitBind() visitor. It also improves ranges and source location information in analyzer diagnostics. 2010-09-02 00:56:20 +00:00
UnixAPIChecker.cpp Add comments. 2010-11-17 00:50:34 +00:00
UnreachableCodeChecker.cpp UnreachableCodeChecker cleanup and improvements 2010-10-06 23:02:25 +00:00
VLASizeChecker.cpp GCC didn't care for my attempt at API compatibility, so brute-force everything 2010-08-25 11:45:40 +00:00
ValueManager.cpp Another metadata symbol change (missed a file) 2010-08-14 20:22:12 +00:00

README.txt

//===----------------------------------------------------------------------===//
// Clang Static Analyzer
//===----------------------------------------------------------------------===//

= Library Structure =

The analyzer library has two layers: a (low-level) static analysis
engine (GRExprEngine.cpp and friends), and some static checkers
(*Checker.cpp).  The latter are built on top of the former via the
Checker and CheckerVisitor interfaces (Checker.h and
CheckerVisitor.h).  The Checker interface is designed to be minimal
and simple for checker writers, and attempts to isolate them from much
of the gore of the internal analysis engine.

= How It Works =

The analyzer is inspired by several foundational research papers ([1],
[2]).  (FIXME: kremenek to add more links)

In a nutshell, the analyzer is basically a source code simulator that
traces out possible paths of execution.  The state of the program
(values of variables and expressions) is encapsulated by the state
(GRState).  A location in the program is called a program point
(ProgramPoint), and the combination of state and program point is a
node in an exploded graph (ExplodedGraph).  The term "exploded" comes
from exploding the control-flow edges in the control-flow graph (CFG).

Conceptually the analyzer does a reachability analysis through the
ExplodedGraph.  We start at a root node, which has the entry program
point and initial state, and then simulate transitions by analyzing
individual expressions.  The analysis of an expression can cause the
state to change, resulting in a new node in the ExplodedGraph with an
updated program point and an updated state.  A bug is found by hitting
a node that satisfies some "bug condition" (basically a violation of a
checking invariant).

The analyzer traces out multiple paths by reasoning about branches and
then bifurcating the state: on the true branch the conditions of the
branch are assumed to be true and on the false branch the conditions
of the branch are assumed to be false.  Such "assumptions" create
constraints on the values of the program, and those constraints are
recorded in the GRState object (and are manipulated by the
ConstraintManager).  If assuming the conditions of a branch would
cause the constraints to be unsatisfiable, the branch is considered
infeasible and that path is not taken.  This is how we get
path-sensitivity.  We reduce exponential blow-up by caching nodes.  If
a new node with the same state and program point as an existing node
would get generated, the path "caches out" and we simply reuse the
existing node.  Thus the ExplodedGraph is not a DAG; it can contain
cycles as paths loop back onto each other and cache out.

GRState and ExplodedNodes are basically immutable once created.  Once
one creates a GRState, you need to create a new one to get a new
GRState.  This immutability is key since the ExplodedGraph represents
the behavior of the analyzed program from the entry point.  To
represent these efficiently, we use functional data structures (e.g.,
ImmutableMaps) which share data between instances.

Finally, individual Checkers work by also manipulating the analysis
state.  The analyzer engine talks to them via a visitor interface.
For example, the PreVisitCallExpr() method is called by GRExprEngine
to tell the Checker that we are about to analyze a CallExpr, and the
checker is asked to check for any preconditions that might not be
satisfied.  The checker can do nothing, or it can generate a new
GRState and ExplodedNode which contains updated checker state.  If it
finds a bug, it can tell the BugReporter object about the bug,
providing it an ExplodedNode which is the last node in the path that
triggered the problem.

= Working on the Analyzer =

If you are interested in bringing up support for C++ expressions, the
best place to look is the visitation logic in GRExprEngine, which
handles the simulation of individual expressions.  There are plenty of
examples there of how other expressions are handled.

If you are interested in writing checkers, look at the Checker and
CheckerVisitor interfaces (Checker.h and CheckerVisitor.h).  Also look
at the files named *Checker.cpp for examples on how you can implement
these interfaces.

= Debugging the Analyzer =

There are some useful command-line options for debugging.  For example:

$ clang -cc1 -help | grep analyze
 -analyze-function <value>
 -analyzer-display-progress
 -analyzer-viz-egraph-graphviz
 ...

The first allows you to specify only analyzing a specific function.
The second prints to the console what function is being analyzed.  The
third generates a graphviz dot file of the ExplodedGraph.  This is
extremely useful when debugging the analyzer and viewing the
simulation results.

Of course, viewing the CFG (Control-Flow Graph) is also useful:

$ clang -cc1 -help | grep cfg
 -cfg-add-implicit-dtors Add C++ implicit destructors to CFGs for all analyses
 -cfg-add-initializers   Add C++ initializers to CFGs for all analyses
 -cfg-dump               Display Control-Flow Graphs
 -cfg-view               View Control-Flow Graphs using GraphViz
 -unoptimized-cfg        Generate unoptimized CFGs for all analyses

-cfg-dump dumps a textual representation of the CFG to the console,
and -cfg-view creates a GraphViz representation.

= References =

[1] Precise interprocedural dataflow analysis via graph reachability,
    T Reps, S Horwitz, and M Sagiv, POPL '95,
    http://portal.acm.org/citation.cfm?id=199462

[2] A memory model for static analysis of C programs, Z Xu, T
    Kremenek, and J Zhang, http://lcs.ios.ac.cn/~xzx/memmodel.pdf