21#include "llvm/ADT/STLExtras.h"
27class AssumeModelingChecker
28 :
public Checker<eval::Call, check::PostStmt<AttributedStmt>> {
30 void checkPostStmt(
const AttributedStmt *A, CheckerContext &
C)
const;
31 bool evalCall(
const CallEvent &
Call, CheckerContext &
C)
const;
41 SVal AssumptionVal =
C.getSVal(Attr->getAssumption());
48 if (Assumption && Assumption->isZero()) {
54bool AssumeModelingChecker::evalCall(
const CallEvent &
Call,
55 CheckerContext &
C)
const {
57 const auto *FD = dyn_cast_or_null<FunctionDecl>(
Call.getDecl());
61 if (!llvm::is_contained({Builtin::BI__builtin_assume, Builtin::BI__assume},
62 FD->getBuiltinID())) {
66 assert(
Call.getNumArgs() > 0);
67 SVal Arg =
Call.getArgSVal(0);
71 State = State->assume(Arg.
castAs<DefinedOrUnknownSVal>(),
true);
77 C.addTransition(State);
81void ento::registerAssumeModeling(CheckerManager &Mgr) {
85bool ento::shouldRegisterAssumeModeling(
const CheckerManager &) {
return true; }
Defines enum values for all the target-independent builtin functions.
Represents an attribute applied to a statement.
ArrayRef< const Attr * > getAttrs() const
CHECKER * registerChecker(AT &&...Args)
Register a single-part checker (derived from Checker): construct its singleton instance,...
Simple checker classes that implement one frontend (i.e.
const llvm::APSInt * getAsInteger() const
If this SVal is loc::ConcreteInt or nonloc::ConcreteInt, return a pointer to APSInt which is held in ...
T castAs() const
Convert to the specified SVal type, asserting that this SVal is of the desired type.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
The JSON file list parser is used to communicate input to InstallAPI.
bool hasSpecificAttr(const Container &container)
auto getSpecificAttrs(const Container &container)