35class ConstraintBasedEQEvaluator {
43 : CompareValue(CompareValue), PS(
C.getState()), SVB(
C.getSValBuilder()) {}
45 bool operator()(
const llvm::APSInt &EnumDeclInitValue) {
48 SVB.
evalEQ(PS, EnumDeclValue, CompareValue);
50 return static_cast<bool>(PS->assume(ElemEqualsValueToCast,
true));
60class EnumCastOutOfRangeChecker :
public Checker<check::PreStmt<CastExpr>> {
61 mutable std::unique_ptr<BuiltinBug> EnumValueCastOutOfRange;
71EnumValueVector getDeclValuesForEnum(
const EnumDecl *ED) {
72 EnumValueVector DeclValues(
74 llvm::transform(ED->
enumerators(), DeclValues.begin(),
82 if (!EnumValueCastOutOfRange)
83 EnumValueCastOutOfRange.reset(
85 "The value provided to the cast expression is not in "
86 "the valid range of values for the enum"));
87 C.emitReport(std::make_unique<PathSensitiveBugReport>(
88 *EnumValueCastOutOfRange, EnumValueCastOutOfRange->getDescription(),
93void EnumCastOutOfRangeChecker::checkPreStmt(
const CastExpr *CE,
103 case CK_IntegralCast:
112 const std::optional<DefinedOrUnknownSVal> ValueToCast =
131 EnumValueVector DeclValues = getDeclValuesForEnum(ED);
133 bool PossibleValueMatch = llvm::any_of(
134 DeclValues, ConstraintBasedEQEvaluator(
C, *ValueToCast));
138 if (!PossibleValueMatch)
142void ento::registerEnumCastOutOfRangeChecker(
CheckerManager &mgr) {
146bool ento::shouldRegisterEnumCastOutOfRangeChecker(
const CheckerManager &mgr) {
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
CastKind getCastKind() const
An instance of this object exists for each enum constant that is defined.
enumerator_range enumerators() const
enumerator_iterator enumerator_begin() const
enumerator_iterator enumerator_end() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
A (possibly-)qualified type.
const T * castAs() const
Member-template castAs<specific type>.
bool isEnumeralType() const
CHECKER * registerChecker(AT &&... Args)
Used to register checkers.
nonloc::ConcreteInt makeIntVal(const IntegerLiteral *integer)
SVal evalEQ(ProgramStateRef state, SVal lhs, SVal rhs)
@ C
Languages that the frontend can parse and compile.