diff options
author | DonĂ¡t Nagy <donat.nagy@ericsson.com> | 2024-06-12 14:26:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-12 14:26:47 +0200 |
commit | d9a508db55f986518983aaba18c1b7f9ce67536a (patch) | |
tree | c2fc843cee6858c972ef2c83e96f54d12a19891a /clang | |
parent | 3c9a9c736532ea1ed997aae069c516b2564c3235 (diff) | |
download | llvm-d9a508db55f986518983aaba18c1b7f9ce67536a.zip llvm-d9a508db55f986518983aaba18c1b7f9ce67536a.tar.gz llvm-d9a508db55f986518983aaba18c1b7f9ce67536a.tar.bz2 |
[analyzer] Finish moving alpha.core.SizeofPtr to clang-tidy (#95118)
The checker `alpha.core.SizeofPtr` was a very simple checker that did
not rely on path sensitive analysis and was very similar to the (more
complex and refined) clang-tidy check `bugprone-sizeof-expression`.
As there is no reason to maintain two separate implementations for the
same goal (and clang-tidy is more lightweight and accessible than the
Analyzer) I decided to move this functionality from the Static Analyzer
to clang-tidy.
Recently my commit 546c816a529835a4cf89deecff957ea336a94fa2
reimplemented the advantageous parts of `alpha.core.SizeofPtr` within
clang-tidy; now this commit finishes the transfer by deleting
`alpha.core.SizeofPtr`.
Diffstat (limited to 'clang')
-rw-r--r-- | clang/docs/analyzer/checkers.rst | 15 | ||||
-rw-r--r-- | clang/include/clang/StaticAnalyzer/Checkers/Checkers.td | 4 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt | 1 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/CheckSizeofPointer.cpp | 96 | ||||
-rw-r--r-- | clang/test/Analysis/sizeofpointer.c | 8 | ||||
-rw-r--r-- | clang/www/analyzer/alpha_checks.html | 16 |
6 files changed, 0 insertions, 140 deletions
diff --git a/clang/docs/analyzer/checkers.rst b/clang/docs/analyzer/checkers.rst index f53dd54..d76ee24 100644 --- a/clang/docs/analyzer/checkers.rst +++ b/clang/docs/analyzer/checkers.rst @@ -2452,21 +2452,6 @@ Check for pointer subtractions on two pointers pointing to different memory chun int d = &y - &x; // warn } -.. _alpha-core-SizeofPtr: - -alpha.core.SizeofPtr (C) -"""""""""""""""""""""""" -Warn about unintended use of ``sizeof()`` on pointer expressions. - -.. code-block:: c - - struct s {}; - - int test(struct s *p) { - return sizeof(p); - // warn: sizeof(ptr) can produce an unexpected result - } - .. _alpha-core-StackAddressAsyncEscape: alpha.core.StackAddressAsyncEscape (C) diff --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td index a7f62ef..429c334a 100644 --- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td +++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td @@ -296,10 +296,6 @@ def PointerSubChecker : Checker<"PointerSub">, "different memory chunks">, Documentation<HasDocumentation>; -def SizeofPointerChecker : Checker<"SizeofPtr">, - HelpText<"Warn about unintended use of sizeof() on pointer expressions">, - Documentation<HasDocumentation>; - def TestAfterDivZeroChecker : Checker<"TestAfterDivZero">, HelpText<"Check for division by variable that is later compared against 0. " "Either the comparison is useless or there is division by zero.">, diff --git a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt index 68e829c..682cfa0 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt +++ b/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt @@ -24,7 +24,6 @@ add_clang_library(clangStaticAnalyzerCheckers CheckObjCInstMethSignature.cpp CheckPlacementNew.cpp CheckSecuritySyntaxOnly.cpp - CheckSizeofPointer.cpp CheckerDocumentation.cpp ChrootChecker.cpp CloneChecker.cpp diff --git a/clang/lib/StaticAnalyzer/Checkers/CheckSizeofPointer.cpp b/clang/lib/StaticAnalyzer/Checkers/CheckSizeofPointer.cpp deleted file mode 100644 index 0d2551f..0000000 --- a/clang/lib/StaticAnalyzer/Checkers/CheckSizeofPointer.cpp +++ /dev/null @@ -1,96 +0,0 @@ -//==- CheckSizeofPointer.cpp - Check for sizeof on pointers ------*- 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 -// -//===----------------------------------------------------------------------===// -// -// This file defines a check for unintended use of sizeof() on pointer -// expressions. -// -//===----------------------------------------------------------------------===// - -#include "clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h" -#include "clang/AST/StmtVisitor.h" -#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" -#include "clang/StaticAnalyzer/Core/Checker.h" -#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" - -using namespace clang; -using namespace ento; - -namespace { -class WalkAST : public StmtVisitor<WalkAST> { - BugReporter &BR; - const CheckerBase *Checker; - AnalysisDeclContext* AC; - -public: - WalkAST(BugReporter &br, const CheckerBase *checker, AnalysisDeclContext *ac) - : BR(br), Checker(checker), AC(ac) {} - void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E); - void VisitStmt(Stmt *S) { VisitChildren(S); } - void VisitChildren(Stmt *S); -}; -} - -void WalkAST::VisitChildren(Stmt *S) { - for (Stmt *Child : S->children()) - if (Child) - Visit(Child); -} - -// CWE-467: Use of sizeof() on a Pointer Type -void WalkAST::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *E) { - if (E->getKind() != UETT_SizeOf) - return; - - // If an explicit type is used in the code, usually the coder knows what they are - // doing. - if (E->isArgumentType()) - return; - - QualType T = E->getTypeOfArgument(); - if (T->isPointerType()) { - - // Many false positives have the form 'sizeof *p'. This is reasonable - // because people know what they are doing when they intentionally - // dereference the pointer. - Expr *ArgEx = E->getArgumentExpr(); - if (!isa<DeclRefExpr>(ArgEx->IgnoreParens())) - return; - - PathDiagnosticLocation ELoc = - PathDiagnosticLocation::createBegin(E, BR.getSourceManager(), AC); - BR.EmitBasicReport(AC->getDecl(), Checker, - "Potential unintended use of sizeof() on pointer type", - categories::LogicError, - "The code calls sizeof() on a pointer type. " - "This can produce an unexpected result.", - ELoc, ArgEx->getSourceRange()); - } -} - -//===----------------------------------------------------------------------===// -// SizeofPointerChecker -//===----------------------------------------------------------------------===// - -namespace { -class SizeofPointerChecker : public Checker<check::ASTCodeBody> { -public: - void checkASTCodeBody(const Decl *D, AnalysisManager& mgr, - BugReporter &BR) const { - WalkAST walker(BR, this, mgr.getAnalysisDeclContext(D)); - walker.Visit(D->getBody()); - } -}; -} - -void ento::registerSizeofPointerChecker(CheckerManager &mgr) { - mgr.registerChecker<SizeofPointerChecker>(); -} - -bool ento::shouldRegisterSizeofPointerChecker(const CheckerManager &mgr) { - return true; -} diff --git a/clang/test/Analysis/sizeofpointer.c b/clang/test/Analysis/sizeofpointer.c deleted file mode 100644 index 14ddbd1..0000000 --- a/clang/test/Analysis/sizeofpointer.c +++ /dev/null @@ -1,8 +0,0 @@ -// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.core.SizeofPtr -verify %s - -struct s { -}; - -int f(struct s *p) { - return sizeof(p); // expected-warning{{The code calls sizeof() on a pointer type. This can produce an unexpected result}} -} diff --git a/clang/www/analyzer/alpha_checks.html b/clang/www/analyzer/alpha_checks.html index 411baae..501a9bc 100644 --- a/clang/www/analyzer/alpha_checks.html +++ b/clang/www/analyzer/alpha_checks.html @@ -239,22 +239,6 @@ void test() { </pre></div></div></td></tr> -<tr><td><a id="alpha.core.SizeofPtr"><div class="namedescr expandable"><span class="name"> -alpha.core.SizeofPtr</span><span class="lang"> -(C)</span><div class="descr"> -Warn about unintended use of <code>sizeof()</code> on pointer -expressions.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -struct s {}; - -int test(struct s *p) { - return sizeof(p); - // warn: sizeof(ptr) can produce an unexpected result -} -</pre></div></div></td></tr> - - <tr><td><a id="alpha.core.StackAddressAsyncEscape"><div class="namedescr expandable"><span class="name"> alpha.core.StackAddressAsyncEscape</span><span class="lang"> (C)</span><div class="descr"> |