mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-03 19:32:35 +00:00
Remove BasicConstraintManager. It hasn't been in active service for a while.
As part of this change, I discovered that a few of our tests were not testing the RangeConstraintManager. Luckily all of those passed when I moved them over to use that constraint manager. llvm-svn: 162384
This commit is contained in:
parent
e07728b936
commit
a056d62961
@ -21,7 +21,6 @@ ANALYSIS_STORE(RegionStore, "region", "Use region-based analyzer store", CreateR
|
||||
#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN)
|
||||
#endif
|
||||
|
||||
ANALYSIS_CONSTRAINTS(BasicConstraints, "basic", "Use basic constraint tracking", CreateBasicConstraintManager)
|
||||
ANALYSIS_CONSTRAINTS(RangeConstraints, "range", "Use constraint tracking of concrete value ranges", CreateRangeConstraintManager)
|
||||
|
||||
#ifndef ANALYSIS_DIAGNOSTICS
|
||||
|
@ -69,8 +69,6 @@ protected:
|
||||
virtual bool canReasonAbout(SVal X) const = 0;
|
||||
};
|
||||
|
||||
ConstraintManager* CreateBasicConstraintManager(ProgramStateManager& statemgr,
|
||||
SubEngine &subengine);
|
||||
ConstraintManager* CreateRangeConstraintManager(ProgramStateManager& statemgr,
|
||||
SubEngine &subengine);
|
||||
|
||||
|
@ -1,445 +0,0 @@
|
||||
//== BasicConstraintManager.cpp - Manage basic constraints.------*- C++ -*--==//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file defines BasicConstraintManager, a class that tracks simple
|
||||
// equality and inequality constraints on symbolic values of ProgramState.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "SimpleConstraintManager.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/APSIntType.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
|
||||
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
using namespace clang;
|
||||
using namespace ento;
|
||||
|
||||
|
||||
namespace { class ConstNotEq {}; }
|
||||
namespace { class ConstEq {}; }
|
||||
|
||||
typedef llvm::ImmutableMap<SymbolRef,ProgramState::IntSetTy> ConstNotEqTy;
|
||||
typedef llvm::ImmutableMap<SymbolRef,const llvm::APSInt*> ConstEqTy;
|
||||
|
||||
static int ConstEqIndex = 0;
|
||||
static int ConstNotEqIndex = 0;
|
||||
|
||||
namespace clang {
|
||||
namespace ento {
|
||||
template<>
|
||||
struct ProgramStateTrait<ConstNotEq> :
|
||||
public ProgramStatePartialTrait<ConstNotEqTy> {
|
||||
static inline void *GDMIndex() { return &ConstNotEqIndex; }
|
||||
};
|
||||
|
||||
template<>
|
||||
struct ProgramStateTrait<ConstEq> : public ProgramStatePartialTrait<ConstEqTy> {
|
||||
static inline void *GDMIndex() { return &ConstEqIndex; }
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
// BasicConstraintManager only tracks equality and inequality constraints of
|
||||
// constants and integer variables.
|
||||
class BasicConstraintManager
|
||||
: public SimpleConstraintManager {
|
||||
ProgramState::IntSetTy::Factory ISetFactory;
|
||||
public:
|
||||
BasicConstraintManager(ProgramStateManager &statemgr, SubEngine &subengine)
|
||||
: SimpleConstraintManager(subengine, statemgr.getBasicVals()),
|
||||
ISetFactory(statemgr.getAllocator()) {}
|
||||
|
||||
ProgramStateRef assumeSymEquality(ProgramStateRef State, SymbolRef Sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment,
|
||||
bool Assumption);
|
||||
|
||||
ProgramStateRef assumeSymNE(ProgramStateRef State, SymbolRef Sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment) {
|
||||
return assumeSymEquality(State, Sym, V, Adjustment, false);
|
||||
}
|
||||
|
||||
ProgramStateRef assumeSymEQ(ProgramStateRef State, SymbolRef Sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment) {
|
||||
return assumeSymEquality(State, Sym, V, Adjustment, true);
|
||||
}
|
||||
|
||||
ProgramStateRef assumeSymLT(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V,
|
||||
const llvm::APSInt& Adjustment);
|
||||
|
||||
ProgramStateRef assumeSymGT(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V,
|
||||
const llvm::APSInt& Adjustment);
|
||||
|
||||
ProgramStateRef assumeSymGE(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V,
|
||||
const llvm::APSInt& Adjustment);
|
||||
|
||||
ProgramStateRef assumeSymLE(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V,
|
||||
const llvm::APSInt& Adjustment);
|
||||
|
||||
ProgramStateRef AddEQ(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V);
|
||||
|
||||
ProgramStateRef AddNE(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V);
|
||||
|
||||
const llvm::APSInt* getSymVal(ProgramStateRef state,
|
||||
SymbolRef sym) const;
|
||||
|
||||
bool isNotEqual(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V) const;
|
||||
|
||||
bool isEqual(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V) const;
|
||||
|
||||
ProgramStateRef removeDeadBindings(ProgramStateRef state,
|
||||
SymbolReaper& SymReaper);
|
||||
|
||||
bool performTest(llvm::APSInt SymVal, llvm::APSInt Adjustment,
|
||||
BinaryOperator::Opcode Op, llvm::APSInt ComparisonVal);
|
||||
|
||||
void print(ProgramStateRef state,
|
||||
raw_ostream &Out,
|
||||
const char* nl,
|
||||
const char *sep);
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
ConstraintManager*
|
||||
ento::CreateBasicConstraintManager(ProgramStateManager& statemgr,
|
||||
SubEngine &subengine) {
|
||||
return new BasicConstraintManager(statemgr, subengine);
|
||||
}
|
||||
|
||||
// FIXME: This is a more general utility and should live somewhere else.
|
||||
bool BasicConstraintManager::performTest(llvm::APSInt SymVal,
|
||||
llvm::APSInt Adjustment,
|
||||
BinaryOperator::Opcode Op,
|
||||
llvm::APSInt ComparisonVal) {
|
||||
APSIntType Type(Adjustment);
|
||||
Type.apply(SymVal);
|
||||
Type.apply(ComparisonVal);
|
||||
SymVal += Adjustment;
|
||||
|
||||
assert(BinaryOperator::isComparisonOp(Op));
|
||||
BasicValueFactory &BVF = getBasicVals();
|
||||
const llvm::APSInt *Result = BVF.evalAPSInt(Op, SymVal, ComparisonVal);
|
||||
assert(Result && "Comparisons should always have valid results.");
|
||||
|
||||
return Result->getBoolValue();
|
||||
}
|
||||
|
||||
ProgramStateRef
|
||||
BasicConstraintManager::assumeSymEquality(ProgramStateRef State, SymbolRef Sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment,
|
||||
bool Assumption) {
|
||||
// Before we do any real work, see if the value can even show up.
|
||||
APSIntType AdjustmentType(Adjustment);
|
||||
if (AdjustmentType.testInRange(V) != APSIntType::RTR_Within)
|
||||
return Assumption ? NULL : State;
|
||||
|
||||
// Get the symbol type.
|
||||
BasicValueFactory &BVF = getBasicVals();
|
||||
ASTContext &Ctx = BVF.getContext();
|
||||
APSIntType SymbolType = BVF.getAPSIntType(Sym->getType(Ctx));
|
||||
|
||||
// First, see if the adjusted value is within range for the symbol.
|
||||
llvm::APSInt Adjusted = AdjustmentType.convert(V) - Adjustment;
|
||||
if (SymbolType.testInRange(Adjusted) != APSIntType::RTR_Within)
|
||||
return Assumption ? NULL : State;
|
||||
|
||||
// Now we can do things properly in the symbol space.
|
||||
SymbolType.apply(Adjusted);
|
||||
|
||||
// Second, determine if sym == X, where X+Adjustment != V.
|
||||
if (const llvm::APSInt *X = getSymVal(State, Sym)) {
|
||||
bool IsFeasible = (*X == Adjusted);
|
||||
return (IsFeasible == Assumption) ? State : NULL;
|
||||
}
|
||||
|
||||
// Third, determine if we already know sym+Adjustment != V.
|
||||
if (isNotEqual(State, Sym, Adjusted))
|
||||
return Assumption ? NULL : State;
|
||||
|
||||
// If we reach here, sym is not a constant and we don't know if it is != V.
|
||||
// Make the correct assumption.
|
||||
if (Assumption)
|
||||
return AddEQ(State, Sym, Adjusted);
|
||||
else
|
||||
return AddNE(State, Sym, Adjusted);
|
||||
}
|
||||
|
||||
// The logic for these will be handled in another ConstraintManager.
|
||||
// Approximate it here anyway by handling some edge cases.
|
||||
ProgramStateRef
|
||||
BasicConstraintManager::assumeSymLT(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment) {
|
||||
APSIntType ComparisonType(V), AdjustmentType(Adjustment);
|
||||
|
||||
// Is 'V' out of range above the type?
|
||||
llvm::APSInt Max = AdjustmentType.getMaxValue();
|
||||
if (V > ComparisonType.convert(Max)) {
|
||||
// This path is trivially feasible.
|
||||
return state;
|
||||
}
|
||||
|
||||
// Is 'V' the smallest possible value, or out of range below the type?
|
||||
llvm::APSInt Min = AdjustmentType.getMinValue();
|
||||
if (V <= ComparisonType.convert(Min)) {
|
||||
// sym cannot be any value less than 'V'. This path is infeasible.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Reject a path if the value of sym is a constant X and !(X+Adj < V).
|
||||
if (const llvm::APSInt *X = getSymVal(state, sym)) {
|
||||
bool isFeasible = performTest(*X, Adjustment, BO_LT, V);
|
||||
return isFeasible ? state : NULL;
|
||||
}
|
||||
|
||||
// FIXME: For now have assuming x < y be the same as assuming sym != V;
|
||||
return assumeSymNE(state, sym, V, Adjustment);
|
||||
}
|
||||
|
||||
ProgramStateRef
|
||||
BasicConstraintManager::assumeSymGT(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment) {
|
||||
APSIntType ComparisonType(V), AdjustmentType(Adjustment);
|
||||
|
||||
// Is 'V' the largest possible value, or out of range above the type?
|
||||
llvm::APSInt Max = AdjustmentType.getMaxValue();
|
||||
if (V >= ComparisonType.convert(Max)) {
|
||||
// sym cannot be any value greater than 'V'. This path is infeasible.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Is 'V' out of range below the type?
|
||||
llvm::APSInt Min = AdjustmentType.getMinValue();
|
||||
if (V < ComparisonType.convert(Min)) {
|
||||
// This path is trivially feasible.
|
||||
return state;
|
||||
}
|
||||
|
||||
// Reject a path if the value of sym is a constant X and !(X+Adj > V).
|
||||
if (const llvm::APSInt *X = getSymVal(state, sym)) {
|
||||
bool isFeasible = performTest(*X, Adjustment, BO_GT, V);
|
||||
return isFeasible ? state : NULL;
|
||||
}
|
||||
|
||||
// FIXME: For now have assuming x > y be the same as assuming sym != V;
|
||||
return assumeSymNE(state, sym, V, Adjustment);
|
||||
}
|
||||
|
||||
ProgramStateRef
|
||||
BasicConstraintManager::assumeSymGE(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment) {
|
||||
APSIntType ComparisonType(V), AdjustmentType(Adjustment);
|
||||
|
||||
// Is 'V' the largest possible value, or out of range above the type?
|
||||
llvm::APSInt Max = AdjustmentType.getMaxValue();
|
||||
ComparisonType.apply(Max);
|
||||
|
||||
if (V > Max) {
|
||||
// sym cannot be any value greater than 'V'. This path is infeasible.
|
||||
return NULL;
|
||||
} else if (V == Max) {
|
||||
// If the path is feasible then as a consequence we know that
|
||||
// 'sym+Adjustment == V' because there are no larger values.
|
||||
// Add this constraint.
|
||||
return assumeSymEQ(state, sym, V, Adjustment);
|
||||
}
|
||||
|
||||
// Is 'V' out of range below the type?
|
||||
llvm::APSInt Min = AdjustmentType.getMinValue();
|
||||
if (V < ComparisonType.convert(Min)) {
|
||||
// This path is trivially feasible.
|
||||
return state;
|
||||
}
|
||||
|
||||
// Reject a path if the value of sym is a constant X and !(X+Adj >= V).
|
||||
if (const llvm::APSInt *X = getSymVal(state, sym)) {
|
||||
bool isFeasible = performTest(*X, Adjustment, BO_GE, V);
|
||||
return isFeasible ? state : NULL;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
ProgramStateRef
|
||||
BasicConstraintManager::assumeSymLE(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt &V,
|
||||
const llvm::APSInt &Adjustment) {
|
||||
APSIntType ComparisonType(V), AdjustmentType(Adjustment);
|
||||
|
||||
// Is 'V' out of range above the type?
|
||||
llvm::APSInt Max = AdjustmentType.getMaxValue();
|
||||
if (V > ComparisonType.convert(Max)) {
|
||||
// This path is trivially feasible.
|
||||
return state;
|
||||
}
|
||||
|
||||
// Is 'V' the smallest possible value, or out of range below the type?
|
||||
llvm::APSInt Min = AdjustmentType.getMinValue();
|
||||
ComparisonType.apply(Min);
|
||||
|
||||
if (V < Min) {
|
||||
// sym cannot be any value less than 'V'. This path is infeasible.
|
||||
return NULL;
|
||||
} else if (V == Min) {
|
||||
// If the path is feasible then as a consequence we know that
|
||||
// 'sym+Adjustment == V' because there are no smaller values.
|
||||
// Add this constraint.
|
||||
return assumeSymEQ(state, sym, V, Adjustment);
|
||||
}
|
||||
|
||||
// Reject a path if the value of sym is a constant X and !(X+Adj >= V).
|
||||
if (const llvm::APSInt *X = getSymVal(state, sym)) {
|
||||
bool isFeasible = performTest(*X, Adjustment, BO_LE, V);
|
||||
return isFeasible ? state : NULL;
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
ProgramStateRef BasicConstraintManager::AddEQ(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V) {
|
||||
// Now that we have an actual value, we can throw out the NE-set.
|
||||
// Create a new state with the old bindings replaced.
|
||||
state = state->remove<ConstNotEq>(sym);
|
||||
return state->set<ConstEq>(sym, &getBasicVals().getValue(V));
|
||||
}
|
||||
|
||||
ProgramStateRef BasicConstraintManager::AddNE(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V) {
|
||||
|
||||
// First, retrieve the NE-set associated with the given symbol.
|
||||
ConstNotEqTy::data_type* T = state->get<ConstNotEq>(sym);
|
||||
ProgramState::IntSetTy S = T ? *T : ISetFactory.getEmptySet();
|
||||
|
||||
// Now add V to the NE set.
|
||||
S = ISetFactory.add(S, &getBasicVals().getValue(V));
|
||||
|
||||
// Create a new state with the old binding replaced.
|
||||
return state->set<ConstNotEq>(sym, S);
|
||||
}
|
||||
|
||||
const llvm::APSInt* BasicConstraintManager::getSymVal(ProgramStateRef state,
|
||||
SymbolRef sym) const {
|
||||
const ConstEqTy::data_type* T = state->get<ConstEq>(sym);
|
||||
return T ? *T : NULL;
|
||||
}
|
||||
|
||||
bool BasicConstraintManager::isNotEqual(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V) const {
|
||||
// Retrieve the NE-set associated with the given symbol.
|
||||
const ConstNotEqTy::data_type* T = state->get<ConstNotEq>(sym);
|
||||
|
||||
// See if V is present in the NE-set.
|
||||
return T ? T->contains(&getBasicVals().getValue(V)) : false;
|
||||
}
|
||||
|
||||
bool BasicConstraintManager::isEqual(ProgramStateRef state,
|
||||
SymbolRef sym,
|
||||
const llvm::APSInt& V) const {
|
||||
// Retrieve the EQ-set associated with the given symbol.
|
||||
const ConstEqTy::data_type* T = state->get<ConstEq>(sym);
|
||||
// See if V is present in the EQ-set.
|
||||
return T ? **T == V : false;
|
||||
}
|
||||
|
||||
/// Scan all symbols referenced by the constraints. If the symbol is not alive
|
||||
/// as marked in LSymbols, mark it as dead in DSymbols.
|
||||
ProgramStateRef
|
||||
BasicConstraintManager::removeDeadBindings(ProgramStateRef state,
|
||||
SymbolReaper& SymReaper) {
|
||||
|
||||
ConstEqTy CE = state->get<ConstEq>();
|
||||
ConstEqTy::Factory& CEFactory = state->get_context<ConstEq>();
|
||||
|
||||
for (ConstEqTy::iterator I = CE.begin(), E = CE.end(); I!=E; ++I) {
|
||||
SymbolRef sym = I.getKey();
|
||||
if (SymReaper.maybeDead(sym))
|
||||
CE = CEFactory.remove(CE, sym);
|
||||
}
|
||||
state = state->set<ConstEq>(CE);
|
||||
|
||||
ConstNotEqTy CNE = state->get<ConstNotEq>();
|
||||
ConstNotEqTy::Factory& CNEFactory = state->get_context<ConstNotEq>();
|
||||
|
||||
for (ConstNotEqTy::iterator I = CNE.begin(), E = CNE.end(); I != E; ++I) {
|
||||
SymbolRef sym = I.getKey();
|
||||
if (SymReaper.maybeDead(sym))
|
||||
CNE = CNEFactory.remove(CNE, sym);
|
||||
}
|
||||
|
||||
return state->set<ConstNotEq>(CNE);
|
||||
}
|
||||
|
||||
void BasicConstraintManager::print(ProgramStateRef state,
|
||||
raw_ostream &Out,
|
||||
const char* nl, const char *sep) {
|
||||
// Print equality constraints.
|
||||
|
||||
ConstEqTy CE = state->get<ConstEq>();
|
||||
|
||||
if (!CE.isEmpty()) {
|
||||
Out << nl << sep << "'==' constraints:";
|
||||
for (ConstEqTy::iterator I = CE.begin(), E = CE.end(); I!=E; ++I)
|
||||
Out << nl << " $" << I.getKey() << " : " << *I.getData();
|
||||
}
|
||||
|
||||
// Print != constraints.
|
||||
|
||||
ConstNotEqTy CNE = state->get<ConstNotEq>();
|
||||
|
||||
if (!CNE.isEmpty()) {
|
||||
Out << nl << sep << "'!=' constraints:";
|
||||
|
||||
for (ConstNotEqTy::iterator I = CNE.begin(), EI = CNE.end(); I!=EI; ++I) {
|
||||
Out << nl << " $" << I.getKey() << " : ";
|
||||
bool isFirst = true;
|
||||
|
||||
ProgramState::IntSetTy::iterator J = I.getData().begin(),
|
||||
EJ = I.getData().end();
|
||||
|
||||
for ( ; J != EJ; ++J) {
|
||||
if (isFirst) isFirst = false;
|
||||
else Out << ", ";
|
||||
|
||||
Out << (*J)->getSExtValue(); // Hack: should print to raw_ostream.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +1,8 @@
|
||||
set(LLVM_LINK_COMPONENTS support)
|
||||
|
||||
add_clang_library(clangStaticAnalyzerCore
|
||||
AnalysisManager.cpp
|
||||
APSIntType.cpp
|
||||
BasicConstraintManager.cpp
|
||||
AnalysisManager.cpp
|
||||
BasicValueFactory.cpp
|
||||
BlockCounter.cpp
|
||||
BugReporter.cpp
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -analyzer-constraints=basic -verify -fobjc-gc %s -Wno-implicit-function-declaration
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -analyzer-constraints=range -verify -fobjc-gc %s -Wno-implicit-function-declaration
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.coreFoundation.CFNumber,osx.cocoa.RetainCount -analyzer-store=region -analyzer-constraints=basic -verify -triple x86_64-apple-darwin9 %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.coreFoundation.CFNumber,osx.cocoa.RetainCount -analyzer-store=region -analyzer-constraints=range -verify -triple x86_64-apple-darwin9 %s
|
||||
|
||||
typedef signed long CFIndex;
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -verify %s -analyzer-constraints=basic -analyzer-store=region
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -verify %s -analyzer-constraints=range -analyzer-store=region
|
||||
|
||||
typedef struct objc_selector *SEL;
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -analyzer-constraints=basic -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -analyzer-store=region -analyzer-constraints=range -verify %s
|
||||
|
||||
typedef struct CGColorSpace *CGColorSpaceRef;
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.NSError,osx.coreFoundation.CFError -analyzer-store=region -analyzer-constraints=basic -verify -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.NSError,osx.coreFoundation.CFError -analyzer-store=region -analyzer-constraints=range -verify -Wno-objc-root-class %s
|
||||
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -analyzer-store=region -analyzer-constraints=range -verify -Wno-objc-root-class %s
|
||||
|
||||
// BEGIN delta-debugging reduced header stuff
|
||||
|
@ -1,6 +1,4 @@
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,osx.AtomicCAS,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,osx.AtomicCAS,experimental.core -analyzer-store=region -analyzer-constraints=range -verify -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -DTEST_64 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,osx.AtomicCAS,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -DTEST_64 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,osx.cocoa.NilArg,osx.cocoa.RetainCount,osx.AtomicCAS,experimental.core -analyzer-store=region -analyzer-constraints=range -verify -Wno-objc-root-class %s
|
||||
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core,deadcode.DeadStores -analyzer-store=region -analyzer-constraints=basic -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core,deadcode.DeadStores -analyzer-store=region -analyzer-constraints=range -verify %s
|
||||
|
||||
// These declarations were reduced using Delta-Debugging from Foundation.h
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=range -verify %s
|
||||
|
||||
#include <stdarg.h>
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=basic -Wno-objc-root-class %s -verify
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=range -Wno-objc-root-class %s -verify
|
||||
|
||||
// The point of this test cases is to exercise properties in the static
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify -triple x86_64-apple-darwin9 %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=range -verify -triple x86_64-apple-darwin9 %s
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify -analyzer-constraints=basic -Wno-tautological-compare %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify -analyzer-constraints=range -Wno-tautological-compare %s
|
||||
|
||||
void clang_analyzer_eval(bool);
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-constraints=basic -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-constraints=range -verify %s
|
||||
|
||||
void clang_analyzer_eval(int);
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core.CastToStruct -analyzer-store=region -analyzer-constraints=basic -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core.CastToStruct -analyzer-store=region -analyzer-constraints=range -verify %s
|
||||
|
||||
struct s {
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -analyzer-store=region -analyzer-constraints=range -verify %s
|
||||
|
||||
typedef unsigned char Boolean;
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=range -verify %s
|
||||
|
||||
// This test case was reported in <rdar:problem/6080742>.
|
||||
|
@ -1,5 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.cstring,debug.ExprInspection -analyzer-constraints=basic -triple i386-apple-darwin9 -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.cstring,debug.ExprInspection -analyzer-constraints=basic -triple x86_64-apple-darwin9 -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.cstring,debug.ExprInspection -analyzer-constraints=range -triple i386-apple-darwin9 -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.cstring,debug.ExprInspection -analyzer-constraints=range -triple x86_64-apple-darwin9 -verify %s
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-store=region -analyzer-constraints=basic -verify -Wno-unreachable-code -ffreestanding %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-store=region -analyzer-constraints=range -verify -Wno-unreachable-code -ffreestanding %s
|
||||
|
||||
#include <stdint.h>
|
||||
|
@ -1,5 +1,4 @@
|
||||
// RUN: %clang_cc1 -Wunused-variable -analyze -analyzer-checker=core,deadcode.DeadStores,experimental.deadcode.IdempotentOperations -fblocks -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s
|
||||
// RUN: %clang_cc1 -Wunused-variable -analyze -analyzer-checker=core,deadcode.DeadStores,experimental.deadcode.IdempotentOperations -analyzer-store=region -analyzer-constraints=basic -fblocks -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s
|
||||
// RUN: %clang_cc1 -Wunused-variable -analyze -analyzer-checker=core,deadcode.DeadStores,experimental.deadcode.IdempotentOperations -analyzer-store=region -analyzer-constraints=range -fblocks -verify -Wno-unreachable-code -analyzer-opt-analyze-nested-blocks %s
|
||||
|
||||
void f1() {
|
||||
|
@ -1,5 +1,4 @@
|
||||
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
|
||||
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-store=region -analyzer-constraints=basic -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
|
||||
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -analyze -analyzer-store=region -analyzer-constraints=range -analyzer-checker=deadcode.DeadStores -verify -Wno-unreachable-code %s
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=basic -verify -fblocks %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=range -verify -fblocks %s
|
||||
|
||||
// <rdar://problem/6440393> - A bunch of misc. failures involving evaluating
|
||||
|
@ -1,7 +1,5 @@
|
||||
// NOTE: Use '-fobjc-gc' to test the analysis being run twice, and multiple reports are not issued.
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-checker=core,experimental.deadcode.IdempotentOperations,experimental.core,osx.cocoa.AtSync,osx.AtomicCAS -analyzer-store=region -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code -Wno-null-dereference -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -analyzer-checker=core,experimental.deadcode.IdempotentOperations,experimental.core,osx.cocoa.AtSync,osx.AtomicCAS -analyzer-store=region -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code -Wno-null-dereference -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,experimental.deadcode.IdempotentOperations,experimental.core,osx.cocoa.AtSync,osx.AtomicCAS -analyzer-store=region -analyzer-constraints=basic -verify -fblocks -Wno-unreachable-code -Wno-null-dereference -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -analyzer-checker=core,experimental.deadcode.IdempotentOperations,experimental.core,osx.cocoa.AtSync,osx.AtomicCAS -analyzer-store=region -analyzer-constraints=range -verify -fblocks -Wno-unreachable-code -Wno-null-dereference -Wno-objc-root-class %s
|
||||
|
||||
#ifndef __clang_analyzer__
|
||||
|
@ -1,6 +1,6 @@
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin8 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=basic -analyzer-store=region -Wno-objc-root-class %s 2>&1 | FileCheck -check-prefix=darwin8 %s
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=basic -analyzer-store=region -Wno-objc-root-class %s 2>&1 | FileCheck -check-prefix=darwin9 %s
|
||||
// RUN: %clang_cc1 -triple thumbv6-apple-ios4.0 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=basic -analyzer-store=region -Wno-objc-root-class %s 2>&1 | FileCheck -check-prefix=darwin9 %s
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin8 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=range -analyzer-store=region -Wno-objc-root-class %s 2>&1 | FileCheck -check-prefix=darwin8 %s
|
||||
// RUN: %clang_cc1 -triple i386-apple-darwin9 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=range -analyzer-store=region -Wno-objc-root-class %s 2>&1 | FileCheck -check-prefix=darwin9 %s
|
||||
// RUN: %clang_cc1 -triple thumbv6-apple-ios4.0 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=range -analyzer-store=region -Wno-objc-root-class %s 2>&1 | FileCheck -check-prefix=darwin9 %s
|
||||
|
||||
@interface MyClass {}
|
||||
- (void *)voidPtrM;
|
||||
|
@ -1,4 +1,4 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -analyzer-constraints=basic -analyzer-store=region -verify %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount,experimental.core -analyzer-constraints=range -analyzer-store=region -verify %s
|
||||
//
|
||||
// This test case mainly checks that the retain/release checker doesn't crash
|
||||
// on this file.
|
||||
|
@ -1,4 +1,4 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=basic -analyzer-store=region -verify -Wno-objc-root-class %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-constraints=range -analyzer-store=region -verify -Wno-objc-root-class %s
|
||||
|
||||
typedef struct Foo { int x; } Bar;
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=basic -verify -Wno-null-dereference %s
|
||||
// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=range -verify -Wno-null-dereference %s
|
||||
|
||||
void clang_analyzer_eval(bool);
|
||||
|
Loading…
Reference in New Issue
Block a user