[clang] [clang][analyzer] Improve documentation of checker 'cplusplus.Move' (NFC) (PR #96295)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 21 03:17:10 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Balázs Kéri (balazske)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/96295.diff
2 Files Affected:
- (modified) clang/docs/analyzer/checkers.rst (+35-4)
- (modified) clang/include/clang/StaticAnalyzer/Checkers/Checkers.td (+5-16)
``````````diff
diff --git a/clang/docs/analyzer/checkers.rst b/clang/docs/analyzer/checkers.rst
index b8d5f372bdf61..445f434e1e6ce 100644
--- a/clang/docs/analyzer/checkers.rst
+++ b/clang/docs/analyzer/checkers.rst
@@ -420,21 +420,52 @@ around, such as ``std::string_view``.
cplusplus.Move (C++)
""""""""""""""""""""
-Method calls on a moved-from object and copying a moved-from object will be reported.
-
+Find use-after-move bugs in C++. This includes method calls on moved-from
+objects, assignment of a moved-from object, and repeated move of a moved-from
+object.
.. code-block:: cpp
- struct A {
+ struct A {
void foo() {}
};
- void f() {
+ void f1() {
A a;
A b = std::move(a); // note: 'a' became 'moved-from' here
a.foo(); // warn: method call on a 'moved-from' object 'a'
}
+ void f2() {
+ A a;
+ A b = std::move(a);
+ A c(std::move(a)); // warn: move of an already moved-from object
+ }
+
+ void f3() {
+ A a;
+ A b = std::move(a);
+ b = a; // warn: copy of moved-from object
+ }
+
+The checker option ``WarnOn`` controls on what objects the use-after-move is
+checked. The most strict value is ``KnownsOnly``, in this mode only objects are
+checked whose type is known to be move-unsafe. These include most STL objects
+(but excluding move-safe ones) and smart pointers. With option value
+``KnownsAndLocals`` local variables (of any type) are additionally checked. The
+idea behind this is that local variables are usually not tempting to be re-used
+so an use after move is more likely a bug than with member variables. With
+option value ``All`` any use-after move condition is checked on all kinds of
+variables, excluding global variables and known move-safe cases. Default value
+is ``KnownsAndLocals``.
+
+Call of methods named ``empty()`` or ``isEmpty()`` are allowed on moved-from
+objects because these methods are considered as move-safe. Functions called
+``reset()``, ``destroy()``, ``clear()``, ``assign``, ``resize``, ``shrink`` are
+treated as state-reset functions and are allowed on moved-from objects, these
+make the object valid again. This applies to any type of object (not only STL
+ones).
+
.. _cplusplus-NewDelete:
cplusplus.NewDelete (C++)
diff --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
index 429c334a0b24b..6e224a4e098ad 100644
--- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
+++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
@@ -686,22 +686,11 @@ def MoveChecker: Checker<"Move">,
CheckerOptions<[
CmdLineOption<String,
"WarnOn",
- "In non-aggressive mode, only warn on use-after-move of "
- "local variables (or local rvalue references) and of STL "
- "objects. The former is possible because local variables (or "
- "local rvalue references) are not tempting their user to "
- "re-use the storage. The latter is possible because STL "
- "objects are known to end up in a valid but unspecified "
- "state after the move and their state-reset methods are also "
- "known, which allows us to predict precisely when "
- "use-after-move is invalid. Some STL objects are known to "
- "conform to additional contracts after move, so they are not "
- "tracked. However, smart pointers specifically are tracked "
- "because we can perform extra checking over them. In "
- "aggressive mode, warn on any use-after-move because the "
- "user has intentionally asked us to completely eliminate "
- "use-after-move in his code. Values: \"KnownsOnly\", "
- "\"KnownsAndLocals\", \"All\".",
+ "With setting \"KnownsOnly\" warn only on objects with known "
+ "move semantics like smart pointers and other STL objects. "
+ "With setting \"KnownsAndLocals\" warn additionally on local "
+ "variables (or rvalue references). With setting \"All\" warn "
+ "on all variables (excluding global variables).",
"KnownsAndLocals",
Released>
]>,
``````````
</details>
https://github.com/llvm/llvm-project/pull/96295
More information about the cfe-commits
mailing list