[clang-tools-extra] r358333 - [clang-tidy] Use back-tick here
Author: ztamas Date: Sat Apr 13 07:31:54 2019 New Revision: 358333 URL: http://llvm.org/viewvc/llvm-project?rev=358333&view=rev Log: [clang-tidy] Use back-tick here Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/misc-throw-by-value-catch-by-reference.rst Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/misc-throw-by-value-catch-by-reference.rst URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/misc-throw-by-value-catch-by-reference.rst?rev=358333&r1=358332&r2=358333&view=diff == --- clang-tools-extra/trunk/docs/clang-tidy/checks/misc-throw-by-value-catch-by-reference.rst (original) +++ clang-tools-extra/trunk/docs/clang-tidy/checks/misc-throw-by-value-catch-by-reference.rst Sat Apr 13 07:31:54 2019 @@ -3,8 +3,8 @@ misc-throw-by-value-catch-by-reference == -"cert-err09-cpp" redirects here as an alias for this check. -"cert-err61-cpp" redirects here as an alias for this check. +`cert-err09-cpp` redirects here as an alias for this check. +`cert-err61-cpp` redirects here as an alias for this check. Finds violations of the rule "Throw by value, catch by reference" presented for example in "C++ Coding Standards" by H. Sutter and A. Alexandrescu. ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] r358356 - [clang-tidy] Add MagnitudeBitsUpperLimit option to bugprone-too-small-loop-variable
Author: ztamas Date: Sun Apr 14 05:47:48 2019 New Revision: 358356 URL: http://llvm.org/viewvc/llvm-project?rev=358356&view=rev Log: [clang-tidy] Add MagnitudeBitsUpperLimit option to bugprone-too-small-loop-variable Summary: The bugprone-too-small-loop-variable check often catches loop variables which can represent "big enough" values, so we don't actually need to worry about that this variable will overflow in a loop when the code iterates through a container. For example a 32 bit signed integer type's maximum value is 2 147 483 647 and a container's size won't reach this maximum value in most of the cases. So the idea of this option to allow the user to specify an upper limit (using magnitude bit of the integer type) to filter out those catches which are not interesting for the user, so he/she can focus on the more risky integer incompatibilities. Next to the option I replaced the term "positive bits" to "magnitude bits" which seems a better naming both in the code and in the name of the new option. Reviewers: JonasToth, alexfh, aaron.ballman, hokein Reviewed By: JonasToth Subscribers: Eugene.Zelenko, xazax.hun, jdoerfert, cfe-commits Tags: #clang-tools-extra, #clang Differential Revision: https://reviews.llvm.org/D59870 Added: clang-tools-extra/trunk/test/clang-tidy/bugprone-too-small-loop-variable-magniute-bits-upper-limit.cpp Modified: clang-tools-extra/trunk/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp clang-tools-extra/trunk/clang-tidy/bugprone/TooSmallLoopVariableCheck.h clang-tools-extra/trunk/docs/ReleaseNotes.rst clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-too-small-loop-variable.rst clang-tools-extra/trunk/test/clang-tidy/bugprone-too-small-loop-variable.cpp Modified: clang-tools-extra/trunk/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp?rev=358356&r1=358355&r2=358356&view=diff == --- clang-tools-extra/trunk/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/bugprone/TooSmallLoopVariableCheck.cpp Sun Apr 14 05:47:48 2019 @@ -27,6 +27,17 @@ static constexpr llvm::StringLiteral Loo static constexpr llvm::StringLiteral LoopIncrementName = llvm::StringLiteral("loopIncrement"); +TooSmallLoopVariableCheck::TooSmallLoopVariableCheck(StringRef Name, + ClangTidyContext *Context) +: ClangTidyCheck(Name, Context), + MagnitudeBitsUpperLimit(Options.get( + "MagnitudeBitsUpperLimit", 16)) {} + +void TooSmallLoopVariableCheck::storeOptions( +ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "MagnitudeBitsUpperLimit", MagnitudeBitsUpperLimit); +} + /// \brief The matcher for loops with suspicious integer loop variable. /// /// In this general example, assuming 'j' and 'k' are of integral type: @@ -84,9 +95,9 @@ void TooSmallLoopVariableCheck::register this); } -/// Returns the positive part of the integer width for an integer type. -static unsigned calcPositiveBits(const ASTContext &Context, - const QualType &IntExprType) { +/// Returns the magnitude bits of an integer type. +static unsigned calcMagnitudeBits(const ASTContext &Context, + const QualType &IntExprType) { assert(IntExprType->isIntegerType()); return IntExprType->isUnsignedIntegerType() @@ -94,13 +105,13 @@ static unsigned calcPositiveBits(const A : Context.getIntWidth(IntExprType) - 1; } -/// \brief Calculate the upper bound expression's positive bits, but ignore +/// \brief Calculate the upper bound expression's magnitude bits, but ignore /// constant like values to reduce false positives. -static unsigned calcUpperBoundPositiveBits(const ASTContext &Context, - const Expr *UpperBound, - const QualType &UpperBoundType) { +static unsigned calcUpperBoundMagnitudeBits(const ASTContext &Context, +const Expr *UpperBound, +const QualType &UpperBoundType) { // Ignore casting caused by constant values inside a binary operator. - // We are interested in variable values' positive bits. + // We are interested in variable values' magnitude bits. if (const auto *BinOperator = dyn_cast(UpperBound)) { const Expr *RHSE = BinOperator->getRHS()->IgnoreParenImpCasts(); const Expr *LHSE = BinOperator->getLHS()->IgnoreParenImpCasts(); @@ -122,15 +133,15 @@ static unsigned calcUpperBoundPositiveBi if (RHSEIsConstantValue && LHSEIsConstantValue) return 0; if (RHSEIsConstantValue) - return calcPositiveBits(Context, LHSEType); + return calcMagnitudeBits(Context,
[clang-tools-extra] r360540 - [clang-tidy] new check: bugprone-unhandled-self-assignment
Author: ztamas Date: Sun May 12 05:23:56 2019 New Revision: 360540 URL: http://llvm.org/viewvc/llvm-project?rev=360540&view=rev Log: [clang-tidy] new check: bugprone-unhandled-self-assignment Summary: This check searches for copy assignment operators which might not handle self-assignment properly. There are three patterns of handling a self assignment situation: self check, copy-and-swap or the less common copy-and-move. The new check warns if none of these patterns is found in a user defined implementation. See also: OOP54-CPP. Gracefully handle self-copy assignment https://wiki.sei.cmu.edu/confluence/display/cplusplus/OOP54-CPP.+Gracefully+handle+self-copy+assignment Reviewers: JonasToth, alexfh, hokein, aaron.ballman Subscribers: riccibruno, Eugene.Zelenko, mgorny, xazax.hun, cfe-commits Tags: #clang, #clang-tools-extra Differential Revision: https://reviews.llvm.org/D60507 Added: clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.h clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-unhandled-self-assignment.rst clang-tools-extra/trunk/test/clang-tidy/bugprone-unhandled-self-assignment.cpp Modified: clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp clang-tools-extra/trunk/clang-tidy/bugprone/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/bugprone/BugproneTidyModule.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp?rev=360540&r1=360539&r2=360540&view=diff == --- clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp Sun May 12 05:23:56 2019 @@ -46,6 +46,7 @@ #include "TooSmallLoopVariableCheck.h" #include "UndefinedMemoryManipulationCheck.h" #include "UndelegatedConstructorCheck.h" +#include "UnhandledSelfAssignmentCheck.h" #include "UnusedRaiiCheck.h" #include "UnusedReturnValueCheck.h" #include "UseAfterMoveCheck.h" @@ -132,6 +133,8 @@ public: "bugprone-undefined-memory-manipulation"); CheckFactories.registerCheck( "bugprone-undelegated-constructor"); +CheckFactories.registerCheck( +"bugprone-unhandled-self-assignment"); CheckFactories.registerCheck( "bugprone-unused-raii"); CheckFactories.registerCheck( Modified: clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt?rev=360540&r1=360539&r2=360540&view=diff == --- clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt (original) +++ clang-tools-extra/trunk/clang-tidy/bugprone/CMakeLists.txt Sun May 12 05:23:56 2019 @@ -38,6 +38,7 @@ add_clang_library(clangTidyBugproneModul TooSmallLoopVariableCheck.cpp UndefinedMemoryManipulationCheck.cpp UndelegatedConstructorCheck.cpp + UnhandledSelfAssignmentCheck.cpp UnusedRaiiCheck.cpp UnusedReturnValueCheck.cpp UseAfterMoveCheck.cpp Added: clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp?rev=360540&view=auto == --- clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp (added) +++ clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp Sun May 12 05:23:56 2019 @@ -0,0 +1,99 @@ +//===--- UnhandledSelfAssignmentCheck.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 "UnhandledSelfAssignmentCheck.h" +#include "clang/AST/ASTContext.h" +#include "clang/ASTMatchers/ASTMatchFinder.h" + +using namespace clang::ast_matchers; + +namespace clang { +namespace tidy { +namespace bugprone { + +void UnhandledSelfAssignmentCheck::registerMatchers(MatchFinder *Finder) { + if (!getLangOpts().CPlusPlus) +return; + + // We don't care about deleted, default or implicit operator implementations. + const auto IsUserDefined = cxxMethodDecl( + isDefinition(), unless(anyOf(isDeleted(), isImplicit(), isDefaulted(; + + // We don't need to worry when a copy assignment operator gets the other + // object by value. + const auto HasReferenceParam = + cxxMethodDecl(hasParameter(0, parmVarDecl
[clang-tools-extra] r361138 - [clang-tidy] Sort this list alphabetically
Author: ztamas Date: Mon May 20 03:37:42 2019 New Revision: 361138 URL: http://llvm.org/viewvc/llvm-project?rev=361138&view=rev Log: [clang-tidy] Sort this list alphabetically Modified: clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp Modified: clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp?rev=361138&r1=361137&r2=361138&view=diff == --- clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/bugprone/BugproneTidyModule.cpp Mon May 20 03:37:42 2019 @@ -100,8 +100,6 @@ public: "bugprone-move-forwarding-reference"); CheckFactories.registerCheck( "bugprone-multiple-statement-macro"); -CheckFactories.registerCheck( -"bugprone-too-small-loop-variable"); CheckFactories.registerCheck( "bugprone-narrowing-conversions"); CheckFactories.registerCheck( @@ -132,6 +130,8 @@ public: "bugprone-terminating-continue"); CheckFactories.registerCheck( "bugprone-throw-keyword-missing"); +CheckFactories.registerCheck( +"bugprone-too-small-loop-variable"); CheckFactories.registerCheck( "bugprone-undefined-memory-manipulation"); CheckFactories.registerCheck( ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang-tools-extra] r361550 - [clang-tidy]: Add cert-oop54-cpp alias for bugprone-unhandled-self-assignment
Author: ztamas Date: Thu May 23 13:29:04 2019 New Revision: 361550 URL: http://llvm.org/viewvc/llvm-project?rev=361550&view=rev Log: [clang-tidy]: Add cert-oop54-cpp alias for bugprone-unhandled-self-assignment Summary: Added WarnOnlyIfThisHasSuspiciousField option to allow to catch any copy assignment operator independently from the container class's fields. Added the cert alias using this option. Reviewers: aaron.ballman Reviewed By: aaron.ballman Subscribers: mgorny, Eugene.Zelenko, xazax.hun, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D62192 Added: clang-tools-extra/trunk/docs/clang-tidy/checks/cert-oop54-cpp.rst clang-tools-extra/trunk/test/clang-tidy/bugprone-unhandled-self-assignment-warn-only-if-this-has-suspicious-field.cpp clang-tools-extra/trunk/test/clang-tidy/cert-oop54-cpp.cpp Modified: clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.h clang-tools-extra/trunk/clang-tidy/cert/CERTTidyModule.cpp clang-tools-extra/trunk/clang-tidy/cert/CMakeLists.txt clang-tools-extra/trunk/docs/ReleaseNotes.rst clang-tools-extra/trunk/docs/clang-tidy/checks/bugprone-unhandled-self-assignment.rst clang-tools-extra/trunk/docs/clang-tidy/checks/list.rst Modified: clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp?rev=361550&r1=361549&r2=361550&view=diff == --- clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/bugprone/UnhandledSelfAssignmentCheck.cpp Thu May 23 13:29:04 2019 @@ -16,6 +16,18 @@ namespace clang { namespace tidy { namespace bugprone { +UnhandledSelfAssignmentCheck::UnhandledSelfAssignmentCheck( +StringRef Name, ClangTidyContext *Context) +: ClangTidyCheck(Name, Context), + WarnOnlyIfThisHasSuspiciousField( + Options.get("WarnOnlyIfThisHasSuspiciousField", true)) {} + +void UnhandledSelfAssignmentCheck::storeOptions( +ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "WarnOnlyIfThisHasSuspiciousField", +WarnOnlyIfThisHasSuspiciousField); +} + void UnhandledSelfAssignmentCheck::registerMatchers(MatchFinder *Finder) { if (!getLangOpts().CPlusPlus) return; @@ -61,29 +73,32 @@ void UnhandledSelfAssignmentCheck::regis cxxMethodDecl(unless(hasDescendant(cxxMemberCallExpr(callee(cxxMethodDecl( hasName("operator="), ofClass(equalsBoundNode("class"; - // Matcher for standard smart pointers. - const auto SmartPointerType = qualType(hasUnqualifiedDesugaredType( - recordType(hasDeclaration(classTemplateSpecializationDecl( - hasAnyName("::std::shared_ptr", "::std::unique_ptr", - "::std::weak_ptr", "::std::auto_ptr"), - templateArgumentCountIs(1)); - - // We will warn only if the class has a pointer or a C array field which - // probably causes a problem during self-assignment (e.g. first resetting the - // pointer member, then trying to access the object pointed by the pointer, or - // memcpy overlapping arrays). - const auto ThisHasSuspiciousField = cxxMethodDecl(ofClass(cxxRecordDecl( - has(fieldDecl(anyOf(hasType(pointerType()), hasType(SmartPointerType), - hasType(arrayType(; - - Finder->addMatcher( - cxxMethodDecl(ofClass(cxxRecordDecl().bind("class")), -isCopyAssignmentOperator(), IsUserDefined, -HasReferenceParam, HasNoSelfCheck, -unless(HasNonTemplateSelfCopy), unless(HasTemplateSelfCopy), -HasNoNestedSelfAssign, ThisHasSuspiciousField) - .bind("copyAssignmentOperator"), - this); + DeclarationMatcher AdditionalMatcher = cxxMethodDecl(); + if (WarnOnlyIfThisHasSuspiciousField) { +// Matcher for standard smart pointers. +const auto SmartPointerType = qualType(hasUnqualifiedDesugaredType( +recordType(hasDeclaration(classTemplateSpecializationDecl( +hasAnyName("::std::shared_ptr", "::std::unique_ptr", + "::std::weak_ptr", "::std::auto_ptr"), +templateArgumentCountIs(1)); + +// We will warn only if the class has a pointer or a C array field which +// probably causes a problem during self-assignment (e.g. first resetting +// the pointer member, then trying to access the object pointed by the +// pointer, or memcpy overlapping arrays). +AdditionalMatcher = cxxMethodDecl(ofClass(cxxRecordDecl( +has(fieldDecl(anyOf(hasType(pointerType()), hasType(SmartPointerType), +hasType(arrayType(; + } + + Finder->addMatcher(cxxMethodDec