[clang-tools-extra] r306728 - [clang-tidy] Rename android-file-open-flag and fix a bug

Yan Wang via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 29 12:13:29 PDT 2017


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:
-  }
-};




More information about the cfe-commits mailing list