Skip to content

[clang][analyzer] Improve documentation of checker 'cplusplus.Move' (NFC) #96295

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 39 additions & 4 deletions clang/docs/analyzer/checkers.rst
Original file line number Diff line number Diff line change
Expand Up @@ -420,21 +420,56 @@ 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``.

Calls 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++)
Expand Down
21 changes: 5 additions & 16 deletions clang/include/clang/StaticAnalyzer/Checkers/Checkers.td
Original file line number Diff line number Diff line change
Expand Up @@ -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>
]>,
Expand Down
22 changes: 1 addition & 21 deletions clang/test/Analysis/analyzer-checker-option-help.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,7 @@
// CHECK-STABLE: OPTIONS:
//
// CHECK-STABLE: cplusplus.Move:WarnOn
// CHECK-STABLE-SAME: (string) In non-aggressive mode, only warn
// CHECK-STABLLE: on use-after-move of local variables (or
// CHECK-STABLLE: local rvalue references) and of STL objects.
// CHECK-STABLLE: The former is possible because local variables
// CHECK-STABLLE: (or local rvalue references) are not tempting
// CHECK-STABLLE: their user to re-use the storage. The latter
// CHECK-STABLLE: is possible because STL objects are known
// CHECK-STABLLE: to end up in a valid but unspecified state
// CHECK-STABLLE: after the move and their state-reset methods
// CHECK-STABLLE: are also known, which allows us to predict
// CHECK-STABLLE: precisely when use-after-move is invalid.
// CHECK-STABLLE: Some STL objects are known to conform to
// CHECK-STABLLE: additional contracts after move, so they
// CHECK-STABLLE: are not tracked. However, smart pointers
// CHECK-STABLLE: specifically are tracked because we can
// CHECK-STABLLE: perform extra checking over them. In aggressive
// CHECK-STABLLE: mode, warn on any use-after-move because
// CHECK-STABLLE: the user has intentionally asked us to completely
// CHECK-STABLLE: eliminate use-after-move in his code. Values:
// CHECK-STABLLE: "KnownsOnly", "KnownsAndLocals", "All".
// CHECK-STABLLE: (default: KnownsAndLocals)
// CHECK-STABLE-SAME: (string) With setting "KnownsOnly" warn

// CHECK-STABLE-NOT: debug.AnalysisOrder:*
// CHECK-DEVELOPER: debug.AnalysisOrder:*
Expand Down
Loading