summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-tidy/misc
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clang-tidy/misc')
-rw-r--r--clang-tools-extra/clang-tidy/misc/CMakeLists.txt1
-rw-r--r--clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp3
-rw-r--r--clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp265
-rw-r--r--clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.h40
4 files changed, 0 insertions, 309 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/CMakeLists.txt b/clang-tools-extra/clang-tidy/misc/CMakeLists.txt
index 023288e7295..4d8cedd81da 100644
--- a/clang-tools-extra/clang-tidy/misc/CMakeLists.txt
+++ b/clang-tools-extra/clang-tidy/misc/CMakeLists.txt
@@ -9,7 +9,6 @@ add_clang_library(clangTidyMiscModule
NonCopyableObjects.cpp
RedundantExpressionCheck.cpp
SizeofContainerCheck.cpp
- SizeofExpressionCheck.cpp
StaticAssertCheck.cpp
ThrowByValueCatchByReferenceCheck.cpp
UniqueptrResetReleaseCheck.cpp
diff --git a/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp b/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp
index a5f017ee719..9a9ebb6f9d2 100644
--- a/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp
+++ b/clang-tools-extra/clang-tidy/misc/MiscTidyModule.cpp
@@ -16,7 +16,6 @@
#include "NonCopyableObjects.h"
#include "RedundantExpressionCheck.h"
#include "SizeofContainerCheck.h"
-#include "SizeofExpressionCheck.h"
#include "StaticAssertCheck.h"
#include "ThrowByValueCatchByReferenceCheck.h"
#include "UnconventionalAssignOperatorCheck.h"
@@ -45,8 +44,6 @@ public:
CheckFactories.registerCheck<RedundantExpressionCheck>(
"misc-redundant-expression");
CheckFactories.registerCheck<SizeofContainerCheck>("misc-sizeof-container");
- CheckFactories.registerCheck<SizeofExpressionCheck>(
- "misc-sizeof-expression");
CheckFactories.registerCheck<StaticAssertCheck>("misc-static-assert");
CheckFactories.registerCheck<ThrowByValueCatchByReferenceCheck>(
"misc-throw-by-value-catch-by-reference");
diff --git a/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp b/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp
deleted file mode 100644
index 5b8e7e7632a..00000000000
--- a/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-//===--- SizeofExpressionCheck.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 "SizeofExpressionCheck.h"
-#include "../utils/Matchers.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/ASTMatchers/ASTMatchFinder.h"
-
-using namespace clang::ast_matchers;
-
-namespace clang {
-namespace tidy {
-namespace misc {
-
-namespace {
-
-AST_MATCHER_P(IntegerLiteral, isBiggerThan, unsigned, N) {
- return Node.getValue().getZExtValue() > N;
-}
-
-AST_MATCHER_P2(Expr, hasSizeOfDescendant, int, Depth,
- ast_matchers::internal::Matcher<Expr>, InnerMatcher) {
- if (Depth < 0)
- return false;
-
- const Expr *E = Node.IgnoreParenImpCasts();
- if (InnerMatcher.matches(*E, Finder, Builder))
- return true;
-
- if (const auto *CE = dyn_cast<CastExpr>(E)) {
- const auto M = hasSizeOfDescendant(Depth - 1, InnerMatcher);
- return M.matches(*CE->getSubExpr(), Finder, Builder);
- } else if (const auto *UE = dyn_cast<UnaryOperator>(E)) {
- const auto M = hasSizeOfDescendant(Depth - 1, InnerMatcher);
- return M.matches(*UE->getSubExpr(), Finder, Builder);
- } else if (const auto *BE = dyn_cast<BinaryOperator>(E)) {
- const auto LHS = hasSizeOfDescendant(Depth - 1, InnerMatcher);
- const auto RHS = hasSizeOfDescendant(Depth - 1, InnerMatcher);
- return LHS.matches(*BE->getLHS(), Finder, Builder) ||
- RHS.matches(*BE->getRHS(), Finder, Builder);
- }
-
- return false;
-}
-
-CharUnits getSizeOfType(const ASTContext &Ctx, const Type *Ty) {
- if (!Ty || Ty->isIncompleteType() || Ty->isDependentType() ||
- isa<DependentSizedArrayType>(Ty) || !Ty->isConstantSizeType())
- return CharUnits::Zero();
- return Ctx.getTypeSizeInChars(Ty);
-}
-
-} // namespace
-
-SizeofExpressionCheck::SizeofExpressionCheck(StringRef Name,
- ClangTidyContext *Context)
- : ClangTidyCheck(Name, Context),
- WarnOnSizeOfConstant(Options.get("WarnOnSizeOfConstant", 1) != 0),
- WarnOnSizeOfThis(Options.get("WarnOnSizeOfThis", 1) != 0),
- WarnOnSizeOfCompareToConstant(
- Options.get("WarnOnSizeOfCompareToConstant", 1) != 0) {}
-
-void SizeofExpressionCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) {
- Options.store(Opts, "WarnOnSizeOfConstant", WarnOnSizeOfConstant);
- Options.store(Opts, "WarnOnSizeOfThis", WarnOnSizeOfThis);
- Options.store(Opts, "WarnOnSizeOfCompareToConstant",
- WarnOnSizeOfCompareToConstant);
-}
-
-void SizeofExpressionCheck::registerMatchers(MatchFinder *Finder) {
- const auto IntegerExpr = ignoringParenImpCasts(integerLiteral());
- const auto ConstantExpr = expr(ignoringParenImpCasts(
- anyOf(integerLiteral(), unaryOperator(hasUnaryOperand(IntegerExpr)),
- binaryOperator(hasLHS(IntegerExpr), hasRHS(IntegerExpr)))));
- const auto SizeOfExpr =
- expr(anyOf(sizeOfExpr(has(type())), sizeOfExpr(has(expr()))));
- const auto SizeOfZero = expr(
- sizeOfExpr(has(ignoringParenImpCasts(expr(integerLiteral(equals(0)))))));
-
- // Detect expression like: sizeof(ARRAYLEN);
- // Note: The expression 'sizeof(sizeof(0))' is a portable trick used to know
- // the sizeof size_t.
- if (WarnOnSizeOfConstant) {
- Finder->addMatcher(
- expr(sizeOfExpr(has(ignoringParenImpCasts(ConstantExpr))),
- unless(SizeOfZero))
- .bind("sizeof-constant"),
- this);
- }
-
- // Detect expression like: sizeof(this);
- if (WarnOnSizeOfThis) {
- Finder->addMatcher(
- expr(sizeOfExpr(has(ignoringParenImpCasts(expr(cxxThisExpr())))))
- .bind("sizeof-this"),
- this);
- }
-
- // Detect sizeof(kPtr) where kPtr is 'const char* kPtr = "abc"';
- const auto CharPtrType = pointerType(pointee(isAnyCharacter()));
- const auto ConstStrLiteralDecl =
- varDecl(isDefinition(), hasType(qualType(hasCanonicalType(CharPtrType))),
- hasInitializer(ignoringParenImpCasts(stringLiteral())));
- Finder->addMatcher(expr(sizeOfExpr(has(ignoringParenImpCasts(expr(
- hasType(qualType(hasCanonicalType(CharPtrType))),
- ignoringParenImpCasts(declRefExpr(
- hasDeclaration(ConstStrLiteralDecl))))))))
- .bind("sizeof-charp"),
- this);
-
- // Detect sizeof(ptr) where ptr points to an aggregate (i.e. sizeof(&S)).
- const auto ArrayExpr = expr(ignoringParenImpCasts(
- expr(hasType(qualType(hasCanonicalType(arrayType()))))));
- const auto ArrayCastExpr = expr(anyOf(
- unaryOperator(hasUnaryOperand(ArrayExpr), unless(hasOperatorName("*"))),
- binaryOperator(hasEitherOperand(ArrayExpr)),
- castExpr(hasSourceExpression(ArrayExpr))));
- const auto PointerToArrayExpr = expr(ignoringParenImpCasts(expr(
- hasType(qualType(hasCanonicalType(pointerType(pointee(arrayType()))))))));
-
- const auto StructAddrOfExpr =
- unaryOperator(hasOperatorName("&"),
- hasUnaryOperand(ignoringParenImpCasts(expr(
- hasType(qualType(hasCanonicalType(recordType())))))));
-
- Finder->addMatcher(
- expr(sizeOfExpr(has(expr(ignoringParenImpCasts(
- anyOf(ArrayCastExpr, PointerToArrayExpr, StructAddrOfExpr))))))
- .bind("sizeof-pointer-to-aggregate"),
- this);
-
- // Detect expression like: sizeof(epxr) <= k for a suspicious constant 'k'.
- if (WarnOnSizeOfCompareToConstant) {
- Finder->addMatcher(
- binaryOperator(matchers::isRelationalOperator(),
- hasEitherOperand(ignoringParenImpCasts(SizeOfExpr)),
- hasEitherOperand(ignoringParenImpCasts(
- anyOf(integerLiteral(equals(0)),
- integerLiteral(isBiggerThan(0x80000))))))
- .bind("sizeof-compare-constant"),
- this);
- }
-
- // Detect expression like: sizeof(expr, expr); most likely an error.
- Finder->addMatcher(expr(sizeOfExpr(has(expr(ignoringParenImpCasts(
- binaryOperator(hasOperatorName(",")))))))
- .bind("sizeof-comma-expr"),
- this);
-
- // Detect sizeof(...) /sizeof(...));
- const auto ElemType =
- arrayType(hasElementType(recordType().bind("elem-type")));
- const auto ElemPtrType = pointerType(pointee(type().bind("elem-ptr-type")));
- const auto NumType = qualType(hasCanonicalType(
- type(anyOf(ElemType, ElemPtrType, type())).bind("num-type")));
- const auto DenomType = qualType(hasCanonicalType(type().bind("denom-type")));
-
- Finder->addMatcher(
- binaryOperator(hasOperatorName("/"),
- hasLHS(expr(ignoringParenImpCasts(
- anyOf(sizeOfExpr(has(NumType)),
- sizeOfExpr(has(expr(hasType(NumType)))))))),
- hasRHS(expr(ignoringParenImpCasts(
- anyOf(sizeOfExpr(has(DenomType)),
- sizeOfExpr(has(expr(hasType(DenomType)))))))))
- .bind("sizeof-divide-expr"),
- this);
-
- // Detect expression like: sizeof(...) * sizeof(...)); most likely an error.
- Finder->addMatcher(binaryOperator(hasOperatorName("*"),
- hasLHS(ignoringParenImpCasts(SizeOfExpr)),
- hasRHS(ignoringParenImpCasts(SizeOfExpr)))
- .bind("sizeof-multiply-sizeof"),
- this);
-
- Finder->addMatcher(
- binaryOperator(hasOperatorName("*"),
- hasEitherOperand(ignoringParenImpCasts(SizeOfExpr)),
- hasEitherOperand(ignoringParenImpCasts(binaryOperator(
- hasOperatorName("*"),
- hasEitherOperand(ignoringParenImpCasts(SizeOfExpr))))))
- .bind("sizeof-multiply-sizeof"),
- this);
-
- // Detect strange double-sizeof expression like: sizeof(sizeof(...));
- // Note: The expression 'sizeof(sizeof(0))' is accepted.
- Finder->addMatcher(
- expr(sizeOfExpr(has(ignoringParenImpCasts(expr(
- hasSizeOfDescendant(8, expr(SizeOfExpr, unless(SizeOfZero))))))))
- .bind("sizeof-sizeof-expr"),
- this);
-}
-
-void SizeofExpressionCheck::check(const MatchFinder::MatchResult &Result) {
- const ASTContext &Ctx = *Result.Context;
-
- if (const auto *E = Result.Nodes.getNodeAs<Expr>("sizeof-constant")) {
- diag(E->getLocStart(),
- "suspicious usage of 'sizeof(K)'; did you mean 'K'?");
- } else if (const auto *E = Result.Nodes.getNodeAs<Expr>("sizeof-this")) {
- diag(E->getLocStart(),
- "suspicious usage of 'sizeof(this)'; did you mean 'sizeof(*this)'");
- } else if (const auto *E = Result.Nodes.getNodeAs<Expr>("sizeof-charp")) {
- diag(E->getLocStart(),
- "suspicious usage of 'sizeof(char*)'; do you mean 'strlen'?");
- } else if (const auto *E =
- Result.Nodes.getNodeAs<Expr>("sizeof-pointer-to-aggregate")) {
- diag(E->getLocStart(),
- "suspicious usage of 'sizeof(A*)'; pointer to aggregate");
- } else if (const auto *E =
- Result.Nodes.getNodeAs<Expr>("sizeof-compare-constant")) {
- diag(E->getLocStart(),
- "suspicious comparison of 'sizeof(expr)' to a constant");
- } else if (const auto *E =
- Result.Nodes.getNodeAs<Expr>("sizeof-comma-expr")) {
- diag(E->getLocStart(), "suspicious usage of 'sizeof(..., ...)'");
- } else if (const auto *E =
- Result.Nodes.getNodeAs<Expr>("sizeof-divide-expr")) {
- const auto *NumTy = Result.Nodes.getNodeAs<Type>("num-type");
- const auto *DenomTy = Result.Nodes.getNodeAs<Type>("denom-type");
- const auto *ElementTy = Result.Nodes.getNodeAs<Type>("elem-type");
- const auto *PointedTy = Result.Nodes.getNodeAs<Type>("elem-ptr-type");
-
- CharUnits NumeratorSize = getSizeOfType(Ctx, NumTy);
- CharUnits DenominatorSize = getSizeOfType(Ctx, DenomTy);
- CharUnits ElementSize = getSizeOfType(Ctx, ElementTy);
-
- if (DenominatorSize > CharUnits::Zero() &&
- !NumeratorSize.isMultipleOf(DenominatorSize)) {
- diag(E->getLocStart(), "suspicious usage of 'sizeof(...)/sizeof(...)';"
- " numerator is not a multiple of denominator");
- } else if (ElementSize > CharUnits::Zero() &&
- DenominatorSize > CharUnits::Zero() &&
- ElementSize != DenominatorSize) {
- diag(E->getLocStart(), "suspicious usage of 'sizeof(...)/sizeof(...)';"
- " numerator is not a multiple of denominator");
- } else if (NumTy && DenomTy && NumTy == DenomTy) {
- diag(E->getLocStart(),
- "suspicious usage of sizeof pointer 'sizeof(T)/sizeof(T)'");
- } else if (PointedTy && DenomTy && PointedTy == DenomTy) {
- diag(E->getLocStart(),
- "suspicious usage of sizeof pointer 'sizeof(T*)/sizeof(T)'");
- } else if (NumTy && DenomTy && NumTy->isPointerType() &&
- DenomTy->isPointerType()) {
- diag(E->getLocStart(),
- "suspicious usage of sizeof pointer 'sizeof(P*)/sizeof(Q*)'");
- }
- } else if (const auto *E =
- Result.Nodes.getNodeAs<Expr>("sizeof-sizeof-expr")) {
- diag(E->getLocStart(), "suspicious usage of 'sizeof(sizeof(...))'");
- } else if (const auto *E =
- Result.Nodes.getNodeAs<Expr>("sizeof-multiply-sizeof")) {
- diag(E->getLocStart(), "suspicious 'sizeof' by 'sizeof' multiplication");
- }
-}
-
-} // namespace misc
-} // namespace tidy
-} // namespace clang
diff --git a/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.h b/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.h
deleted file mode 100644
index d2ba9daf38e..00000000000
--- a/clang-tools-extra/clang-tidy/misc/SizeofExpressionCheck.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//===--- SizeofExpressionCheck.h - clang-tidy--------------------*- C++ -*-===//
-//
-// 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_MISC_SIZEOF_EXPRESSION_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_SIZEOF_EXPRESSION_H
-
-#include "../ClangTidy.h"
-
-namespace clang {
-namespace tidy {
-namespace misc {
-
-/// Find suspicious usages of sizeof expression.
-///
-/// For the user-facing documentation see:
-/// http://clang.llvm.org/extra/clang-tidy/checks/misc-sizeof-expression.html
-class SizeofExpressionCheck : public ClangTidyCheck {
-public:
- SizeofExpressionCheck(StringRef Name, ClangTidyContext *Context);
- void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
- void registerMatchers(ast_matchers::MatchFinder *Finder) override;
- void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
-
-private:
- const bool WarnOnSizeOfConstant;
- const bool WarnOnSizeOfThis;
- const bool WarnOnSizeOfCompareToConstant;
-};
-
-} // namespace misc
-} // namespace tidy
-} // namespace clang
-
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MISC_SIZEOF_EXPRESSION_H
OpenPOWER on IntegriCloud