diff options
author | Yan Wang <yawanng@google.com> | 2017-07-12 17:43:36 +0000 |
---|---|---|
committer | Yan Wang <yawanng@google.com> | 2017-07-12 17:43:36 +0000 |
commit | b38045d02ebd412f32955769feaa6ba62f3ffd4d (patch) | |
tree | ea63c6589177cb53314d1a44aee21094cd60d889 /clang-tools-extra/clang-tidy/utils/ASTUtils.cpp | |
parent | 4fc696635ded88843f235e55b29c3eefc7c4810a (diff) | |
download | bcm5719-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.cpp | 28 |
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 |