File indexing completed on 2024-04-06 12:31:51
0001
0002
0003
0004
0005
0006
0007 #include "MutableMemberChecker.h"
0008 #include <clang/AST/Attr.h>
0009 using namespace clang;
0010 using namespace ento;
0011 using namespace llvm;
0012 namespace clangcms {
0013
0014 void MutableMemberChecker::checkASTDecl(const clang::FieldDecl *D,
0015 clang::ento::AnalysisManager &Mgr,
0016 clang::ento::BugReporter &BR) const {
0017 if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>() || D->hasAttr<CMSSaAllowAttr>())
0018 return;
0019 if (D->isMutable() && D->getDeclContext()->isRecord()) {
0020 clang::QualType t = D->getType();
0021 clang::ento::PathDiagnosticLocation DLoc = clang::ento::PathDiagnosticLocation::create(D, BR.getSourceManager());
0022
0023 if (!m_exception.reportMutableMember(t, DLoc, BR))
0024 return;
0025 std::string mname = t.getCanonicalType().getAsString();
0026 if (support::isSafeClassName(mname))
0027 return;
0028 std::string buf;
0029 llvm::raw_string_ostream os(buf);
0030 std::string pname = D->getParent()->getQualifiedNameAsString();
0031 os << "Mutable member '" << D->getQualifiedNameAsString() << "' in class '" << pname
0032 << "', might be thread-unsafe when accessing via a const pointer.";
0033 if (!BT)
0034 BT = std::make_unique<clang::ento::BugType>(
0035 this, "mutable member if accessed via const pointer", "ConstThreadSafety");
0036 std::unique_ptr<clang::ento::BasicBugReport> R =
0037 std::make_unique<clang::ento::BasicBugReport>(*BT, llvm::StringRef(os.str()), DLoc);
0038 R->setDeclWithIssue(D);
0039 R->addRange(D->getSourceRange());
0040 BR.emitReport(std::move(R));
0041 std::string tname = "mutablemember-checker.txt.unsorted";
0042 std::string ostring = "flagged class '" + pname + "' mutable member '" + D->getQualifiedNameAsString() + "'";
0043 support::writeLog(ostring, tname);
0044 }
0045 }
0046
0047 }