156650e7fSChih-Hung Hsieh //===--- CloexecDupCheck.cpp - clang-tidy----------------------------------===// 256650e7fSChih-Hung Hsieh // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 656650e7fSChih-Hung Hsieh // 756650e7fSChih-Hung Hsieh //===----------------------------------------------------------------------===// 856650e7fSChih-Hung Hsieh 956650e7fSChih-Hung Hsieh #include "CloexecDupCheck.h" 1056650e7fSChih-Hung Hsieh #include "clang/AST/ASTContext.h" 1156650e7fSChih-Hung Hsieh #include "clang/ASTMatchers/ASTMatchFinder.h" 1256650e7fSChih-Hung Hsieh 1356650e7fSChih-Hung Hsieh using namespace clang::ast_matchers; 1456650e7fSChih-Hung Hsieh 15*7d2ea6c4SCarlos Galvez namespace clang::tidy::android { 1656650e7fSChih-Hung Hsieh registerMatchers(MatchFinder * Finder)1756650e7fSChih-Hung Hsiehvoid CloexecDupCheck::registerMatchers(MatchFinder *Finder) { 1856650e7fSChih-Hung Hsieh registerMatchersImpl(Finder, 1956650e7fSChih-Hung Hsieh functionDecl(returns(isInteger()), hasName("dup"), 2056650e7fSChih-Hung Hsieh hasParameter(0, hasType(isInteger())))); 2156650e7fSChih-Hung Hsieh } 2256650e7fSChih-Hung Hsieh check(const MatchFinder::MatchResult & Result)2356650e7fSChih-Hung Hsiehvoid CloexecDupCheck::check(const MatchFinder::MatchResult &Result) { 243d68a38bSGeorge Burgess IV std::string ReplacementText = 2556650e7fSChih-Hung Hsieh (Twine("fcntl(") + getSpellingArg(Result, 0) + ", F_DUPFD_CLOEXEC)") 2656650e7fSChih-Hung Hsieh .str(); 2756650e7fSChih-Hung Hsieh 2856650e7fSChih-Hung Hsieh replaceFunc(Result, 2956650e7fSChih-Hung Hsieh "prefer fcntl() to dup() because fcntl() allows F_DUPFD_CLOEXEC", 3056650e7fSChih-Hung Hsieh ReplacementText); 3156650e7fSChih-Hung Hsieh } 3256650e7fSChih-Hung Hsieh 33*7d2ea6c4SCarlos Galvez } // namespace clang::tidy::android 34