21 using namespace clang;
25 class UndefinedAssignmentChecker
26 :
public Checker<check::Bind> {
27 mutable std::unique_ptr<BugType> BT;
30 void checkBind(SVal location, SVal val,
const Stmt *S,
31 CheckerContext &C)
const;
35 void UndefinedAssignmentChecker::checkBind(SVal location, SVal val,
37 CheckerContext &C)
const {
45 dyn_cast<FunctionDecl>(C.getStackFrame()->getDecl()))
46 if (C.getCalleeName(EnclosingFunctionDecl) ==
"swap")
49 ExplodedNode *N = C.generateErrorNode();
54 static const char *
const DefaultMsg =
55 "Assigned value is garbage or undefined";
57 BT.reset(
new BuiltinBug(
this, DefaultMsg));
61 llvm::raw_svector_ostream
OS(Str);
63 const Expr *ex =
nullptr;
66 if (
const UnaryOperator *U = dyn_cast<UnaryOperator>(StoreE)) {
67 OS <<
"The expression is an uninitialized value. " 68 "The computed value will also be garbage";
75 if (B->isCompoundAssignmentOp()) {
76 if (C.getSVal(B->getLHS()).isUndef()) {
77 OS <<
"The left expression of the compound assignment is an " 78 "uninitialized value. The computed value will also be garbage";
88 if (
const DeclStmt *DS = dyn_cast<DeclStmt>(StoreE)) {
94 dyn_cast<CXXConstructorDecl>(C.getStackFrame()->getDecl())) {
95 if (CD->isImplicit()) {
96 for (
auto I : CD->inits()) {
97 if (I->getInit()->IgnoreImpCasts() == StoreE) {
98 OS <<
"Value assigned to field '" << I->getMember()->getName()
99 <<
"' in implicit constructor is garbage or undefined";
109 if (
OS.str().empty())
112 auto R = llvm::make_unique<BugReport>(*BT,
OS.str(), N);
114 R->addRange(ex->getSourceRange());
115 bugreporter::trackExpressionValue(N, ex, *R);
117 C.emitReport(std::move(R));
120 void ento::registerUndefinedAssignmentChecker(CheckerManager &mgr) {
121 mgr.registerChecker<UndefinedAssignmentChecker>();
Represents a function declaration or definition.
Stmt - This represents one statement.
Represents a variable declaration or definition.
A builtin binary operation expression such as "x + y" or "x <= y".
This represents one expression.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof), the postinc/postdec operators from postfix-expression, and various extensions.
DeclStmt - Adaptor class for mixing declarations with statements and expressions. ...
Dataflow Directional Tag Classes.
const Expr * getInit() const
Indicates that the tracking object is a descendant of a referenced-counted OSObject, used in the Darwin kernel.