https://github.com/11happy created https://github.com/llvm/llvm-project/pull/77586
**Overview:** This pull request fixes #38469 where the issue proposes a new static analysis check in C++ to discourage the explicit return 0; statement at the end of the main() function. As C++ automatically assumes a return 0; in this context, having the explicit statement is redundant. The suggested change aims to enhance code readability by eliminating unnecessary lines in the main() function. **Testing:** - Tested the updated code. - Verified that other functionalities remain unaffected.  **Dependencies:** - No dependencies on other pull requests. **CC:** - @kirillbobyrev , @AaronBallman >From bae95013cd7f937a5496cafcd40a77cc563addb0 Mon Sep 17 00:00:00 2001 From: 11happy <soni5ha...@gmail.com> Date: Wed, 10 Jan 2024 16:48:43 +0530 Subject: [PATCH] Added check for redundant return statement Signed-off-by: 11happy <soni5ha...@gmail.com> --- .../clang-tidy/readability/CMakeLists.txt | 1 + .../readability/DonotreturnzerocheckCheck.cpp | 54 +++++++++++++++++++ .../readability/DonotreturnzerocheckCheck.h | 30 +++++++++++ .../readability/ReadabilityTidyModule.cpp | 3 ++ clang-tools-extra/docs/ReleaseNotes.rst | 8 +++ .../docs/clang-tidy/checks/list.rst | 1 + .../readability/DoNotReturnZeroCheck.rst | 25 +++++++++ .../readability/DoNotReturnZeroCheck.cpp | 8 +++ 8 files changed, 130 insertions(+) create mode 100644 clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.cpp create mode 100644 clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.h create mode 100644 clang-tools-extra/docs/clang-tidy/checks/readability/DoNotReturnZeroCheck.rst create mode 100644 clang-tools-extra/test/clang-tidy/checkers/readability/DoNotReturnZeroCheck.cpp diff --git a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt index 408c822b861c5f..cb7741d6f56ce7 100644 --- a/clang-tools-extra/clang-tidy/readability/CMakeLists.txt +++ b/clang-tools-extra/clang-tidy/readability/CMakeLists.txt @@ -14,6 +14,7 @@ add_clang_library(clangTidyReadabilityModule ContainerSizeEmptyCheck.cpp ConvertMemberFunctionsToStatic.cpp DeleteNullPointerCheck.cpp + DonotreturnzerocheckCheck.cpp DuplicateIncludeCheck.cpp ElseAfterReturnCheck.cpp FunctionCognitiveComplexityCheck.cpp diff --git a/clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.cpp b/clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.cpp new file mode 100644 index 00000000000000..66ea29be3c54a8 --- /dev/null +++ b/clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.cpp @@ -0,0 +1,54 @@ +//===--- DonotreturnzerocheckCheck.cpp - clang-tidy -----------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "DonotreturnzerocheckCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + + + +namespace clang::tidy::readability { + bool isCPlusPlusOrC99(const LangOptions &LangOpts) { + return LangOpts.CPlusPlus || LangOpts.C99; + } + +void DonotreturnzerocheckCheck::registerMatchers(MatchFinder *Finder) { + // FIXME: Add matchers. + Finder->addMatcher(functionDecl( + isMain(),returns(asString("int")) + ).bind("main"), this); +} + +void DonotreturnzerocheckCheck::check(const MatchFinder::MatchResult &Result) { + // FIXME: Add callback implementation. + const auto *MatchedDecl = Result.Nodes.getNodeAs<FunctionDecl>("main"); + if(isCPlusPlusOrC99(Result.Context->getLangOpts())){ + SourceLocation ReturnLoc; + if (MatchedDecl->hasBody()) { + const CompoundStmt *Body = dyn_cast<CompoundStmt>(MatchedDecl->getBody()); + if (Body && !Body->body_empty()) { + const Stmt *LastStmt = Body->body_back(); + if (const auto *Return = dyn_cast<ReturnStmt>(LastStmt)) { + ReturnLoc = Return->getReturnLoc(); + } + } + } + + if (ReturnLoc.isValid()) { + // Suggest removal of the redundant return statement. + diag(ReturnLoc, "redundant 'return 0;' at the end of main") + << FixItHint::CreateRemoval(CharSourceRange::getTokenRange(ReturnLoc)); + } + + } + +} + +} \ No newline at end of file diff --git a/clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.h b/clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.h new file mode 100644 index 00000000000000..1407b8c1831c9d --- /dev/null +++ b/clang-tools-extra/clang-tidy/readability/DonotreturnzerocheckCheck.h @@ -0,0 +1,30 @@ +//===--- DonotreturnzerocheckCheck.h - clang-tidy ---------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_DONOTRETURNZEROCHECKCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_DONOTRETURNZEROCHECKCHECK_H + +#include "../ClangTidyCheck.h" + +namespace clang::tidy::readability { + +/// FIXME: Write a short description. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/readability/DoNotReturnZeroCheck.html +class DonotreturnzerocheckCheck : public ClangTidyCheck { +public: + DonotreturnzerocheckCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace clang::tidy::readability + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_DONOTRETURNZEROCHECKCHECK_H diff --git a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp index 0b0aad7c0dcb36..3c3bc4fa94b97c 100644 --- a/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp +++ b/clang-tools-extra/clang-tidy/readability/ReadabilityTidyModule.cpp @@ -19,6 +19,7 @@ #include "ContainerSizeEmptyCheck.h" #include "ConvertMemberFunctionsToStatic.h" #include "DeleteNullPointerCheck.h" +#include "DonotreturnzerocheckCheck.h" #include "DuplicateIncludeCheck.h" #include "ElseAfterReturnCheck.h" #include "FunctionCognitiveComplexityCheck.h" @@ -62,6 +63,8 @@ namespace readability { class ReadabilityModule : public ClangTidyModule { public: void addCheckFactories(ClangTidyCheckFactories &CheckFactories) override { + CheckFactories.registerCheck<DonotreturnzerocheckCheck>( + "readability-DoNotReturnZeroCheck"); CheckFactories.registerCheck<AvoidConstParamsInDecls>( "readability-avoid-const-params-in-decls"); CheckFactories.registerCheck<AvoidReturnWithVoidValueCheck>( diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index b4d87e0ed2a67a..cb45a135842576 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -224,6 +224,14 @@ New checks Recommends the smallest possible underlying type for an ``enum`` or ``enum`` class based on the range of its enumerators. +- New :doc:`readability-DoNotReturnZeroCheck + <clang-tidy/checks/readability/DoNotReturnZeroCheck>` check. + + The readability-DoNotReturnZeroCheck clang-tidy check identifies + and suggests removal of redundant return 0; statements at the end of the main + function in C++ programs, enhancing code readability by eliminating unnecessary + code that is implicitly handled by modern C++ standards. + - New :doc:`readability-reference-to-constructed-temporary <clang-tidy/checks/readability/reference-to-constructed-temporary>` check. diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst b/clang-tools-extra/docs/clang-tidy/checks/list.rst index 2f86121ad87299..c0b1dfd05fcca0 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/list.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -336,6 +336,7 @@ Clang-Tidy Checks :doc:`portability-restrict-system-includes <portability/restrict-system-includes>`, "Yes" :doc:`portability-simd-intrinsics <portability/simd-intrinsics>`, :doc:`portability-std-allocator-const <portability/std-allocator-const>`, + :doc:`readability-DoNotReturnZeroCheck <readability/DoNotReturnZeroCheck>`, "Yes" :doc:`readability-avoid-const-params-in-decls <readability/avoid-const-params-in-decls>`, "Yes" :doc:`readability-avoid-return-with-void-value <readability/avoid-return-with-void-value>`, :doc:`readability-avoid-unconditional-preprocessor-if <readability/avoid-unconditional-preprocessor-if>`, diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/DoNotReturnZeroCheck.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/DoNotReturnZeroCheck.rst new file mode 100644 index 00000000000000..3b6d0f86a3a1c6 --- /dev/null +++ b/clang-tools-extra/docs/clang-tidy/checks/readability/DoNotReturnZeroCheck.rst @@ -0,0 +1,25 @@ +.. title:: clang-tidy - readability-DoNotReturnZeroCheck + +readability-DoNotReturnZeroCheck +================================ + +This Check warns about redundant return statements returning zero. + +Before: + +.. code-block:: c++ + + int main(){ + int a; + return 0; + } + + +After: + +.. code-block:: c++ + + int main(){ + int a; + + } diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/DoNotReturnZeroCheck.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/DoNotReturnZeroCheck.cpp new file mode 100644 index 00000000000000..b2689e5eff907b --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/DoNotReturnZeroCheck.cpp @@ -0,0 +1,8 @@ +// RUN: %check_clang_tidy %s readability-DoNotReturnZeroCheck %t + + +int main() { + return 0; // Should trigger a warning. + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: redundant 'return 0;' at the end of main [readability-DoNotReturnZeroCheck] + // CHECK-FIXES: {{^}}int main() {{{$}} +} \ No newline at end of file _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits