From 8a7992c6aca9e95ede7108061737e2bd5aef4524 Mon Sep 17 00:00:00 2001
From: chrchr-github <78114321+chrchr-github@users.noreply.github.com>
Date: Thu, 3 Mar 2022 09:41:26 +0100
Subject: [PATCH] Suppress operatorEqVarError for known non-copyable types
(#3869)
* Fix FP operatorEqVarError with class hierarchy
* Suppress operatorEqVarError for std::mutex
* Add test, non-copyable Qt types
* Update cppcheck-cfg.rng
---
cfg/cppcheck-cfg.rng | 12 ++++++++++++
cfg/qt.cfg | 6 ++++++
cfg/std.cfg | 4 ++++
lib/checkclass.cpp | 2 +-
test/testconstructors.cpp | 11 +++++++++++
5 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/cfg/cppcheck-cfg.rng b/cfg/cppcheck-cfg.rng
index 84ac7040d..432c84fee 100644
--- a/cfg/cppcheck-cfg.rng
+++ b/cfg/cppcheck-cfg.rng
@@ -534,6 +534,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cfg/qt.cfg b/cfg/qt.cfg
index 2362b7f3b..f944411a1 100644
--- a/cfg/qt.cfg
+++ b/cfg/qt.cfg
@@ -5109,6 +5109,12 @@
QApplication
QMutexLocker
+
+ QMutex
+ QRecursiveMutex
+ QSemaphore
+ QReadWriteLock
+
diff --git a/cfg/std.cfg b/cfg/std.cfg
index c1d2471d5..9f800dba1 100644
--- a/cfg/std.cfg
+++ b/cfg/std.cfg
@@ -8390,6 +8390,10 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
std::basic_ofstream
std::pair
+
+ std::mutex
+ std::recursive_mutex
+
diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp
index e72b80b1e..ff4f87252 100644
--- a/lib/checkclass.cpp
+++ b/lib/checkclass.cpp
@@ -275,7 +275,7 @@ void CheckClass::constructors()
}
}
- if (classNameUsed)
+ if (classNameUsed && mSettings->library.getTypeCheck("operatorEqVarError", var.getTypeName()) != Library::TypeCheck::suppress)
operatorEqVarError(func.token, scope->className, var.name(), missingCopy);
} else if (func.access != AccessControl::Private || mSettings->standards.cpp >= Standards::CPP11) {
// If constructor is not in scope then we maybe using a constructor from a different template specialization
diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp
index 7104bdbc6..0dcf7b4d0 100644
--- a/test/testconstructors.cpp
+++ b/test/testconstructors.cpp
@@ -1854,6 +1854,17 @@ private:
"void Fred::operator=(const Fred &f)\n"
"{ }", true);
ASSERT_EQUALS("[test.cpp:13]: (warning, inconclusive) Member variable 'Fred::ints' is not assigned a value in 'Fred::operator='.\n", errout.str());
+
+ Settings s;
+ s.certainty.setEnabled(Certainty::inconclusive, true);
+ s.severity.enable(Severity::style);
+ s.severity.enable(Severity::warning);
+ LOAD_LIB_2(s.library, "std.cfg");
+ check("struct S {\n"
+ " S& operator=(const S& s) { return *this; }\n"
+ " std::mutex m;\n"
+ "};\n", s);
+ ASSERT_EQUALS("", errout.str());
}
void uninitVar1() {