26class BuiltinFunctionChecker :
public Checker<eval::Call> {
36 const auto *FD = dyn_cast_or_null<FunctionDecl>(
Call.getDecl());
41 const Expr *CE =
Call.getOriginExpr();
43 switch (FD->getBuiltinID()) {
47 case Builtin::BI__builtin_assume: {
48 assert (
Call.getNumArgs() > 0);
57 C.generateSink(
C.getState(),
C.getPredecessor());
61 C.addTransition(state);
65 case Builtin::BI__builtin_unpredictable:
66 case Builtin::BI__builtin_expect:
67 case Builtin::BI__builtin_expect_with_probability:
68 case Builtin::BI__builtin_assume_aligned:
69 case Builtin::BI__builtin_addressof:
70 case Builtin::BI__builtin_function_start: {
76 assert (
Call.getNumArgs() > 0);
78 C.addTransition(state->BindExpr(CE, LCtx, Arg));
82 case Builtin::BI__builtin_alloca_with_align:
83 case Builtin::BI__builtin_alloca: {
97 C.addTransition(state->BindExpr(CE, LCtx, R));
101 case Builtin::BI__builtin_dynamic_object_size:
102 case Builtin::BI__builtin_object_size:
103 case Builtin::BI__builtin_constant_p: {
111 llvm::APSInt Result = EVResult.
Val.
getInt();
117 if (FD->getBuiltinID() == Builtin::BI__builtin_constant_p) {
125 C.addTransition(state->BindExpr(CE, LCtx,
V));
135bool ento::shouldRegisterBuiltinFunctionChecker(
const CheckerManager &mgr) {
Defines enum values for all the target-independent builtin functions.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
@ SE_NoSideEffects
Strictly evaluate the expression.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
void apply(llvm::APSInt &Value) const
Convert a given APSInt, in place, to match this type.
APSIntType getAPSIntType(QualType T) const
Returns the type of the APSInt used to store values of the given QualType.
Represents an abstract call to a function or method along a particular path.
CHECKER * registerChecker(AT &&... Args)
Used to register checkers.
BasicValueFactory & getBasicValueFactory()
nonloc::ConcreteInt makeIntVal(const IntegerLiteral *integer)
loc::MemRegionVal getAllocaRegionVal(const Expr *E, const LocationContext *LCtx, unsigned Count)
Create an SVal representing the result of an alloca()-like call, that is, an AllocaRegion on the stac...
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
T castAs() const
Convert to the specified SVal type, asserting that this SVal is of the desired type.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * getRegion() const
Get the underlining region.
ProgramStateRef setDynamicExtent(ProgramStateRef State, const MemRegion *MR, DefinedOrUnknownSVal Extent, SValBuilder &SVB)
Set the dynamic extent Extent of the region MR.
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.