summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-tidy/utils/ASTUtils.cpp
diff options
context:
space:
mode:
authorYan Wang <yawanng@google.com>2017-07-12 17:43:36 +0000
committerYan Wang <yawanng@google.com>2017-07-12 17:43:36 +0000
commitb38045d02ebd412f32955769feaa6ba62f3ffd4d (patch)
treeea63c6589177cb53314d1a44aee21094cd60d889 /clang-tools-extra/clang-tidy/utils/ASTUtils.cpp
parent4fc696635ded88843f235e55b29c3eefc7c4810a (diff)
downloadbcm5719-llvm-b38045d02ebd412f32955769feaa6ba62f3ffd4d.tar.gz
bcm5719-llvm-b38045d02ebd412f32955769feaa6ba62f3ffd4d.zip
[clang-tidy] Add a new Android check "android-cloexec-socket"
Summary: socket() is better to include SOCK_CLOEXEC in its type argument to avoid the file descriptor leakage. Reviewers: chh, Eugene.Zelenko, alexfh, hokein, aaron.ballman Reviewed By: chh, alexfh Subscribers: srhines, mgorny, JDevlieghere, xazax.hun, cfe-commits Tags: #clang-tools-extra Differential Revision: https://reviews.llvm.org/D34913 llvm-svn: 307818
Diffstat (limited to 'clang-tools-extra/clang-tidy/utils/ASTUtils.cpp')
-rw-r--r--clang-tools-extra/clang-tidy/utils/ASTUtils.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/clang-tools-extra/clang-tidy/utils/ASTUtils.cpp b/clang-tools-extra/clang-tidy/utils/ASTUtils.cpp
index eff45b5be14..1efcec9c9fa 100644
--- a/clang-tools-extra/clang-tidy/utils/ASTUtils.cpp
+++ b/clang-tools-extra/clang-tidy/utils/ASTUtils.cpp
@@ -11,6 +11,7 @@
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/Lex/Lexer.h"
namespace clang {
namespace tidy {
@@ -39,6 +40,33 @@ bool IsBinaryOrTernary(const Expr *E) {
return false;
}
+bool exprHasBitFlagWithSpelling(const Expr *Flags, const SourceManager &SM,
+ const LangOptions &LangOpts,
+ StringRef FlagName) {
+ // If the Flag is an integer constant, check it.
+ if (isa<IntegerLiteral>(Flags)) {
+ if (!SM.isMacroBodyExpansion(Flags->getLocStart()) &&
+ !SM.isMacroArgExpansion(Flags->getLocStart()))
+ return false;
+
+ // Get the marco name.
+ auto MacroName = Lexer::getSourceText(
+ CharSourceRange::getTokenRange(Flags->getSourceRange()), SM, LangOpts);
+
+ return MacroName == FlagName;
+ }
+ // If it's a binary OR operation.
+ if (const auto *BO = dyn_cast<BinaryOperator>(Flags))
+ if (BO->getOpcode() == clang::BinaryOperatorKind::BO_Or)
+ return exprHasBitFlagWithSpelling(BO->getLHS()->IgnoreParenCasts(), SM,
+ LangOpts, FlagName) ||
+ exprHasBitFlagWithSpelling(BO->getRHS()->IgnoreParenCasts(), SM,
+ LangOpts, FlagName);
+
+ // Otherwise, assume it has the flag.
+ return true;
+}
+
} // namespace utils
} // namespace tidy
} // namespace clang
OpenPOWER on IntegriCloud