Enable cppcoreguidelines-special-member-functions checks
Part of enforcing cpp core guidelines involves explicitly including all
constructors required on a non-trivial class. We were missing quite a
few. In all cases, the copy/move/and operator= methods are simply
deleted.
Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: Ie8d6e8bf2bc311fa21a9ae48b0d61ee5c1940999
diff --git a/.clang-tidy b/.clang-tidy
index 6f3c69d..8a14cfa 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -202,6 +202,7 @@
clang-analyzer-webkit.NoUncountedMemberChecker,
clang-analyzer-webkit.RefCntblBaseVirtualDtor,
cppcoreguidelines-init-variables,
+cppcoreguidelines-special-member-functions,
misc-misplaced-const,
#misc-no-recursion,
misc-redundant-expression,
diff --git a/http/app.hpp b/http/app.hpp
index b4ccd95..8dcec48 100644
--- a/http/app.hpp
+++ b/http/app.hpp
@@ -44,6 +44,11 @@
this->stop();
}
+ App(const App&) = delete;
+ App(App&&) = delete;
+ App& operator=(const App&) = delete;
+ App& operator=(const App&&) = delete;
+
template <typename Adaptor>
void handleUpgrade(const Request& req, Response& res, Adaptor&& adaptor)
{
diff --git a/http/http_connection.hpp b/http/http_connection.hpp
index 6de2bf7..77886c5 100644
--- a/http/http_connection.hpp
+++ b/http/http_connection.hpp
@@ -81,6 +81,11 @@
<< connectionCount;
}
+ Connection(const Connection&) = delete;
+ Connection(Connection&&) = delete;
+ Connection& operator=(const Connection&) = delete;
+ Connection& operator=(Connection&&) = delete;
+
void prepareMutualTls()
{
std::error_code error;
diff --git a/http/http_request.hpp b/http/http_request.hpp
index 4567314..be1c2a2 100644
--- a/http/http_request.hpp
+++ b/http/http_request.hpp
@@ -46,7 +46,10 @@
}
Request(const Request&) = delete;
+ Request(const Request&&) = delete;
Request& operator=(const Request&) = delete;
+ Request& operator=(const Request&&) = delete;
+ ~Request() = default;
boost::beast::http::verb method() const
{
diff --git a/http/http_response.hpp b/http/http_response.hpp
index a983d4a..08b76f2 100644
--- a/http/http_response.hpp
+++ b/http/http_response.hpp
@@ -39,6 +39,10 @@
Response() : stringResponse(response_type{})
{}
+ ~Response() = default;
+
+ Response(const Response&) = delete;
+ Response(Response&&) = delete;
Response& operator=(const Response& r) = delete;
Response& operator=(Response&& r) noexcept
diff --git a/http/logging.hpp b/http/logging.hpp
index 0121729..e2bfdb1 100644
--- a/http/logging.hpp
+++ b/http/logging.hpp
@@ -62,6 +62,11 @@
}
}
+ Logger(const Logger&) = delete;
+ Logger(Logger&&) = delete;
+ Logger& operator=(const Logger&) = delete;
+ Logger& operator=(const Logger&&) = delete;
+
//
template <typename T>
Logger& operator<<([[maybe_unused]] T const& value)
diff --git a/http/routing.hpp b/http/routing.hpp
index 06f2a09..a7c0ced 100644
--- a/http/routing.hpp
+++ b/http/routing.hpp
@@ -34,6 +34,11 @@
virtual ~BaseRule() = default;
+ BaseRule(const BaseRule&) = delete;
+ BaseRule(BaseRule&&) = delete;
+ BaseRule& operator=(const BaseRule&) = delete;
+ BaseRule& operator=(const BaseRule&&) = delete;
+
virtual void validate() = 0;
std::unique_ptr<BaseRule> upgrade()
{
diff --git a/http/websocket.hpp b/http/websocket.hpp
index 30a9b9f..74bce58 100644
--- a/http/websocket.hpp
+++ b/http/websocket.hpp
@@ -29,6 +29,11 @@
req(reqIn.req), userName{std::move(user)}, userdataPtr(nullptr)
{}
+ Connection(const Connection&) = delete;
+ Connection(Connection&&) = delete;
+ Connection& operator=(const Connection&) = delete;
+ Connection& operator=(const Connection&&) = delete;
+
virtual void sendBinary(const std::string_view msg) = 0;
virtual void sendBinary(std::string&& msg) = 0;
virtual void sendText(const std::string_view msg) = 0;
diff --git a/include/async_resolve.hpp b/include/async_resolve.hpp
index 563d816..c69fd87 100644
--- a/include/async_resolve.hpp
+++ b/include/async_resolve.hpp
@@ -20,6 +20,11 @@
~Resolver() = default;
+ Resolver(const Resolver&) = delete;
+ Resolver(Resolver&&) = delete;
+ Resolver& operator=(const Resolver&) = delete;
+ Resolver& operator=(Resolver&&) = delete;
+
template <typename ResolveHandler>
void asyncResolve(const std::string& host, const std::string& port,
ResolveHandler&& handler)
diff --git a/include/async_resp.hpp b/include/async_resp.hpp
index 8e9584c..607d168 100644
--- a/include/async_resp.hpp
+++ b/include/async_resp.hpp
@@ -24,6 +24,8 @@
AsyncResp(const AsyncResp&) = delete;
AsyncResp(AsyncResp&&) = delete;
+ AsyncResp& operator=(const AsyncResp&) = delete;
+ AsyncResp& operator=(AsyncResp&&) = delete;
~AsyncResp()
{
diff --git a/include/ibm/locks.hpp b/include/ibm/locks.hpp
index fb8b396..8e04b84 100644
--- a/include/ibm/locks.hpp
+++ b/include/ibm/locks.hpp
@@ -128,6 +128,14 @@
public:
/*
+ * Explicitly deleted copy and move constructors
+ */
+ Lock(const Lock&) = delete;
+ Lock(Lock&&) = delete;
+ Lock& operator=(const Lock&) = delete;
+ Lock& operator=(Lock&&) = delete;
+
+ /*
* This function implements the logic for acquiring a lock on a
* resource if the incoming request is legitimate without any
* conflicting requirements & without any conflicting requirement
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 0b54c65..abcec1a 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -238,6 +238,11 @@
}
}
+ InProgressEnumerateData(const InProgressEnumerateData&) = delete;
+ InProgressEnumerateData(InProgressEnumerateData&&) = delete;
+ InProgressEnumerateData& operator=(const InProgressEnumerateData&) = delete;
+ InProgressEnumerateData& operator=(InProgressEnumerateData&&) = delete;
+
const std::string objectPath;
std::shared_ptr<GetSubTreeType> subtree;
std::shared_ptr<bmcweb::AsyncResp> asyncResp;
@@ -484,6 +489,10 @@
res.end();
}
+ InProgressActionData(const InProgressActionData&) = delete;
+ InProgressActionData(InProgressActionData&&) = delete;
+ InProgressActionData& operator=(const InProgressActionData&) = delete;
+ InProgressActionData& operator=(InProgressActionData&&) = delete;
void setErrorStatus(const std::string& desc)
{
@@ -1805,6 +1814,11 @@
}
}
+ AsyncPutRequest(const AsyncPutRequest&) = delete;
+ AsyncPutRequest(AsyncPutRequest&&) = delete;
+ AsyncPutRequest& operator=(const AsyncPutRequest&) = delete;
+ AsyncPutRequest& operator=(AsyncPutRequest&&) = delete;
+
void setErrorStatus(const std::string& desc)
{
setErrorResponse(asyncResp->res,
diff --git a/include/persistent_data.hpp b/include/persistent_data.hpp
index d7230cb..47bb8a9 100644
--- a/include/persistent_data.hpp
+++ b/include/persistent_data.hpp
@@ -43,6 +43,11 @@
}
}
+ ConfigFile(const ConfigFile&) = delete;
+ ConfigFile(ConfigFile&&) = delete;
+ ConfigFile& operator=(const ConfigFile&) = delete;
+ ConfigFile& operator=(ConfigFile&&) = delete;
+
// TODO(ed) this should really use protobuf, or some other serialization
// library, but adding another dependency is somewhat outside the scope of
// this application for the moment
diff --git a/include/sessions.hpp b/include/sessions.hpp
index a05e47b..79e71ce 100644
--- a/include/sessions.hpp
+++ b/include/sessions.hpp
@@ -404,6 +404,9 @@
SessionStore(const SessionStore&) = delete;
SessionStore& operator=(const SessionStore&) = delete;
+ SessionStore(SessionStore&&) = delete;
+ SessionStore& operator=(const SessionStore&&) = delete;
+ ~SessionStore() = default;
std::unordered_map<std::string, std::shared_ptr<UserSession>,
std::hash<std::string>,
diff --git a/include/vm_websocket.hpp b/include/vm_websocket.hpp
index 34ef82e..2a0353b 100644
--- a/include/vm_websocket.hpp
+++ b/include/vm_websocket.hpp
@@ -32,6 +32,11 @@
~Handler() = default;
+ Handler(const Handler&) = delete;
+ Handler(Handler&&) = delete;
+ Handler& operator=(const Handler&) = delete;
+ Handler& operator=(Handler&&) = delete;
+
void doClose()
{
// boost::process::child::terminate uses SIGKILL, need to send SIGTERM
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 642a302..7cb5cc7 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -588,6 +588,7 @@
EventServiceManager& operator=(const EventServiceManager&) = delete;
EventServiceManager(EventServiceManager&&) = delete;
EventServiceManager& operator=(EventServiceManager&&) = delete;
+ ~EventServiceManager() = default;
static EventServiceManager& getInstance()
{
diff --git a/redfish-core/include/gzfile.hpp b/redfish-core/include/gzfile.hpp
index 118bdb4..2001756 100644
--- a/redfish-core/include/gzfile.hpp
+++ b/redfish-core/include/gzfile.hpp
@@ -207,4 +207,6 @@
~GzFileReader() = default;
GzFileReader(const GzFileReader&) = delete;
GzFileReader& operator=(const GzFileReader&) = delete;
+ GzFileReader(GzFileReader&&) = delete;
+ GzFileReader& operator=(GzFileReader&&) = delete;
};
diff --git a/redfish-core/include/rf_async_resp.hpp b/redfish-core/include/rf_async_resp.hpp
index b6dacc7..5eb7a3f 100644
--- a/redfish-core/include/rf_async_resp.hpp
+++ b/redfish-core/include/rf_async_resp.hpp
@@ -17,6 +17,8 @@
AsyncResp(const AsyncResp&) = delete;
AsyncResp(AsyncResp&&) = delete;
+ AsyncResp& operator=(const AsyncResp&) = delete;
+ AsyncResp& operator=(AsyncResp&&) = delete;
~AsyncResp()
{
diff --git a/redfish-core/lib/health.hpp b/redfish-core/lib/health.hpp
index 02edfdc..c2e40c7 100644
--- a/redfish-core/lib/health.hpp
+++ b/redfish-core/lib/health.hpp
@@ -40,6 +40,11 @@
jsonStatus(status)
{}
+ HealthPopulate(const HealthPopulate&) = delete;
+ HealthPopulate(HealthPopulate&&) = delete;
+ HealthPopulate& operator=(const HealthPopulate&) = delete;
+ HealthPopulate& operator=(const HealthPopulate&&) = delete;
+
~HealthPopulate()
{
nlohmann::json& health = jsonStatus["Health"];
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index ad5c5e3..201f2f4 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -1317,6 +1317,11 @@
}
}
+ GetPIDValues(const GetPIDValues&) = delete;
+ GetPIDValues(GetPIDValues&&) = delete;
+ GetPIDValues& operator=(const GetPIDValues&) = delete;
+ GetPIDValues& operator=(GetPIDValues&&) = delete;
+
std::vector<std::string> supportedProfiles;
std::string currentProfile;
crow::openbmc_mapper::GetSubTreeType subtree;
@@ -1353,6 +1358,12 @@
configuration.emplace_back("StepwiseControllers",
std::move(stepwiseControllers));
}
+
+ SetPIDValues(const SetPIDValues&) = delete;
+ SetPIDValues(SetPIDValues&&) = delete;
+ SetPIDValues& operator=(const SetPIDValues&) = delete;
+ SetPIDValues& operator=(SetPIDValues&&) = delete;
+
void run()
{
if (asyncResp->res.result() != boost::beast::http::status::ok)
diff --git a/redfish-core/lib/metric_report_definition.hpp b/redfish-core/lib/metric_report_definition.hpp
index 1461fd8..745fad8 100644
--- a/redfish-core/lib/metric_report_definition.hpp
+++ b/redfish-core/lib/metric_report_definition.hpp
@@ -335,6 +335,11 @@
args.interval, readingParams);
}
+ AddReport(const AddReport&) = delete;
+ AddReport(AddReport&&) = delete;
+ AddReport& operator=(const AddReport&) = delete;
+ AddReport& operator=(AddReport&&) = delete;
+
void insert(const boost::container::flat_map<std::string, std::string>& el)
{
uriToDbus.insert(el.begin(), el.end());
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 99dfc81..52d1fc0 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -227,6 +227,11 @@
}
}
+ SensorsAsyncResp(const SensorsAsyncResp&) = delete;
+ SensorsAsyncResp(SensorsAsyncResp&&) = delete;
+ SensorsAsyncResp& operator=(const SensorsAsyncResp&) = delete;
+ SensorsAsyncResp& operator=(SensorsAsyncResp&&) = delete;
+
void addMetadata(const nlohmann::json& sensorObject,
const std::string& valueKey, const std::string& dbusPath)
{
diff --git a/redfish-core/lib/virtual_media.hpp b/redfish-core/lib/virtual_media.hpp
index a682486..00c3ecf 100644
--- a/redfish-core/lib/virtual_media.hpp
+++ b/redfish-core/lib/virtual_media.hpp
@@ -531,6 +531,8 @@
Credentials() = delete;
Credentials(const Credentials&) = delete;
Credentials& operator=(const Credentials&) = delete;
+ Credentials(Credentials&&) = delete;
+ Credentials& operator=(Credentials&&) = delete;
private:
std::string userBuf;
@@ -606,6 +608,11 @@
impl.close();
}
+ Pipe(const Pipe&) = delete;
+ Pipe(Pipe&&) = delete;
+ Pipe& operator=(const Pipe&) = delete;
+ Pipe& operator=(Pipe&&) = delete;
+
unix_fd fd()
{
return unix_fd{impl.native_source()};
diff --git a/redfish-core/ut/lock_test.cpp b/redfish-core/ut/lock_test.cpp
index 603422a..e89377d 100644
--- a/redfish-core/ut/lock_test.cpp
+++ b/redfish-core/ut/lock_test.cpp
@@ -58,6 +58,11 @@
}
~LockTest() override = default;
+
+ LockTest(const LockTest&) = delete;
+ LockTest(LockTest&&) = delete;
+ LockTest& operator=(const LockTest&) = delete;
+ LockTest& operator=(const LockTest&&) = delete;
};
class MockLock : public crow::ibm_mc_lock::Lock