DerWaschbar updated this revision to Diff 262383. DerWaschbar marked 7 inline comments as done. DerWaschbar added a comment.
- Removed unnecessary empty lines. - Added double back-ticks to highlight language constructs. - Indented code in documentation. Repository: rCTE Clang Tools Extra CHANGES SINCE LAST ACTION https://reviews.llvm.org/D79437/new/ https://reviews.llvm.org/D79437 Files: clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt clang-tools-extra/clang-tidy/bugprone/FsetposArgumentCheck.cpp clang-tools-extra/clang-tidy/bugprone/FsetposArgumentCheck.h clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/docs/clang-tidy/checks/bugprone-fsetpos-argument-check.rst clang-tools-extra/docs/clang-tidy/checks/cert-fio44-c.rst clang-tools-extra/docs/clang-tidy/checks/list.rst clang-tools-extra/test/clang-tidy/bugprone-fsetpos-argument-check.cpp
Index: clang-tools-extra/test/clang-tidy/bugprone-fsetpos-argument-check.cpp =================================================================== --- /dev/null +++ clang-tools-extra/test/clang-tidy/bugprone-fsetpos-argument-check.cpp @@ -0,0 +1,59 @@ +// RUN: %check_clang_tidy %s bugprone-fsetpos-argument-check %t + +typedef unsigned int size_t; +class FILE; +struct fpos_t {}; +int fsetpos(FILE *stream, const fpos_t *pos); +int fgetpos(FILE *stream, fpos_t *pos); +void *memset(void *ptr, int value, size_t num); + +//--------------------------------------------------------------------- + +int opener1(FILE *file) { + int rc; + fpos_t offset; + + if (file == nullptr ) { + return -1; + } + + rc = fgetpos(file, &offset); + if (rc != 0 ) { + return rc; + } + + /* Read in data from file */ + + rc = fsetpos(file, &offset); + if (rc != 0 ) { + return rc; + } + + return 0; +} + +//--------------------------------------------------------------------- + +int opener2(FILE *file) { + int rc; + fpos_t offset; + + memset(&offset, 0, sizeof(offset)); + + if (file == nullptr) { + return -1; + } + + /* Read in data from file */ + + rc = fsetpos(file, &offset); + // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: file position indicator should be obtained only from 'fgetpos' [bugprone-fsetpos-argument-check] + if (rc != 0 ) { + return rc; + } + + return 0; +} + + +//--------------------------------------------------------------------- Index: clang-tools-extra/docs/clang-tidy/checks/list.rst =================================================================== --- clang-tools-extra/docs/clang-tidy/checks/list.rst +++ clang-tools-extra/docs/clang-tidy/checks/list.rst @@ -47,6 +47,7 @@ bugprone-fold-init-type bugprone-forward-declaration-namespace bugprone-forwarding-reference-overload + bugprone-fsetpos-argument-check bugprone-inaccurate-erase bugprone-incorrect-roundings bugprone-integer-division @@ -95,6 +96,7 @@ cert-err60-cpp cert-err61-cpp (redirects to misc-throw-by-value-catch-by-reference) <cert-err61-cpp> cert-fio38-c (redirects to misc-non-copyable-objects) <cert-fio38-c> + cert-fio44-c cert-flp30-c cert-msc30-c (redirects to cert-msc50-cpp) <cert-msc30-c> cert-msc32-c (redirects to cert-msc51-cpp) <cert-msc32-c> Index: clang-tools-extra/docs/clang-tidy/checks/cert-fio44-c.rst =================================================================== --- /dev/null +++ clang-tools-extra/docs/clang-tidy/checks/cert-fio44-c.rst @@ -0,0 +1,10 @@ +.. title:: clang-tidy - cert-fio44-c +.. meta:: + :http-equiv=refresh: 5;URL=bugprone-fsetpos-argument-check.html + +cert-fio44-c +============ + +The cert-fio44-c check is an alias, please see +`bugprone-fsetpos-argument-check <bugprone-fsetpos-argument-check.html>`_ +for more information. Index: clang-tools-extra/docs/clang-tidy/checks/bugprone-fsetpos-argument-check.rst =================================================================== --- /dev/null +++ clang-tools-extra/docs/clang-tidy/checks/bugprone-fsetpos-argument-check.rst @@ -0,0 +1,37 @@ +.. title:: clang-tidy - bugprone-fsetpos-argument-check + +bugprone-fsetpos-argument-check +======================== + +Finds call of ``fsetpos`` functions, which does not have file position indicator +obtained from ``fgetpos``. + +.. code-block:: c + + #include <stdio.h> + #include <string.h> + + int opener(FILE *file) { + int rc; + fpos_t offset; + + memset(&offset, 0, sizeof(offset)); + + if (file == NULL) { + return -1; + } + + /* Read in data from file */ + + rc = fsetpos(file, &offset); + if (rc != 0 ) { + return rc; + } + + return 0; + } + + +This check corresponds to the CERT C++ Coding Standard rule +`FIO44-C. Only use values for fsetpos() that are returned from fgetpos() +<https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87152071>`_. Index: clang-tools-extra/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/docs/ReleaseNotes.rst +++ clang-tools-extra/docs/ReleaseNotes.rst @@ -194,6 +194,12 @@ against self-assignment either by checking self-assignment explicitly or using the copy-and-swap or the copy-and-move method. +- New :doc:`bugprone-fsetpos-argument-check + <clang-tidy/checks/bugprone-fsetpos-argument-check>` check. + + Finds call of ``fsetpos`` functions, which does not have file position indicator + obtained from ``fgetpos``. + - New :doc:`fuchsia-default-arguments-calls <clang-tidy/checks/fuchsia-default-arguments-calls>` check. @@ -264,6 +270,11 @@ :doc:`bugprone-unhandled-self-assignment <clang-tidy/checks/bugprone-unhandled-self-assignment>` was added. +- New alias :doc:`cert-fio44-c + <clang-tidy/checks/cert-fio44-c>` to + :doc:`bugprone-fsetpos-argument-check + <clang-tidy/checks/bugprone-bugprone-fsetpos-argument-check>` was added. + - New alias :doc:`cppcoreguidelines-explicit-virtual-functions <clang-tidy/checks/cppcoreguidelines-explicit-virtual-functions>` to :doc:`modernize-use-override Index: clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp =================================================================== --- clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp +++ clang-tools-extra/clang-tidy/cert/CERTTidyModule.cpp @@ -10,6 +10,7 @@ #include "../ClangTidyModule.h" #include "../ClangTidyModuleRegistry.h" #include "../bugprone/UnhandledSelfAssignmentCheck.h" +#include "../bugprone/FsetposArgumentCheck.h" #include "../google/UnnamedNamespaceInHeaderCheck.h" #include "../misc/NewDeleteOverloadsCheck.h" #include "../misc/NonCopyableObjects.h" @@ -75,6 +76,7 @@ // FLP CheckFactories.registerCheck<FloatLoopCounter>("cert-flp30-c"); // FIO + CheckFactories.registerCheck<bugprone::FsetposArgumentCheck>("cert-fio44-c"); CheckFactories.registerCheck<misc::NonCopyableObjectsCheck>("cert-fio38-c"); // ERR CheckFactories.registerCheck<StrToNumCheck>("cert-err34-c"); Index: clang-tools-extra/clang-tidy/bugprone/FsetposArgumentCheck.h =================================================================== --- /dev/null +++ clang-tools-extra/clang-tidy/bugprone/FsetposArgumentCheck.h @@ -0,0 +1,35 @@ +//===--- FsetposArgumentCheck.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_BUGPRONE_FSETPOSARGUMENTCHECK_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_FSETPOSARGUMENTCHECK_H + +#include "../ClangTidyCheck.h" + +namespace clang { +namespace tidy { +namespace bugprone { + +/// Finds call of 'fsetpos' functions, which do not have file position indicator +/// obtained from 'fgetpos'. +/// +/// For the user-facing documentation see: +/// http://clang.llvm.org/extra/clang-tidy/checks/bugprone-fsetpos-argument-check.html +class FsetposArgumentCheck : public ClangTidyCheck { +public: + FsetposArgumentCheck(StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context) {} + void registerMatchers(ast_matchers::MatchFinder *Finder) override; + void check(const ast_matchers::MatchFinder::MatchResult &Result) override; +}; + +} // namespace bugprone +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_BUGPRONE_FSETPOSARGUMENTCHECK_H Index: clang-tools-extra/clang-tidy/bugprone/FsetposArgumentCheck.cpp =================================================================== --- /dev/null +++ clang-tools-extra/clang-tidy/bugprone/FsetposArgumentCheck.cpp @@ -0,0 +1,60 @@ +//===--- FsetposArgumentCheck.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 "FsetposArgumentCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include <iostream> + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace bugprone { + +void FsetposArgumentCheck::registerMatchers(MatchFinder *Finder) { + const auto Offset = declRefExpr(to(varDecl().bind("offset"))); + const auto WithOffset = hasArgument( + 1, + ignoringImpCasts(anyOf(unaryOperator(hasUnaryOperand(Offset)), Offset))); + + const auto IsOffset = declRefExpr(to(varDecl(equalsBoundNode("offset")))); + const auto HasOffset = hasAnyArgument(ignoringImpCasts( + anyOf(unaryOperator(hasUnaryOperand(IsOffset)), IsOffset))); + + const auto OffsetInWrongFunction = hasAncestor(functionDecl( + hasDescendant(callExpr(HasOffset, unless(callee(functionDecl(hasAnyName( + "::fgetpos", "::fsetpos"))))) + .bind("non-fpos")))); + const auto OffsetInFgetpos = hasAncestor(functionDecl(hasDescendant( + callExpr(HasOffset, callee(functionDecl(hasName("::fgetpos"))))))); + + Finder->addMatcher( + callExpr(WithOffset, callee(functionDecl(hasName("::fsetpos"))), + anyOf(OffsetInWrongFunction, unless(OffsetInFgetpos))) + .bind("fsetpos"), + this); +} + +void FsetposArgumentCheck::check(const MatchFinder::MatchResult &Result) { + const auto *MatchedDecl = Result.Nodes.getNodeAs<CallExpr>("fsetpos"); + + diag(MatchedDecl->getBeginLoc(), + "file position indicator should be obtained only from 'fgetpos'"); + + const auto *WrongFunction = Result.Nodes.getNodeAs<CallExpr>("non-fpos"); + if (WrongFunction) + diag(WrongFunction->getBeginLoc(), + "fpos_t object should be passed as an argument only to 'fsetpos' or " + "'fgetpos' functions.", + DiagnosticIDs::Note); +} + +} // namespace bugprone +} // namespace tidy +} // namespace clang Index: clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt =================================================================== --- clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt +++ clang-tools-extra/clang-tidy/bugprone/CMakeLists.txt @@ -12,6 +12,7 @@ FoldInitTypeCheck.cpp ForwardDeclarationNamespaceCheck.cpp ForwardingReferenceOverloadCheck.cpp + FsetposArgumentCheck.cpp InaccurateEraseCheck.cpp IncorrectRoundingsCheck.cpp IntegerDivisionCheck.cpp Index: clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp =================================================================== --- clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp +++ clang-tools-extra/clang-tidy/bugprone/BugproneTidyModule.cpp @@ -20,6 +20,7 @@ #include "FoldInitTypeCheck.h" #include "ForwardDeclarationNamespaceCheck.h" #include "ForwardingReferenceOverloadCheck.h" +#include "FsetposArgumentCheck.h" #include "InaccurateEraseCheck.h" #include "IncorrectRoundingsCheck.h" #include "IntegerDivisionCheck.h" @@ -81,6 +82,8 @@ "bugprone-forward-declaration-namespace"); CheckFactories.registerCheck<ForwardingReferenceOverloadCheck>( "bugprone-forwarding-reference-overload"); + CheckFactories.registerCheck<FsetposArgumentCheck>( + "bugprone-fsetpos-argument-check"); CheckFactories.registerCheck<InaccurateEraseCheck>( "bugprone-inaccurate-erase"); CheckFactories.registerCheck<IncorrectRoundingsCheck>(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits