Endre =?utf-8?q?Fülöp?= <endre.fu...@sigmatechnology.com>, Endre =?utf-8?q?Fülöp?= <endre.fu...@sigmatechnology.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/97...@github.com>
llvmbot wrote: <!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Endre Fülöp (gamesh411) <details> <summary>Changes</summary> Documentation for the checkers is kept up to date in RST files. This patch removes duplication by replacing the HTML docs with links to docs generated from the RST. --- Patch is 87.51 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/97032.diff 5 Files Affected: - (removed) clang/www/analyzer/alpha_checks.html (-956) - (modified) clang/www/analyzer/annotations.html (+1-1) - (removed) clang/www/analyzer/available_checks.html (-1760) - (modified) clang/www/analyzer/checker_dev_manual.html (+1-1) - (modified) clang/www/analyzer/menu.html.incl (+1-1) ``````````diff diff --git a/clang/www/analyzer/alpha_checks.html b/clang/www/analyzer/alpha_checks.html deleted file mode 100644 index 501a9bcbc82a9..0000000000000 --- a/clang/www/analyzer/alpha_checks.html +++ /dev/null @@ -1,956 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> -<html> -<head> - <title>Alpha Checks</title> - <link type="text/css" rel="stylesheet" href="menu.css"> - <link type="text/css" rel="stylesheet" href="content.css"> - <script type="text/javascript" src="scripts/menu.js"></script> - <script type="text/javascript" src="scripts/expandcollapse.js"></script> - <style type="text/css"> - tr:first-child { width:20%; } - </style> -</head> -<body onload="initExpandCollapse()"> - -<div id="page"> -<!--#include virtual="menu.html.incl"--> - -<div id="content"> -<h1>Alpha Checkers</h1> -Experimental checkers in addition to the <a href = "available_checks.html"> -Default Checkers</a>. These are checkers with known issues or limitations that -keep them from being on by default. They are likely to have false positives. -Bug reports are welcome but will likely not be investigated for some time. -Patches welcome! -<ul> -<li><a href="#clone_alpha_checkers">Clone Alpha Checkers</a></li> -<li><a href="#core_alpha_checkers">Core Alpha Checkers</a></li> -<li><a href="#cplusplus_alpha_checkers">C++ Alpha Checkers</a></li> -<li><a href="#llvm_alpha_checkers">LLVM Checkers</a></li> -<li><a href="#valist_alpha_checkers">Variable Argument Alpha Checkers</a></li> -<li><a href="#deadcode_alpha_checkers">Dead Code Alpha Checkers</a></li> -<li><a href="#osx_alpha_checkers">OS X Alpha Checkers</a></li> -<li><a href="#security_alpha_checkers">Security Alpha Checkers</a></li> -<li><a href="#unix_alpha_checkers">Unix Alpha Checkers</a></li> -<li><a href="#nondeterminism_alpha_checkers">Non-determinism Alpha Checkers</a></li> -</ul> - -<!-- ============================= clone alpha ============================= --> - -<h3 id="clone_alpha_checkers">Clone Alpha Checkers</h3> -<table class="checkers"> -<colgroup><col class="namedescr"><col class="example"></colgroup> -<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> - -<tbody> -<tr><td><a id="alpha.clone.CloneChecker"><div class="namedescr expandable"><span class="name"> -alpha.clone.CloneChecker</span><span class="lang"> -(C, C++, ObjC)</span><div class="descr"> -Reports similar pieces of code.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void log(); - -int max(int a, int b) { // warn - log(); - if (a > b) - return a; - return b; -} - -int maxClone(int x, int y) { // similar code here - log(); - if (x > y) - return x; - return y; -} -</pre></div></div></td></tr> -</tbody></table> - -<!-- ============================= core alpha ============================= --> -<h3 id="core_alpha_checkers">Core Alpha Checkers</h3> -<table class="checkers"> -<colgroup><col class="namedescr"><col class="example"></colgroup> -<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> - -<tbody> -<tr><td><a id="alpha.core.BoolAssignment"><div class="namedescr expandable"><span class="name"> -alpha.core.BoolAssignment</span><span class="lang"> -(ObjC)</span><div class="descr"> -Warn about assigning non-{0,1} values to boolean variables.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test() { - BOOL b = -1; // warn -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.CastSize"><div class="namedescr expandable"><span class="name"> -alpha.core.CastSize</span><span class="lang"> -(C)</span><div class="descr"> -Check when casting a malloc'ed type T, whether the size is a multiple of the -size of T (Works only with <span class="name">unix.Malloc</span> -or <span class="name">alpha.unix.MallocWithAnnotations</span> -checks enabled).</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test() { - int *x = (int *)malloc(11); // warn -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.CastToStruct"><div class="namedescr expandable"><span class="name"> -alpha.core.CastToStruct</span><span class="lang"> -(C, C++)</span><div class="descr"> -Check for cast from non-struct pointer to struct pointer.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -// C -struct s {}; - -void test(int *p) { - struct s *ps = (struct s *) p; // warn -} -</pre></div><div class="separator"></div> -<div class="example"><pre> -// C++ -class c {}; - -void test(int *p) { - c *pc = (c *) p; // warn -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.Conversion"><div class="namedescr expandable"><span class="name"> -alpha.core.Conversion</span><span class="lang"> -(C, C++, ObjC)</span><div class="descr"> -Loss of sign or precision in implicit conversions</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test(unsigned U, signed S) { - if (S > 10) { - if (U < S) { - } - } - if (S < -10) { - if (U < S) { // warn (loss of sign) - } - } -} -</pre></div><div class="separator"></div> -<div class="example"><pre> -void test() { - long long A = 1LL << 60; - short X = A; // warn (loss of precision) -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.DynamicTypeChecker"><div class="namedescr expandable"><span class="name"> -alpha.core.DynamicTypeChecker</span><span class="lang"> -(ObjC)</span><div class="descr"> -Check for cases where the dynamic and the static type of an -object are unrelated.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -id date = [NSDate date]; - -// Warning: Object has a dynamic type 'NSDate *' which is -// incompatible with static type 'NSNumber *'" -NSNumber *number = date; -[number doubleValue]; -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.FixedAddr"><div class="namedescr expandable"><span class="name"> -alpha.core.FixedAddr</span><span class="lang"> -(C)</span><div class="descr"> -Check for assignment of a fixed address to a pointer.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test() { - int *p; - p = (int *) 0x10000; // warn -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.IdenticalExpr"><div class="namedescr expandable"><span class="name"> -alpha.core.IdenticalExpr</span><span class="lang"> -(C, C++)</span><div class="descr"> -Warn about suspicious uses of identical expressions.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -// C -void test() { - int a = 5; - int b = a | 4 | a; // warn: identical expr on both sides -} -</pre></div><div class="separator"></div> -<div class="example"><pre> -// C++ -bool f(void); - -void test(bool b) { - int i = 10; - if (f()) { // warn: true and false branches are identical - do { - i--; - } while (f()); - } else { - do { - i--; - } while (f()); - } -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.PointerArithm"><div class="namedescr expandable"><span class="name"> -alpha.core.PointerArithm</span><span class="lang"> -(C)</span><div class="descr"> -Check for pointer arithmetic on locations other than array -elements.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test() { - int x; - int *p; - p = &x + 1; // warn -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.PointerSub"><div class="namedescr expandable"><span class="name"> -alpha.core.PointerSub</span><span class="lang"> -(C)</span><div class="descr"> -Check for pointer subtractions on two pointers pointing to different memory -chunks.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test() { - int x, y; - int d = &y - &x; // warn -} -</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"> -Check that addresses to stack memory do not escape the function that involves -<code>dispatch_after</code> or <code>dispatch_async</code>. This checker is -a part of core.StackAddressEscape, but is -<a href=https://reviews.llvm.org/D41042>temporarily disabled</a> until some -false positives are fixed.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -dispatch_block_t test_block_inside_block_async_leak() { - int x = 123; - void (^inner)(void) = ^void(void) { - int y = x; - ++y; - }; - void (^outer)(void) = ^void(void) { - int z = x; - ++z; - inner(); - }; - return outer; // warn: address of stack-allocated block is captured by a - // returned block -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.core.TestAfterDivZero"><div class="namedescr expandable"><span class="name"> -alpha.core.TestAfterDivZero</span><span class="lang"> -(C, C++, ObjC)</span><div class="descr"> -Check for division by variable that is later compared against 0. -Either the comparison is useless or there is division by zero. -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test(int x) { - var = 77 / x; - if (x == 0) { } // warn -} -</pre></div></div></td></tr> - - -</tbody></table> - -<!-- =========================== cplusplus alpha =========================== --> -<h3 id="cplusplus_alpha_checkers">C++ Alpha Checkers</h3> -<table class="checkers"> -<colgroup><col class="namedescr"><col class="example"></colgroup> -<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> -<tbody> - - -<tr><td><a id="alpha.cplusplus.DeleteWithNonVirtualDtor"><div class="namedescr expandable"><span class="name"> -alpha.cplusplus.DeleteWithNonVirtualDtor</span><span class="lang"> -(C++)</span><div class="descr"> -Reports destructions of polymorphic objects with a non-virtual destructor in -their base class -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -NonVirtual *create() { - NonVirtual *x = new NVDerived(); // note: Casting from 'NVDerived' to - // 'NonVirtual' here - return x; -} - -void sink(NonVirtual *x) { - delete x; // warn: destruction of a polymorphic object with no virtual - // destructor -} -</pre></div></div></td></tr> - -<tr><td><a id="alpha.cplusplus.InvalidatedIterator"><div class="namedescr expandable"><span class="name"> -alpha.cplusplus.InvalidatedIterator</span><span class="lang"> -(C++)</span><div class="descr"> -Check for use of invalidated iterators. -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void bad_copy_assign_operator_list1(std::list<int> &L1, - const std::list<int> &L2) { - auto i0 = L1.cbegin(); - L1 = L2; - *i0; // warn: invalidated iterator accessed -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.cplusplus.IteratorRange"><div class="namedescr expandable"><span class="name"> -alpha.cplusplus.IteratorRange</span><span class="lang"> -(C++)</span><div class="descr"> -Check for iterators used outside their valid ranges. -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void simple_bad_end(const std::vector<int> &v) { - auto i = v.end(); - *i; // warn: iterator accessed outside of its range -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.cplusplus.MismatchedIterator"><div class="namedescr expandable"><span class="name"> -alpha.cplusplus.MismatchedIterator</span><span class="lang"> -(C++)</span><div class="descr"> -Check for use of iterators of different containers where iterators of the same -container are expected. -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void bad_insert3(std::vector<int> &v1, std::vector<int> &v2) { - v2.insert(v1.cbegin(), v2.cbegin(), v2.cend()); // warn: container accessed - // using foreign - // iterator argument - v1.insert(v1.cbegin(), v1.cbegin(), v2.cend()); // warn: iterators of - // different containers - // used where the same - // container is - // expected - v1.insert(v1.cbegin(), v2.cbegin(), v1.cend()); // warn: iterators of - // different containers - // used where the same - // container is - // expected -} -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.cplusplus.Move"><div class="namedescr expandable"><span class="name"> -alpha.cplusplus.Move</span><span class="lang"> -(C++)</span><div class="descr"> -Method calls on a moved-from object and copying a moved-from object will be -reported. -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -struct A { - void foo() {} -}; - -void f() { - A a; - A b = std::move(a); // note: 'a' became 'moved-from' here - a.foo(); // warn: method call on a 'moved-from' object 'a' -} -</pre></div></div></td></tr> - - -</tbody></table> - - -<!-- =========================== dead code alpha =========================== --> -<h3 id="deadcode_alpha_checkers">Dead Code Alpha Checkers</h3> -<table class="checkers"> -<colgroup><col class="namedescr"><col class="example"></colgroup> -<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> - -<tbody> -<tr><td><a id="alpha.deadcode.UnreachableCode"><div class="namedescr expandable"><span class="name"> -alpha.deadcode.UnreachableCode</span><span class="lang"> -(C, C++, ObjC)</span><div class="descr"> -Check unreachable code.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -// C -int test() { - int x = 1; - while(x); - return x; // warn -} -</pre></div><div class="separator"></div> -<div class="example"><pre> -// C++ -void test() { - int a = 2; - - while (a > 1) - a--; - - if (a > 1) - a++; // warn -} -</pre></div><div class="separator"></div> -<div class="example"><pre> -// Objective-C -void test(id x) { - return; - [x retain]; // warn -} -</pre></div></div></td></tr> -</tbody></table> - -<!-- =========================== llvm alpha =========================== --> -<h3 id="llvm_alpha_checkers">LLVM Checkers</h3> -<table class="checkers"> -<colgroup><col class="namedescr"><col class="example"></colgroup> -<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> - -<tbody> -<tr><td><a id="alpha.llvm.Conventions"><div class="namedescr expandable"><span class="name"> -alpha.llvm.Conventions</span><span class="lang"> -(C)</span><div class="descr"> -Check code for LLVM codebase conventions: -<ul> - <li>A <code>StringRef</code> should not be bound to a temporary std::string - whose lifetime is shorter than the <code>StringRef</code>'s.</li> - <li>Clang AST nodes should not have fields that can allocate memory.</li> -</ul> -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -<!-- TODO: Add examples, as currently it's hard to get this checker working. --> -</pre></div></div></td></tr> - -</tbody></table> - - -<!-- ============================== OS X alpha ============================== --> -<h3 id="osx_alpha_checkers">OS X Alpha Checkers</h3> -<table class="checkers"> -<colgroup><col class="namedescr"><col class="example"></colgroup> -<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> - -<tbody> -<tr><td><a id="alpha.osx.cocoa.DirectIvarAssignment"><div class="namedescr expandable"><span class="name"> -alpha.osx.cocoa.DirectIvarAssignment</span><span class="lang"> -(ObjC)</span><div class="descr"> -Check that Objective C properties follow the following rule: the property -should be set with the setter, not though a direct assignment.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -@interface MyClass : NSObject {} -@property (readonly) id A; -- (void) foo; -@end - -@implementation MyClass -- (void) foo { - _A = 0; // warn -} -@end -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions"><div class="namedescr expandable"><span class="name"> -alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions</span><span class="lang"> -(ObjC)</span><div class="descr"> -Check for direct assignments to instance variables in the methods annotated -with <code>objc_no_direct_instance_variable_assignment</code>.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -@interface MyClass : NSObject {} -@property (readonly) id A; -- (void) fAnnotated __attribute__(( - annotate("objc_no_direct_instance_variable_assignment"))); -- (void) fNotAnnotated; -@end - -@implementation MyClass -- (void) fAnnotated { - _A = 0; // warn -} -- (void) fNotAnnotated { - _A = 0; // no warn -} -@end -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.osx.cocoa.InstanceVariableInvalidation"><div class="namedescr expandable"><span class="name"> -alpha.osx.cocoa.InstanceVariableInvalidation</span><span class="lang"> -(ObjC)</span><div class="descr"> -Check that the invalidatable instance variables are invalidated in the methods -annotated with <code>objc_instance_variable_invalidator</code>.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -@protocol Invalidation <NSObject> -- (void) invalidate - __attribute__((annotate("objc_instance_variable_invalidator"))); -@end - -@interface InvalidationImpObj : NSObject <Invalidation> -@end - -@interface SubclassInvalidationImpObj : InvalidationImpObj { - InvalidationImpObj *var; -} -- (void)invalidate; -@end - -@implementation SubclassInvalidationImpObj -- (void) invalidate {} -@end -// warn: var needs to be invalidated or set to nil -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.osx.cocoa.MissingInvalidationMethod"><div class="namedescr expandable"><span class="name"> -alpha.osx.cocoa.MissingInvalidationMethod</span><span class="lang"> -(ObjC)</span><div class="descr"> -Check that the invalidation methods are present in classes that contain -invalidatable instance variables.</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -@protocol Invalidation <NSObject> -- (void)invalidate - __attribute__((annotate("objc_instance_variable_invalidator"))); -@end - -@interface NeedInvalidation : NSObject <Invalidation> -@end - -@interface MissingInvalidationMethodDecl : NSObject { - NeedInvalidation *Var; // warn -} -@end - -@implementation MissingInvalidationMethodDecl -@end -</pre></div></div></td></tr> - - -<tr><td><a id="alpha.osx.cocoa.localizability.PluralMisuseChecker"><div class="namedescr expandable"><span class="name"> -alpha.osx.cocoa.localizability.PluralMisuseChecker</span><span class="lang"> -(ObjC)</span><div class="descr"> -Warns against using one vs. many plural pattern in code -when generating localized strings. -</div></div></a></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -NSString *reminderText = - NSLocalizedString(@"None", @"Indicates no reminders"); -if (reminderCount == 1) { - // Warning: Plural cases are not supported across all languages. - // Use a .stringsdict file instead - reminderText = - NSLocalizedString(@"1 Reminder", @"Indicates single reminder"); -} else if (reminderCount >= 2) { - // Warning: Plural cases are not supported across all languages. - // Use a .stringsdict file instead - reminderText = - [NSString stringWithFormat: - NSLocalizedString(@"%@ Reminders", @"Indicates multiple reminders"), - reminderC... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/97032 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits