Skip to content

Commit

Permalink
Merge pull request #28630 from gartung/gartung-Utilities-StaticAnalyz…
Browse files Browse the repository at this point in the history
…ers-add-sa-allow-all

Utilities/StaticAnalyzers: Add CMS_SA_ALLOW exceptions on Static Analyzer checks involving Decls.
  • Loading branch information
cmsbuild committed Dec 28, 2019
2 parents e747e46 + 1a2113b commit 4010528
Show file tree
Hide file tree
Showing 13 changed files with 38 additions and 21 deletions.
17 changes: 17 additions & 0 deletions Utilities/StaticAnalyzers/src/CatchAll.cpp
Expand Up @@ -6,15 +6,21 @@

#include "CatchAll.h"
#include "clang/Basic/SourceManager.h"
#include <clang/AST/Attr.h>
#include "CmsSupport.h"
using namespace clangcms;
using namespace clang;
using namespace ento;
using namespace llvm;

void CatchAll::checkASTCodeBody(const clang::Decl* D,
clang::ento::AnalysisManager& AM,
clang::ento::BugReporter& BR) const {
const char* sfile = BR.getSourceManager().getPresumedLoc(D->getLocation()).getFilename();
if ((!sfile) || (!support::isCmsLocalFile(sfile)))
return;
if (D->hasAttr<CMSSaAllowAttr>())
return;
const clang::Stmt* s = D->getBody();
if (!s)
return;
Expand All @@ -34,6 +40,17 @@ void CatchAll::checkASTCodeBody(const clang::Decl* D,
}

const clang::Stmt* CatchAll::process(const clang::Stmt* S) const {
if (clang::AttributedStmt::classof(S)) {
const clang::Stmt* np = nullptr;
auto const* Node = static_cast<const clang::AttributedStmt*>(S);
auto* SS = Node->getSubStmt();
for (const auto* A : Node->getAttrs()) {
if (clang::CXXTryStmt::classof(SS) && clang::CMSSaAllowAttr::classof(A)) {
return np;
}
}
}

if (clang::CXXCatchStmt::classof(S) && checkCatchAll(static_cast<const clang::CXXCatchStmt*>(S)))
return S;
clang::Stmt::const_child_iterator b = S->child_begin();
Expand Down
10 changes: 5 additions & 5 deletions Utilities/StaticAnalyzers/src/ClassChecker.cpp
Expand Up @@ -341,7 +341,7 @@ namespace clangcms {
clang::ento::PathDiagnosticLocation::createBegin(DRE, BR.getSourceManager(), AC);
if (support::isSafeClassName(t.getCanonicalType().getAsString()))
return;
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>())
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>() || D->hasAttr<CMSSaAllowAttr>())
return;
if (D->isStaticLocal() && D->getTSCSpec() != clang::ThreadStorageClassSpecifier::TSCS_thread_local &&
!support::isConst(t)) {
Expand Down Expand Up @@ -411,7 +411,7 @@ namespace clangcms {
if (BR.getSourceManager().isInSystemHeader(SL) || BR.getSourceManager().isInExternCSystemHeader(SL))
return;
const ValueDecl *D = ME->getMemberDecl();
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>())
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>() || D->hasAttr<CMSSaAllowAttr>())
return;
if (!(ME->isImplicitAccess()))
return;
Expand Down Expand Up @@ -479,7 +479,7 @@ namespace clangcms {

void WalkAST::ReportMember(const clang::MemberExpr *ME) {
const ValueDecl *D = ME->getMemberDecl();
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>())
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>() || D->hasAttr<CMSSaAllowAttr>())
return;
if (visitingCallExpr) {
clang::Expr *IOA = visitingCallExpr->getImplicitObjectArgument();
Expand Down Expand Up @@ -663,7 +663,7 @@ namespace clangcms {
return;
for (auto I = RD->field_begin(), E = RD->field_end(); I != E; ++I) {
const FieldDecl *D = (*I);
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>())
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>() || D->hasAttr<CMSSaAllowAttr>())
return;
if (D->isMutable()) {
clang::QualType t = D->getType();
Expand Down Expand Up @@ -694,7 +694,7 @@ namespace clangcms {
if (!(*I)->isConst())
continue;
clang::CXXMethodDecl *MD = llvm::cast<clang::CXXMethodDecl>((*I)->getMostRecentDecl());
if (MD->hasAttr<CMSThreadGuardAttr>() || MD->hasAttr<CMSThreadSafeAttr>())
if (MD->hasAttr<CMSThreadGuardAttr>() || MD->hasAttr<CMSThreadSafeAttr>() || MD->hasAttr<CMSSaAllowAttr>())
continue;
if (MD->hasBody()) {
clang::Stmt *Body = MD->getBody();
Expand Down
6 changes: 3 additions & 3 deletions Utilities/StaticAnalyzers/src/CmsSupport.cpp
Expand Up @@ -32,7 +32,7 @@ using namespace clang;
using namespace llvm;
bool clangcms::support::isCmsLocalFile(const char *file) {
static const char *LocalDir = std::getenv("LOCALRT");
CMS_THREAD_SAFE static int DirLen = -1;
CMS_SA_ALLOW static int DirLen = -1;
if (DirLen == -1) {
DirLen = 0;
if (LocalDir != nullptr)
Expand Down Expand Up @@ -148,7 +148,7 @@ bool clangcms::support::isSafeClassName(const std::string &cname) {
}

bool clangcms::support::isDataClass(const std::string &name) {
CMS_THREAD_SAFE static std::string iname("");
CMS_SA_ALLOW static std::string iname("");
if (iname.empty()) {
clang::FileSystemOptions FSO;
clang::FileManager FM(FSO);
Expand All @@ -174,7 +174,7 @@ bool clangcms::support::isDataClass(const std::string &name) {
iname = fname2;
}

CMS_THREAD_SAFE static scaling_bloom_t *blmflt = new_scaling_bloom_from_file(CAPACITY, ERROR_RATE, iname.c_str());
CMS_SA_ALLOW static scaling_bloom_t *blmflt = new_scaling_bloom_from_file(CAPACITY, ERROR_RATE, iname.c_str());

if (scaling_bloom_check(blmflt, name.c_str(), name.length()) == 1)
return true;
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/ConstCastAwayChecker.h
Expand Up @@ -18,7 +18,7 @@ namespace clangcms {

class ConstCastAwayChecker : public clang::ento::Checker<clang::ento::check::PreStmt<clang::ExplicitCastExpr> > {
public:
CMS_THREAD_SAFE mutable std::unique_ptr<clang::ento::BugType> BT;
CMS_SA_ALLOW mutable std::unique_ptr<clang::ento::BugType> BT;
void checkPreStmt(const clang::ExplicitCastExpr *CE, clang::ento::CheckerContext &C) const;

private:
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/ConstCastChecker.h
Expand Up @@ -17,7 +17,7 @@ namespace clangcms {

class ConstCastChecker : public clang::ento::Checker<clang::ento::check::PreStmt<clang::CXXConstCastExpr> > {
public:
CMS_THREAD_SAFE mutable std::unique_ptr<clang::ento::BugType> BT;
CMS_SA_ALLOW mutable std::unique_ptr<clang::ento::BugType> BT;
void checkPreStmt(const clang::CXXConstCastExpr *CE, clang::ento::CheckerContext &C) const;

private:
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/FiniteMathChecker.h
Expand Up @@ -9,7 +9,7 @@

namespace clangcms {
class FiniteMathChecker : public clang::ento::Checker<clang::ento::check::PreStmt<clang::CallExpr> > {
CMS_THREAD_SAFE mutable std::unique_ptr<clang::ento::BugType> BT;
CMS_SA_ALLOW mutable std::unique_ptr<clang::ento::BugType> BT;

public:
void checkPreStmt(const clang::CallExpr *ref, clang::ento::CheckerContext &C) const;
Expand Down
8 changes: 4 additions & 4 deletions Utilities/StaticAnalyzers/src/FunctionChecker.cpp
Expand Up @@ -66,7 +66,7 @@ namespace clangcms {

void FWalker::ReportDeclRef(const clang::DeclRefExpr *DRE) {
const clang::VarDecl *D = llvm::dyn_cast_or_null<clang::VarDecl>(DRE->getDecl());
if (D && (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>()))
if (D && (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>()) || D->hasAttr<CMSSaAllowAttr>())
return;
if (support::isSafeClassName(D->getCanonicalDecl()->getQualifiedNameAsString()))
return;
Expand Down Expand Up @@ -133,7 +133,7 @@ namespace clangcms {
}

void FunctionChecker::checkASTDecl(const CXXMethodDecl *MD, AnalysisManager &mgr, BugReporter &BR) const {
if (MD->hasAttr<CMSThreadSafeAttr>())
if (MD->hasAttr<CMSThreadSafeAttr>() || MD->hasAttr<CMSSaAllowAttr>())
return;
const char *sfile = BR.getSourceManager().getPresumedLoc(MD->getLocation()).getFilename();
if (!support::isCmsLocalFile(sfile))
Expand All @@ -149,7 +149,7 @@ namespace clangcms {
}

void FunctionChecker::checkASTDecl(const FunctionDecl *FD, AnalysisManager &mgr, BugReporter &BR) const {
if (FD->hasAttr<CMSThreadSafeAttr>())
if (FD->hasAttr<CMSThreadSafeAttr>() || FD->hasAttr<CMSSaAllowAttr>())
return;
if (FD->isInExternCContext()) {
std::string buf;
Expand Down Expand Up @@ -180,7 +180,7 @@ namespace clangcms {
}

void FunctionChecker::checkASTDecl(const FunctionTemplateDecl *TD, AnalysisManager &mgr, BugReporter &BR) const {
if (TD->hasAttr<CMSThreadSafeAttr>())
if (TD->hasAttr<CMSThreadSafeAttr>() || TD->hasAttr<CMSSaAllowAttr>())
return;
const char *sfile = BR.getSourceManager().getPresumedLoc(TD->getLocation()).getFilename();
if (!support::isCmsLocalFile(sfile))
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/GlobalStaticChecker.cpp
Expand Up @@ -17,7 +17,7 @@ namespace clangcms {
void GlobalStaticChecker::checkASTDecl(const clang::VarDecl *D,
clang::ento::AnalysisManager &Mgr,
clang::ento::BugReporter &BR) const {
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>())
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>() || D->hasAttr<CMSSaAllowAttr>())
return;
if (D->getTSCSpec() == clang::ThreadStorageClassSpecifier::TSCS_thread_local)
return;
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/GlobalStaticChecker.h
Expand Up @@ -14,7 +14,7 @@

namespace clangcms {
class GlobalStaticChecker : public clang::ento::Checker<clang::ento::check::ASTDecl<clang::VarDecl> > {
CMS_THREAD_SAFE mutable std::unique_ptr<clang::ento::BuiltinBug> BT;
CMS_SA_ALLOW mutable std::unique_ptr<clang::ento::BuiltinBug> BT;

public:
void checkASTDecl(const clang::VarDecl *D, clang::ento::AnalysisManager &Mgr, clang::ento::BugReporter &BR) const;
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/MutableMemberChecker.h
Expand Up @@ -16,7 +16,7 @@

namespace clangcms {
class MutableMemberChecker : public clang::ento::Checker<clang::ento::check::ASTDecl<clang::FieldDecl> > {
CMS_THREAD_SAFE mutable std::unique_ptr<clang::ento::BuiltinBug> BT;
CMS_SA_ALLOW mutable std::unique_ptr<clang::ento::BuiltinBug> BT;

public:
void checkASTDecl(const clang::FieldDecl *D, clang::ento::AnalysisManager &Mgr, clang::ento::BugReporter &BR) const;
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/StaticLocalChecker.cpp
Expand Up @@ -19,7 +19,7 @@ namespace clangcms {
clang::ento::AnalysisManager &Mgr,
clang::ento::BugReporter &BR) const {
clang::QualType t = D->getType();
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>())
if (D->hasAttr<CMSThreadGuardAttr>() || D->hasAttr<CMSThreadSafeAttr>() || D->hasAttr<CMSSaAllowAttr>())
return;
if (((D->isStaticLocal() || D->isStaticDataMember()) &&
D->getTSCSpec() != clang::ThreadStorageClassSpecifier::TSCS_thread_local) &&
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/StaticLocalChecker.h
Expand Up @@ -15,7 +15,7 @@

namespace clangcms {
class StaticLocalChecker : public clang::ento::Checker<clang::ento::check::ASTDecl<clang::VarDecl> > {
CMS_THREAD_SAFE mutable std::unique_ptr<clang::ento::BuiltinBug> BT;
CMS_SA_ALLOW mutable std::unique_ptr<clang::ento::BuiltinBug> BT;

public:
void checkASTDecl(const clang::VarDecl *D, clang::ento::AnalysisManager &Mgr, clang::ento::BugReporter &BR) const;
Expand Down
2 changes: 1 addition & 1 deletion Utilities/StaticAnalyzers/src/TrunCastChecker.h
Expand Up @@ -11,7 +11,7 @@ namespace clangcms {

class TrunCastChecker : public clang::ento::Checker<clang::ento::check::ASTDecl<clang::CXXRecordDecl> > {
public:
CMS_THREAD_SAFE mutable std::unique_ptr<clang::ento::BugType> BT;
CMS_SA_ALLOW mutable std::unique_ptr<clang::ento::BugType> BT;
void checkASTDecl(const clang::CXXRecordDecl *D,
clang::ento::AnalysisManager &Mgr,
clang::ento::BugReporter &BR) const;
Expand Down

0 comments on commit 4010528

Please sign in to comment.