From d3d7e1da3de1216e4e9a7ef56cabe5ddb781b4cc Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 23 Apr 2024 22:28:53 +0200 Subject: [PATCH 1/4] added `accessMoved` sample --- samples/accessMoved/bad.cpp | 9 +++++++++ samples/accessMoved/good.cpp | 9 +++++++++ samples/accessMoved/out.txt | 9 +++++++++ 3 files changed, 27 insertions(+) create mode 100644 samples/accessMoved/bad.cpp create mode 100644 samples/accessMoved/good.cpp create mode 100644 samples/accessMoved/out.txt diff --git a/samples/accessMoved/bad.cpp b/samples/accessMoved/bad.cpp new file mode 100644 index 00000000000..bab99668ea8 --- /dev/null +++ b/samples/accessMoved/bad.cpp @@ -0,0 +1,9 @@ +void foo(std::string); + +int main() +{ + std::string s = "test"; + foo(std::move(s)); + + std::cout << s << std::endl; +} diff --git a/samples/accessMoved/good.cpp b/samples/accessMoved/good.cpp new file mode 100644 index 00000000000..1dbc465db13 --- /dev/null +++ b/samples/accessMoved/good.cpp @@ -0,0 +1,9 @@ +void foo(std::string); + +int main() +{ + std::string s = "test"; + foo(s); + + std::cout << s << std::endl; +} diff --git a/samples/accessMoved/out.txt b/samples/accessMoved/out.txt new file mode 100644 index 00000000000..1f04563d6da --- /dev/null +++ b/samples/accessMoved/out.txt @@ -0,0 +1,9 @@ +samples\accessMoved\bad.cpp:8:18: warning: Access of moved variable 's'. [accessMoved] + std::cout << s << std::endl; + ^ +samples\accessMoved\bad.cpp:6:9: note: Calling std::move(s) + foo(std::move(s)); + ^ +samples\accessMoved\bad.cpp:8:18: note: Access of moved variable 's'. + std::cout << s << std::endl; + ^ From c9bdd308b36f0d0db240baec4692abaad8023d16 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 23 Apr 2024 22:35:39 +0200 Subject: [PATCH 2/4] added `unreadVariable` sample --- samples/unreadVariable/bad.cpp | 7 +++++++ samples/unreadVariable/good.cpp | 7 +++++++ samples/unreadVariable/out.txt | 3 +++ 3 files changed, 17 insertions(+) create mode 100644 samples/unreadVariable/bad.cpp create mode 100644 samples/unreadVariable/good.cpp create mode 100644 samples/unreadVariable/out.txt diff --git a/samples/unreadVariable/bad.cpp b/samples/unreadVariable/bad.cpp new file mode 100644 index 00000000000..456304ad64a --- /dev/null +++ b/samples/unreadVariable/bad.cpp @@ -0,0 +1,7 @@ +void foo(const std::string&, const std::string&); + +int main() +{ + std::string s1 = "test1", s2 = "test2"; + foo(s1, s1); +} diff --git a/samples/unreadVariable/good.cpp b/samples/unreadVariable/good.cpp new file mode 100644 index 00000000000..0b9871d8a33 --- /dev/null +++ b/samples/unreadVariable/good.cpp @@ -0,0 +1,7 @@ +void foo(const std::string&, const std::string&); + +int main() +{ + std::string s1 = "test1", s2 = "test2"; + foo(s1, s2); +} diff --git a/samples/unreadVariable/out.txt b/samples/unreadVariable/out.txt new file mode 100644 index 00000000000..1797e13dbbe --- /dev/null +++ b/samples/unreadVariable/out.txt @@ -0,0 +1,3 @@ +samples\unreadVariable\bad.cpp:5:34: style: Variable 's2' is assigned a value that is never used. [unreadVariable] + std::string s1 = "test1", s2 = "test2"; + ^ From 5b81f941201f425d0d518757ac761ef3b562be85 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 23 Apr 2024 22:46:10 +0200 Subject: [PATCH 3/4] added `passedByValue` samples --- samples/passedByValue_1/bad.cpp | 11 +++++++++++ samples/passedByValue_1/good.cpp | 11 +++++++++++ samples/passedByValue_1/out.txt | 3 +++ samples/passedByValue_2/bad.cpp | 10 ++++++++++ samples/passedByValue_2/good.cpp | 10 ++++++++++ samples/passedByValue_2/out.txt | 3 +++ 6 files changed, 48 insertions(+) create mode 100644 samples/passedByValue_1/bad.cpp create mode 100644 samples/passedByValue_1/good.cpp create mode 100644 samples/passedByValue_1/out.txt create mode 100644 samples/passedByValue_2/bad.cpp create mode 100644 samples/passedByValue_2/good.cpp create mode 100644 samples/passedByValue_2/out.txt diff --git a/samples/passedByValue_1/bad.cpp b/samples/passedByValue_1/bad.cpp new file mode 100644 index 00000000000..413b4327a74 --- /dev/null +++ b/samples/passedByValue_1/bad.cpp @@ -0,0 +1,11 @@ +class C +{ +public: + explicit C(std::string s) + : _s(s) + { + } + void foo(); +private: + std::string _s; +}; \ No newline at end of file diff --git a/samples/passedByValue_1/good.cpp b/samples/passedByValue_1/good.cpp new file mode 100644 index 00000000000..fd1f1450d17 --- /dev/null +++ b/samples/passedByValue_1/good.cpp @@ -0,0 +1,11 @@ +class C +{ +public: + explicit C(std::string s) + : _s(std::move(s)) + { + } + void foo(); +private: + std::string _s; +}; \ No newline at end of file diff --git a/samples/passedByValue_1/out.txt b/samples/passedByValue_1/out.txt new file mode 100644 index 00000000000..07228031d62 --- /dev/null +++ b/samples/passedByValue_1/out.txt @@ -0,0 +1,3 @@ +samples\passedByValue_1\bad.cpp:4:28: performance: Function parameter 's' should be passed by const reference. [passedByValue] + explicit C(std::string s) + ^ diff --git a/samples/passedByValue_2/bad.cpp b/samples/passedByValue_2/bad.cpp new file mode 100644 index 00000000000..29da7fe9036 --- /dev/null +++ b/samples/passedByValue_2/bad.cpp @@ -0,0 +1,10 @@ +bool foo(std::string s) +{ + return s.empty(); +} + +int main() +{ + std::string s; + foo(s); +} diff --git a/samples/passedByValue_2/good.cpp b/samples/passedByValue_2/good.cpp new file mode 100644 index 00000000000..bd3a941a45b --- /dev/null +++ b/samples/passedByValue_2/good.cpp @@ -0,0 +1,10 @@ +bool foo(const std::string& s) +{ + return s.empty(); +} + +int main() +{ + std::string s; + foo(s); +} diff --git a/samples/passedByValue_2/out.txt b/samples/passedByValue_2/out.txt new file mode 100644 index 00000000000..af76b252ad1 --- /dev/null +++ b/samples/passedByValue_2/out.txt @@ -0,0 +1,3 @@ +samples\passedByValue_2\bad.cpp:1:22: performance: Function parameter 's' should be passed by const reference. [passedByValue] +bool foo(std::string s) + ^ From 68e9feb0c2af3e36a99febd88b5e888fdde69323 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 12 Aug 2024 17:27:03 +0200 Subject: [PATCH 4/4] added `multiCondition` sample --- samples/multiCondition/bad.c | 11 +++++++++++ samples/multiCondition/good.c | 11 +++++++++++ samples/multiCondition/out.txt | 9 +++++++++ 3 files changed, 31 insertions(+) create mode 100644 samples/multiCondition/bad.c create mode 100644 samples/multiCondition/good.c create mode 100644 samples/multiCondition/out.txt diff --git a/samples/multiCondition/bad.c b/samples/multiCondition/bad.c new file mode 100644 index 00000000000..dd352a189bf --- /dev/null +++ b/samples/multiCondition/bad.c @@ -0,0 +1,11 @@ +static void f(bool b) +{ + if (b) {} + else if (!b) {} +} + +int main() +{ + f(true); + return 0; +} diff --git a/samples/multiCondition/good.c b/samples/multiCondition/good.c new file mode 100644 index 00000000000..715844f85ca --- /dev/null +++ b/samples/multiCondition/good.c @@ -0,0 +1,11 @@ +static void f(bool b) +{ + if (b) {} + else {} +} + +int main() +{ + f(true); + return 0; +} \ No newline at end of file diff --git a/samples/multiCondition/out.txt b/samples/multiCondition/out.txt new file mode 100644 index 00000000000..8753c103594 --- /dev/null +++ b/samples/multiCondition/out.txt @@ -0,0 +1,9 @@ +samples\multiCondition\bad.c:4:14: style: Expression is always true because 'else if' condition is opposite to previous condition at line 3. [multiCondition] + else if (!b) {} + ^ +samples\multiCondition\bad.c:3:9: note: first condition + if (b) {} + ^ +samples\multiCondition\bad.c:4:14: note: else if condition is opposite to first condition + else if (!b) {} + ^