When casting the address of a FunctionTextRegion to bool, or when adding constraints to such an address, use a stand-in symbol to represent the presence or absence of the function if the function is weakly linked. This is groundwork for possible simple availability testing checks, and can already catch mistakes involving inverted null checks for weakly-linked functions. Currently, the implementation reuses the "extent" symbols, originally created for tracking the size of a malloc region. Since FunctionTextRegions cannot be dereferenced, the extent symbol will never be used for anything else. Still, this probably deserves a refactoring in the future. This patch does not attempt to support testing the presence of weak /variables/ (global variables), which would likely require much more of a change and a generalization of "region structure metadata", like the current "extents", vs. "region contents metadata", like CStringChecker's "string length". Patch by Richard <tarka.t.otter@googlemail.com>! llvm-svn: 189492
101 lines
3.9 KiB
C++
101 lines
3.9 KiB
C++
//== SimpleConstraintManager.h ----------------------------------*- C++ -*--==//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Code shared between BasicConstraintManager and RangeConstraintManager.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H
|
|
#define LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H
|
|
|
|
#include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h"
|
|
#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
|
|
|
|
namespace clang {
|
|
|
|
namespace ento {
|
|
|
|
class SimpleConstraintManager : public ConstraintManager {
|
|
SubEngine *SU;
|
|
SValBuilder &SVB;
|
|
public:
|
|
SimpleConstraintManager(SubEngine *subengine, SValBuilder &SB)
|
|
: SU(subengine), SVB(SB) {}
|
|
virtual ~SimpleConstraintManager();
|
|
|
|
//===------------------------------------------------------------------===//
|
|
// Common implementation for the interface provided by ConstraintManager.
|
|
//===------------------------------------------------------------------===//
|
|
|
|
ProgramStateRef assume(ProgramStateRef state, DefinedSVal Cond,
|
|
bool Assumption);
|
|
|
|
ProgramStateRef assume(ProgramStateRef state, NonLoc Cond, bool Assumption);
|
|
|
|
ProgramStateRef assumeSymRel(ProgramStateRef state,
|
|
const SymExpr *LHS,
|
|
BinaryOperator::Opcode op,
|
|
const llvm::APSInt& Int);
|
|
|
|
protected:
|
|
|
|
//===------------------------------------------------------------------===//
|
|
// Interface that subclasses must implement.
|
|
//===------------------------------------------------------------------===//
|
|
|
|
// Each of these is of the form "$sym+Adj <> V", where "<>" is the comparison
|
|
// operation for the method being invoked.
|
|
virtual ProgramStateRef assumeSymNE(ProgramStateRef state, SymbolRef sym,
|
|
const llvm::APSInt& V,
|
|
const llvm::APSInt& Adjustment) = 0;
|
|
|
|
virtual ProgramStateRef assumeSymEQ(ProgramStateRef state, SymbolRef sym,
|
|
const llvm::APSInt& V,
|
|
const llvm::APSInt& Adjustment) = 0;
|
|
|
|
virtual ProgramStateRef assumeSymLT(ProgramStateRef state, SymbolRef sym,
|
|
const llvm::APSInt& V,
|
|
const llvm::APSInt& Adjustment) = 0;
|
|
|
|
virtual ProgramStateRef assumeSymGT(ProgramStateRef state, SymbolRef sym,
|
|
const llvm::APSInt& V,
|
|
const llvm::APSInt& Adjustment) = 0;
|
|
|
|
virtual ProgramStateRef assumeSymLE(ProgramStateRef state, SymbolRef sym,
|
|
const llvm::APSInt& V,
|
|
const llvm::APSInt& Adjustment) = 0;
|
|
|
|
virtual ProgramStateRef assumeSymGE(ProgramStateRef state, SymbolRef sym,
|
|
const llvm::APSInt& V,
|
|
const llvm::APSInt& Adjustment) = 0;
|
|
|
|
//===------------------------------------------------------------------===//
|
|
// Internal implementation.
|
|
//===------------------------------------------------------------------===//
|
|
|
|
BasicValueFactory &getBasicVals() const { return SVB.getBasicValueFactory(); }
|
|
SymbolManager &getSymbolManager() const { return SVB.getSymbolManager(); }
|
|
|
|
bool canReasonAbout(SVal X) const;
|
|
|
|
ProgramStateRef assumeAux(ProgramStateRef state,
|
|
NonLoc Cond,
|
|
bool Assumption);
|
|
|
|
ProgramStateRef assumeAuxForSymbol(ProgramStateRef State,
|
|
SymbolRef Sym,
|
|
bool Assumption);
|
|
};
|
|
|
|
} // end GR namespace
|
|
|
|
} // end clang namespace
|
|
|
|
#endif
|