Author: yawanng Date: Thu Jun 29 12:13:29 2017 New Revision: 306728 URL: http://llvm.org/viewvc/llvm-project?rev=306728&view=rev Log: [clang-tidy] Rename android-file-open-flag and fix a bug
Summary: 1. Rename android-file-open-flag to android-cloexec-open. 2. Handle a case when the function is passed as an argument of a function-like macro. Reviewers: chh Reviewed By: chh Subscribers: srhines, mgorny, JDevlieghere, xazax.hun, cfe-commits Tags: #clang-tools-extra Differential Revision: https://reviews.llvm.org/D34633 Added: clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.cpp - copied, changed from r306725, clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.h - copied, changed from r306725, clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h clang-tools-extra/trunk/docs/clang-tidy/checks/android-cloexec-open.rst - copied, changed from r306725, clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst clang-tools-extra/trunk/test/clang-tidy/android-cloexec-open.cpp Removed: clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst clang-tools-extra/trunk/test/clang-tidy/android-file-open-flag.cpp Modified: clang-tools-extra/trunk/clang-tidy/android/AndroidTidyModule.cpp clang-tools-extra/trunk/clang-tidy/android/CMakeLists.txt clang-tools-extra/trunk/docs/ReleaseNotes.rst clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Modified: clang-tools-extra/trunk/clang-tidy/android/AndroidTidyModule.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/android/AndroidTidyModule.cpp?rev=306728&r1=306727&r2=306728&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/android/AndroidTidyModule.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/android/AndroidTidyModule.cpp Thu Jun 29 12:13:29 2017 @@ -12,7 +12,7 @@ #include "../ClangTidyModuleRegistry.h" #include "CloexecCreatCheck.h" #include "CloexecFopenCheck.h" -#include "FileOpenFlagCheck.h" +#include "CloexecOpenCheck.h" using namespace clang::ast_matchers; @@ -24,9 +24,9 @@ namespace android { class AndroidModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { - CheckFactories.registerCheck<FileOpenFlagCheck>("android-file-open-flag"); CheckFactories.registerCheck<CloexecCreatCheck>("android-cloexec-creat"); CheckFactories.registerCheck<CloexecFopenCheck>("android-cloexec-fopen"); + CheckFactories.registerCheck<CloexecOpenCheck>("android-cloexec-open"); } }; Modified: clang-tools-extra/trunk/clang-tidy/android/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/android/CMakeLists.txt?rev=306728&r1=306727&r2=306728&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/android/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/android/CMakeLists.txt Thu Jun 29 12:13:29 2017 @@ -4,7 +4,7 @@ add_clang_library(clangTidyAndroidModule AndroidTidyModule.cpp CloexecCreatCheck.cpp CloexecFopenCheck.cpp - FileOpenFlagCheck.cpp + CloexecOpenCheck.cpp LINK_LIBS clangAST Copied: clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.cpp (from r306725, clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.cpp?p2=clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.cpp&p1=clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp&r1=306725&r2=306728&rev=306728&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.cpp Thu Jun 29 12:13:29 2017 @@ -1,4 +1,4 @@ -//===--- FileOpenFlagCheck.cpp - clang-tidy--------------------------------===// +//===--- CloexecOpenCheck.cpp - clang-tidy---------------------------------===// // // The LLVM Compiler Infrastructure // @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// -#include "FileOpenFlagCheck.h" +#include "CloexecOpenCheck.h" #include "clang/AST/ASTContext.h" #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/Lex/Lexer.h" @@ -21,11 +21,12 @@ namespace android { namespace { static constexpr const char *O_CLOEXEC = "O_CLOEXEC"; -bool HasCloseOnExecFlag(const Expr *Flags, const SourceManager &SM, +bool hasCloseOnExecFlag(const Expr *Flags, const SourceManager &SM, const LangOptions &LangOpts) { // If the Flag is an integer constant, check it. if (isa<IntegerLiteral>(Flags)) { - if (!SM.isMacroBodyExpansion(Flags->getLocStart())) + if (!SM.isMacroBodyExpansion(Flags->getLocStart()) && + !SM.isMacroArgExpansion(Flags->getLocStart())) return false; // Get the Marco name. @@ -37,16 +38,16 @@ bool HasCloseOnExecFlag(const Expr *Flag // If it's a binary OR operation. if (const auto *BO = dyn_cast<BinaryOperator>(Flags)) if (BO->getOpcode() == clang::BinaryOperatorKind::BO_Or) - return HasCloseOnExecFlag(BO->getLHS()->IgnoreParenCasts(), SM, + return hasCloseOnExecFlag(BO->getLHS()->IgnoreParenCasts(), SM, LangOpts) || - HasCloseOnExecFlag(BO->getRHS()->IgnoreParenCasts(), SM, LangOpts); + hasCloseOnExecFlag(BO->getRHS()->IgnoreParenCasts(), SM, LangOpts); // Otherwise, assume it has the flag. return true; } } // namespace -void FileOpenFlagCheck::registerMatchers(MatchFinder *Finder) { +void CloexecOpenCheck::registerMatchers(MatchFinder *Finder) { auto CharPointerType = hasType(pointerType(pointee(isAnyCharacter()))); Finder->addMatcher( @@ -68,7 +69,7 @@ void FileOpenFlagCheck::registerMatchers this); } -void FileOpenFlagCheck::check(const MatchFinder::MatchResult &Result) { +void CloexecOpenCheck::check(const MatchFinder::MatchResult &Result) { const Expr *FlagArg = nullptr; if (const auto *OpenFnCall = Result.Nodes.getNodeAs<CallExpr>("openFn")) FlagArg = OpenFnCall->getArg(1); @@ -81,12 +82,13 @@ void FileOpenFlagCheck::check(const Matc // Check the required flag. SourceManager &SM = *Result.SourceManager; - if (HasCloseOnExecFlag(FlagArg->IgnoreParenCasts(), SM, + if (hasCloseOnExecFlag(FlagArg->IgnoreParenCasts(), SM, Result.Context->getLangOpts())) return; - SourceLocation EndLoc = Lexer::getLocForEndOfToken( - FlagArg->getLocEnd(), 0, SM, Result.Context->getLangOpts()); + SourceLocation EndLoc = + Lexer::getLocForEndOfToken(SM.getFileLoc(FlagArg->getLocEnd()), 0, SM, + Result.Context->getLangOpts()); diag(EndLoc, "%0 should use %1 where possible") << FD << O_CLOEXEC Copied: clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.h (from r306725, clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.h?p2=clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.h&p1=clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h&r1=306725&r2=306728&rev=306728&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/android/CloexecOpenCheck.h Thu Jun 29 12:13:29 2017 @@ -1,4 +1,4 @@ -//===--- FileOpenFlagCheck.h - clang-tidy----------------------------------===// +//===--- CloexecOpenCheck.h - clang-tidy-----------------------------------===// // // The LLVM Compiler Infrastructure // @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_FILE_OPEN_FLAG_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_FILE_OPEN_FLAG_H +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_CLOEXEC_OPEN_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_CLOEXEC_OPEN_H #include "../ClangTidy.h" @@ -25,9 +25,9 @@ namespace android { /// /// Only the symbolic 'O_CLOEXEC' macro definition is checked, not the concrete /// value. -class FileOpenFlagCheck : public ClangTidyCheck { +class CloexecOpenCheck : public ClangTidyCheck { public: - FileOpenFlagCheck(StringRef Name, ClangTidyContext *Context) + CloexecOpenCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; @@ -37,4 +37,4 @@ public: } // namespace tidy } // namespace clang -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_FILE_OPEN_FLAG_H +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_CLOEXEC_OPEN_H Removed: clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp?rev=306727&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.cpp (removed) @@ -1,98 +0,0 @@ -//===--- FileOpenFlagCheck.cpp - clang-tidy--------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "FileOpenFlagCheck.h" -#include "clang/AST/ASTContext.h" -#include "clang/ASTMatchers/ASTMatchFinder.h" -#include "clang/Lex/Lexer.h" - -using namespace clang::ast_matchers; - -namespace clang { -namespace tidy { -namespace android { - -namespace { -static constexpr const char *O_CLOEXEC = "O_CLOEXEC"; - -bool HasCloseOnExecFlag(const Expr *Flags, const SourceManager &SM, - const LangOptions &LangOpts) { - // If the Flag is an integer constant, check it. - if (isa<IntegerLiteral>(Flags)) { - if (!SM.isMacroBodyExpansion(Flags->getLocStart())) - return false; - - // Get the Marco name. - auto MacroName = Lexer::getSourceText( - CharSourceRange::getTokenRange(Flags->getSourceRange()), SM, LangOpts); - - return MacroName == O_CLOEXEC; - } - // If it's a binary OR operation. - if (const auto *BO = dyn_cast<BinaryOperator>(Flags)) - if (BO->getOpcode() == clang::BinaryOperatorKind::BO_Or) - return HasCloseOnExecFlag(BO->getLHS()->IgnoreParenCasts(), SM, - LangOpts) || - HasCloseOnExecFlag(BO->getRHS()->IgnoreParenCasts(), SM, LangOpts); - - // Otherwise, assume it has the flag. - return true; -} -} // namespace - -void FileOpenFlagCheck::registerMatchers(MatchFinder *Finder) { - auto CharPointerType = hasType(pointerType(pointee(isAnyCharacter()))); - - Finder->addMatcher( - callExpr(callee(functionDecl(isExternC(), returns(isInteger()), - hasAnyName("open", "open64"), - hasParameter(0, CharPointerType), - hasParameter(1, hasType(isInteger()))) - .bind("funcDecl"))) - .bind("openFn"), - this); - Finder->addMatcher( - callExpr(callee(functionDecl(isExternC(), returns(isInteger()), - hasName("openat"), - hasParameter(0, hasType(isInteger())), - hasParameter(1, CharPointerType), - hasParameter(2, hasType(isInteger()))) - .bind("funcDecl"))) - .bind("openatFn"), - this); -} - -void FileOpenFlagCheck::check(const MatchFinder::MatchResult &Result) { - const Expr *FlagArg = nullptr; - if (const auto *OpenFnCall = Result.Nodes.getNodeAs<CallExpr>("openFn")) - FlagArg = OpenFnCall->getArg(1); - else if (const auto *OpenFnCall = - Result.Nodes.getNodeAs<CallExpr>("openatFn")) - FlagArg = OpenFnCall->getArg(2); - assert(FlagArg); - - const auto *FD = Result.Nodes.getNodeAs<FunctionDecl>("funcDecl"); - - // Check the required flag. - SourceManager &SM = *Result.SourceManager; - if (HasCloseOnExecFlag(FlagArg->IgnoreParenCasts(), SM, - Result.Context->getLangOpts())) - return; - - SourceLocation EndLoc = Lexer::getLocForEndOfToken( - FlagArg->getLocEnd(), 0, SM, Result.Context->getLangOpts()); - - diag(EndLoc, "%0 should use %1 where possible") - << FD << O_CLOEXEC - << FixItHint::CreateInsertion(EndLoc, (Twine(" | ") + O_CLOEXEC).str()); -} - -} // namespace android -} // namespace tidy -} // namespace clang Removed: clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h?rev=306727&view=auto ============================================================================== --- clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/android/FileOpenFlagCheck.h (removed) @@ -1,40 +0,0 @@ -//===--- FileOpenFlagCheck.h - clang-tidy----------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_FILE_OPEN_FLAG_H -#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_FILE_OPEN_FLAG_H - -#include "../ClangTidy.h" - -namespace clang { -namespace tidy { -namespace android { - -/// Finds code that opens file without using the O_CLOEXEC flag. -/// -/// open(), openat(), and open64() had better to include O_CLOEXEC in their -/// flags argument. Only consider simple cases that the corresponding argument -/// is constant or binary operation OR among constants like 'O_CLOEXEC' or -/// 'O_CLOEXEC | O_RDONLY'. No constant propagation is performed. -/// -/// Only the symbolic 'O_CLOEXEC' macro definition is checked, not the concrete -/// value. -class FileOpenFlagCheck : public ClangTidyCheck { -public: - FileOpenFlagCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} - void registerMatchers(ast_matchers::MatchFinder *Finder) override; - void check(const ast_matchers::MatchFinder::MatchResult &Result) override; -}; - -} // namespace android -} // namespace tidy -} // namespace clang - -#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ANDROID_FILE_OPEN_FLAG_H Modified: clang-tools-extra/trunk/docs/ReleaseNotes.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/ReleaseNotes.rst?rev=306728&r1=306727&r2=306728&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/ReleaseNotes.rst (original) +++ clang-tools-extra/trunk/docs/ReleaseNotes.rst Thu Jun 29 12:13:29 2017 @@ -62,8 +62,8 @@ Improvements to clang-tidy Detect usage of ``creat()``. -- New `android-file-open-flag - <http://clang.llvm.org/extra/clang-tidy/checks/android-file-open-flag.html>`_ check +- New `android-cloexec-open + <http://clang.llvm.org/extra/clang-tidy/checks/android-cloexec-open.html>`_ check Checks if the required file flag ``O_CLOEXEC`` exists in ``open()``, ``open64()`` and ``openat()``. Copied: clang-tools-extra/trunk/docs/clang-tidy/checks/android-cloexec-open.rst (from r306725, clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst) URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/android-cloexec-open.rst?p2=clang-tools-extra/trunk/docs/clang-tidy/checks/android-cloexec-open.rst&p1=clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst&r1=306725&r2=306728&rev=306728&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/android-cloexec-open.rst Thu Jun 29 12:13:29 2017 @@ -1,7 +1,7 @@ -.. title:: clang-tidy - android-file-open-flag +.. title:: clang-tidy - android-cloexec-open -android-file-open-flag -====================== +android-cloexec-open +==================== A common source of security bugs is code that opens a file without using the ``O_CLOEXEC`` flag. Without that flag, an opened sensitive file would remain Removed: clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst?rev=306727&view=auto ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/android-file-open-flag.rst (removed) @@ -1,24 +0,0 @@ -.. title:: clang-tidy - android-file-open-flag - -android-file-open-flag -====================== - -A common source of security bugs is code that opens a file without using the -``O_CLOEXEC`` flag. Without that flag, an opened sensitive file would remain -open across a fork+exec to a lower-privileged SELinux domain, leaking that -sensitive data. Open-like functions including ``open()``, ``openat()``, and -``open64()`` should include ``O_CLOEXEC`` in their flags argument. - -Examples: - -.. code-block:: c++ - - open("filename", O_RDWR); - open64("filename", O_RDWR); - openat(0, "filename", O_RDWR); - - // becomes - - open("filename", O_RDWR | O_CLOEXEC); - open64("filename", O_RDWR | O_CLOEXEC); - openat(0, "filename", O_RDWR | O_CLOEXEC); Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst?rev=306728&r1=306727&r2=306728&view=diff ============================================================================== --- clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Thu Jun 29 12:13:29 2017 @@ -6,7 +6,7 @@ Clang-Tidy Checks .. toctree:: android-cloexec-creat android-cloexec-fopen - android-file-open-flag + android-cloexec-open boost-use-to-string cert-dcl03-c (redirects to misc-static-assert) <cert-dcl03-c> cert-dcl21-cpp Added: clang-tools-extra/trunk/test/clang-tidy/android-cloexec-open.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/android-cloexec-open.cpp?rev=306728&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/android-cloexec-open.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/android-cloexec-open.cpp Thu Jun 29 12:13:29 2017 @@ -0,0 +1,180 @@ +// RUN: %check_clang_tidy %s android-cloexec-open %t + +#define O_RDWR 1 +#define O_EXCL 2 +#define __O_CLOEXEC 3 +#define O_CLOEXEC __O_CLOEXEC +#define TEMP_FAILURE_RETRY(exp) \ + ({ \ + int _rc; \ + do { \ + _rc = (exp); \ + } while (_rc == -1); \ + }) + +extern "C" int open(const char *fn, int flags, ...); +extern "C" int open64(const char *fn, int flags, ...); +extern "C" int openat(int dirfd, const char *pathname, int flags, ...); + +void a() { + open("filename", O_RDWR); + // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'open' should use O_CLOEXEC where possible [android-cloexec-open] + // CHECK-FIXES: O_RDWR | O_CLOEXEC + TEMP_FAILURE_RETRY(open("filename", O_RDWR)); + // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: 'open' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_CLOEXEC + open("filename", O_RDWR | O_EXCL); + // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: 'open' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC + TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_EXCL)); + // CHECK-MESSAGES: :[[@LINE-1]]:54: warning: 'open' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC +} + +void b() { + open64("filename", O_RDWR); + // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: 'open64' should use O_CLOEXEC where possible [android-cloexec-open] + // CHECK-FIXES: O_RDWR | O_CLOEXEC + TEMP_FAILURE_RETRY(open64("filename", O_RDWR)); + // CHECK-MESSAGES: :[[@LINE-1]]:47: warning: 'open64' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_CLOEXEC + open64("filename", O_RDWR | O_EXCL); + // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'open64' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC + TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_EXCL)); + // CHECK-MESSAGES: :[[@LINE-1]]:56: warning: 'open64' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC +} + +void c() { + openat(0, "filename", O_RDWR); + // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: 'openat' should use O_CLOEXEC where possible [android-cloexec-open] + // CHECK-FIXES: O_RDWR | O_CLOEXEC + TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR)); + // CHECK-MESSAGES: :[[@LINE-1]]:50: warning: 'openat' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_CLOEXEC + openat(0, "filename", O_RDWR | O_EXCL); + // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: 'openat' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC + TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_EXCL)); + // CHECK-MESSAGES: :[[@LINE-1]]:59: warning: 'openat' should use O_CLOEXEC where + // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC +} + +void f() { + open("filename", 3); + // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 'open' should use O_CLOEXEC where possible [android-cloexec-open] + // CHECK-FIXES: 3 | O_CLOEXEC + TEMP_FAILURE_RETRY(open("filename", 3)); + // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: 'open' should use O_CLOEXEC where + // CHECK-FIXES: 3 | O_CLOEXEC + open64("filename", 3); + // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 'open64' should use O_CLOEXEC where possible [android-cloexec-open] + // CHECK-FIXES: 3 | O_CLOEXEC + TEMP_FAILURE_RETRY(open64("filename", 3)); + // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: 'open64' should use O_CLOEXEC where + // CHECK-FIXES: 3 | O_CLOEXEC + openat(0, "filename", 3); + // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'openat' should use O_CLOEXEC where possible [android-cloexec-open] + // CHECK-FIXES: 3 | O_CLOEXEC + TEMP_FAILURE_RETRY(openat(0, "filename", 3)); + // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: 'openat' should use O_CLOEXEC where + // CHECK-FIXES: 3 | O_CLOEXEC + + int flag = 3; + open("filename", flag); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open("filename", flag)); + // CHECK-MESSAGES-NOT: warning: + open64("filename", flag); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open64("filename", flag)); + // CHECK-MESSAGES-NOT: warning: + openat(0, "filename", flag); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(openat(0, "filename", flag)); + // CHECK-MESSAGES-NOT: warning: +} + +namespace i { +int open(const char *pathname, int flags, ...); +int open64(const char *pathname, int flags, ...); +int openat(int dirfd, const char *pathname, int flags, ...); + +void d() { + open("filename", O_RDWR); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open("filename", O_RDWR)); + // CHECK-MESSAGES-NOT: warning: + open64("filename", O_RDWR); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open64("filename", O_RDWR)); + // CHECK-MESSAGES-NOT: warning: + openat(0, "filename", O_RDWR); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR)); + // CHECK-MESSAGES-NOT: warning: +} + +} // namespace i + +void e() { + open("filename", O_CLOEXEC); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open("filename", O_CLOEXEC)); + // CHECK-MESSAGES-NOT: warning: + open("filename", O_RDWR | O_CLOEXEC); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_CLOEXEC)); + // CHECK-MESSAGES-NOT: warning: + open("filename", O_RDWR | O_CLOEXEC | O_EXCL); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open("filename", O_RDWR | O_CLOEXEC | O_EXCL)); + // CHECK-MESSAGES-NOT: warning: + open64("filename", O_CLOEXEC); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open64("filename", O_CLOEXEC)); + // CHECK-MESSAGES-NOT: warning: + open64("filename", O_RDWR | O_CLOEXEC); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_CLOEXEC)); + // CHECK-MESSAGES-NOT: warning: + open64("filename", O_RDWR | O_CLOEXEC | O_EXCL); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open64("filename", O_RDWR | O_CLOEXEC | O_EXCL)); + // CHECK-MESSAGES-NOT: warning: + openat(0, "filename", O_CLOEXEC); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(openat(0, "filename", O_CLOEXEC)); + // CHECK-MESSAGES-NOT: warning: + openat(0, "filename", O_RDWR | O_CLOEXEC); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_CLOEXEC)); + // CHECK-MESSAGES-NOT: warning: + openat(0, "filename", O_RDWR | O_CLOEXEC | O_EXCL); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR | O_CLOEXEC | O_EXCL)); + // CHECK-MESSAGES-NOT: warning: +} + +class G { +public: + int open(const char *pathname, int flags, ...); + int open64(const char *pathname, int flags, ...); + int openat(int dirfd, const char *pathname, int flags, ...); + + void h() { + open("filename", O_RDWR); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open("filename", O_RDWR)); + // CHECK-MESSAGES-NOT: warning: + open64("filename", O_RDWR); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(open64("filename", O_RDWR)); + // CHECK-MESSAGES-NOT: warning: + openat(0, "filename", O_RDWR); + // CHECK-MESSAGES-NOT: warning: + TEMP_FAILURE_RETRY(openat(0, "filename", O_RDWR)); + // CHECK-MESSAGES-NOT: warning: + } +}; Removed: clang-tools-extra/trunk/test/clang-tidy/android-file-open-flag.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/android-file-open-flag.cpp?rev=306727&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/android-file-open-flag.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/android-file-open-flag.cpp (removed) @@ -1,110 +0,0 @@ -// RUN: %check_clang_tidy %s android-file-open-flag %t - -#define O_RDWR 1 -#define O_EXCL 2 -#define __O_CLOEXEC 3 -#define O_CLOEXEC __O_CLOEXEC - -extern "C" int open(const char *fn, int flags, ...); -extern "C" int open64(const char *fn, int flags, ...); -extern "C" int openat(int dirfd, const char *pathname, int flags, ...); - -void a() { - open("filename", O_RDWR); - // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'open' should use O_CLOEXEC where possible [android-file-open-flag] - // CHECK-FIXES: O_RDWR | O_CLOEXEC - open("filename", O_RDWR | O_EXCL); - // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: 'open' should use O_CLOEXEC where - // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC -} - -void b() { - open64("filename", O_RDWR); - // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: 'open64' should use O_CLOEXEC where possible [android-file-open-flag] - // CHECK-FIXES: O_RDWR | O_CLOEXEC - open64("filename", O_RDWR | O_EXCL); - // CHECK-MESSAGES: :[[@LINE-1]]:37: warning: 'open64' should use O_CLOEXEC where - // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC -} - -void c() { - openat(0, "filename", O_RDWR); - // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: 'openat' should use O_CLOEXEC where possible [android-file-open-flag] - // CHECK-FIXES: O_RDWR | O_CLOEXEC - openat(0, "filename", O_RDWR | O_EXCL); - // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: 'openat' should use O_CLOEXEC where - // CHECK-FIXES: O_RDWR | O_EXCL | O_CLOEXEC -} - -void f() { - open("filename", 3); - // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 'open' should use O_CLOEXEC where possible [android-file-open-flag] - // CHECK-FIXES: 3 | O_CLOEXEC - open64("filename", 3); - // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: 'open64' should use O_CLOEXEC where possible [android-file-open-flag] - // CHECK-FIXES: 3 | O_CLOEXEC - openat(0, "filename", 3); - // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: 'openat' should use O_CLOEXEC where possible [android-file-open-flag] - // CHECK-FIXES: 3 | O_CLOEXEC - - int flag = 3; - open("filename", flag); - // CHECK-MESSAGES-NOT: warning: - open64("filename", flag); - // CHECK-MESSAGES-NOT: warning: - openat(0, "filename", flag); - // CHECK-MESSAGES-NOT: warning: -} - -namespace i { -int open(const char *pathname, int flags, ...); -int open64(const char *pathname, int flags, ...); -int openat(int dirfd, const char *pathname, int flags, ...); - -void d() { - open("filename", O_RDWR); - // CHECK-MESSAGES-NOT: warning: - open64("filename", O_RDWR); - // CHECK-MESSAGES-NOT: warning: - openat(0, "filename", O_RDWR); - // CHECK-MESSAGES-NOT: warning: -} - -} // namespace i - -void e() { - open("filename", O_CLOEXEC); - // CHECK-MESSAGES-NOT: warning: - open("filename", O_RDWR | O_CLOEXEC); - // CHECK-MESSAGES-NOT: warning: - open("filename", O_RDWR | O_CLOEXEC | O_EXCL); - // CHECK-MESSAGES-NOT: warning: - open64("filename", O_CLOEXEC); - // CHECK-MESSAGES-NOT: warning: - open64("filename", O_RDWR | O_CLOEXEC); - // CHECK-MESSAGES-NOT: warning: - open64("filename", O_RDWR | O_CLOEXEC | O_EXCL); - // CHECK-MESSAGES-NOT: warning: - openat(0, "filename", O_CLOEXEC); - // CHECK-MESSAGES-NOT: warning: - openat(0, "filename", O_RDWR | O_CLOEXEC); - // CHECK-MESSAGES-NOT: warning: - openat(0, "filename", O_RDWR | O_CLOEXEC | O_EXCL); - // CHECK-MESSAGES-NOT: warning: -} - -class G { -public: - int open(const char *pathname, int flags, ...); - int open64(const char *pathname, int flags, ...); - int openat(int dirfd, const char *pathname, int flags, ...); - - void h() { - open("filename", O_RDWR); - // CHECK-MESSAGES-NOT: warning: - open64("filename", O_RDWR); - // CHECK-MESSAGES-NOT: warning: - openat(0, "filename", O_RDWR); - // CHECK-MESSAGES-NOT: warning: - } -}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits