Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:31:51

0001 //== MutableMemberChecker.cpp - Checks for mutable members --------------*- C++ -*--==//
0002 //
0003 // by Thomas Hauth [ Thomas.Hauth@cern.ch ]
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 }  // namespace clangcms