diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 55485c6..051e495 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -95,7 +95,7 @@
     std::span<const MessageEntry>::iterator messageIt =
         std::find_if(registry.begin(), registry.end(),
                      [&messageKey](const MessageEntry& messageEntry) {
-                         return !messageKey.compare(messageEntry.first);
+                         return messageKey.compare(messageEntry.first) == 0;
                      });
     if (messageIt != registry.end())
     {
@@ -708,7 +708,7 @@
                     std::string id;
 
                     int retry = 3;
-                    while (retry)
+                    while (retry != 0)
                     {
                         id = std::to_string(dist(gen));
                         if (gen.error())
@@ -764,7 +764,7 @@
         if (serviceEnabled != cfg.enabled)
         {
             serviceEnabled = cfg.enabled;
-            if (serviceEnabled && noOfMetricReportSubscribers)
+            if (serviceEnabled && noOfMetricReportSubscribers != 0U)
             {
                 registerMetricReportSignal();
             }
@@ -827,7 +827,7 @@
         if (noOfMetricReportSubscribers != metricReportSubCount)
         {
             noOfMetricReportSubscribers = metricReportSubCount;
-            if (noOfMetricReportSubscribers)
+            if (noOfMetricReportSubscribers != 0U)
             {
                 registerMetricReportSignal();
             }
@@ -860,7 +860,7 @@
         std::string id;
 
         int retry = 3;
-        while (retry)
+        while (retry != 0)
         {
             id = std::to_string(dist(gen));
             if (gen.error())
@@ -989,7 +989,7 @@
     void sendEvent(const nlohmann::json& eventMessageIn,
                    const std::string& origin, const std::string& resType)
     {
-        if (!serviceEnabled || !noOfEventLogSubscribers)
+        if (!serviceEnabled || (noOfEventLogSubscribers == 0u))
         {
             BMCWEB_LOG_DEBUG << "EventService disabled or no Subscriptions.";
             return;
@@ -1122,7 +1122,7 @@
                 continue;
             }
 
-            if (!serviceEnabled || !noOfEventLogSubscribers)
+            if (!serviceEnabled || noOfEventLogSubscribers == 0)
             {
                 // If Service is not enabled, no need to compute
                 // the remaining items below.
@@ -1153,7 +1153,7 @@
                                       messageKey, messageArgs);
         }
 
-        if (!serviceEnabled || !noOfEventLogSubscribers)
+        if (!serviceEnabled || noOfEventLogSubscribers == 0)
         {
             BMCWEB_LOG_DEBUG << "EventService disabled or no Subscriptions.";
             return;
@@ -1340,7 +1340,7 @@
 
         const telemetry::TimestampReadings* readings =
             std::get_if<telemetry::TimestampReadings>(&found->second);
-        if (!readings)
+        if (readings == nullptr)
         {
             BMCWEB_LOG_INFO << "Failed to get Readings from Report properties";
             return;
diff --git a/redfish-core/include/gzfile.hpp b/redfish-core/include/gzfile.hpp
index 2001756..567741d 100644
--- a/redfish-core/include/gzfile.hpp
+++ b/redfish-core/include/gzfile.hpp
@@ -13,7 +13,7 @@
                     std::vector<std::string>& logEntries, size_t& logCount)
     {
         gzFile logStream = gzopen(filename.c_str(), "r");
-        if (!logStream)
+        if (logStream == nullptr)
         {
             BMCWEB_LOG_ERROR << "Can't open gz file: " << filename << '\n';
             return false;
@@ -71,7 +71,7 @@
                 BMCWEB_LOG_ERROR << "Error occurs during parsing host log.\n";
                 return false;
             }
-        } while (!gzeof(logStream));
+        } while (gzeof(logStream) != 1);
 
         return true;
     }
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index df7279e..232f51c 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -1142,7 +1142,7 @@
         [dbusObjectPath, username, password(std::move(password)),
          roleId(std::move(roleId)), enabled, locked,
          asyncResp{std::move(asyncResp)}](int rc) {
-            if (!rc)
+            if (rc <= 0)
             {
                 messages::resourceNotFound(
                     asyncResp->res, "#ManagerAccount.v1_4_0.ManagerAccount",
@@ -1727,7 +1727,8 @@
                             const std::pair<sdbusplus::message::object_path,
                                             dbus::utility::DBusInteracesMap>&
                                 user) {
-                            return !accountName.compare(user.first.filename());
+                            return accountName.compare(user.first.filename()) ==
+                                   0;
                         });
 
                     if (userIt == users.end())
diff --git a/redfish-core/lib/certificate_service.hpp b/redfish-core/lib/certificate_service.hpp
index 23e3ead..4adaf0b 100644
--- a/redfish-core/lib/certificate_service.hpp
+++ b/redfish-core/lib/certificate_service.hpp
@@ -154,7 +154,7 @@
                                             'e', 'r', 't', 's', '.', 'X',
                                             'X', 'X', 'X', 'X', 'X', '\0'};
         char* tempDirectory = mkdtemp(dirTemplate.data());
-        if (tempDirectory)
+        if (tempDirectory != nullptr)
         {
             certDirectory = tempDirectory;
             certificateFile = certDirectory / "cert.pem";
@@ -596,7 +596,7 @@
                     asyncResp->res.jsonValue["CertificateString"] = "";
                     const std::string* value =
                         std::get_if<std::string>(&property.second);
-                    if (value)
+                    if (value != nullptr)
                     {
                         asyncResp->res.jsonValue["CertificateString"] = *value;
                     }
@@ -608,7 +608,7 @@
                     keyUsage = nlohmann::json::array();
                     const std::vector<std::string>* value =
                         std::get_if<std::vector<std::string>>(&property.second);
-                    if (value)
+                    if (value != nullptr)
                     {
                         for (const std::string& usage : *value)
                         {
@@ -620,7 +620,7 @@
                 {
                     const std::string* value =
                         std::get_if<std::string>(&property.second);
-                    if (value)
+                    if (value != nullptr)
                     {
                         updateCertIssuerOrSubject(
                             asyncResp->res.jsonValue["Issuer"], *value);
@@ -630,7 +630,7 @@
                 {
                     const std::string* value =
                         std::get_if<std::string>(&property.second);
-                    if (value)
+                    if (value != nullptr)
                     {
                         updateCertIssuerOrSubject(
                             asyncResp->res.jsonValue["Subject"], *value);
@@ -640,7 +640,7 @@
                 {
                     const uint64_t* value =
                         std::get_if<uint64_t>(&property.second);
-                    if (value)
+                    if (value != nullptr)
                     {
                         asyncResp->res.jsonValue["ValidNotAfter"] =
                             crow::utility::getDateTimeUint(*value);
@@ -650,7 +650,7 @@
                 {
                     const uint64_t* value =
                         std::get_if<uint64_t>(&property.second);
-                    if (value)
+                    if (value != nullptr)
                     {
                         asyncResp->res.jsonValue["ValidNotBefore"] =
                             crow::utility::getDateTimeUint(*value);
diff --git a/redfish-core/lib/ethernet.hpp b/redfish-core/lib/ethernet.hpp
index 5283fff..9b1aa43 100644
--- a/redfish-core/lib/ethernet.hpp
+++ b/redfish-core/lib/ethernet.hpp
@@ -685,7 +685,7 @@
             // Count bits
             for (long bitIdx = 7; bitIdx >= 0; bitIdx--)
             {
-                if (value & (1L << bitIdx))
+                if ((value & (1L << bitIdx)) != 0)
                 {
                     if (firstZeroInByteHit)
                     {
@@ -2355,7 +2355,7 @@
                     return;
                 }
                 // Need both vlanId and vlanEnable to service this request
-                if (!vlanId)
+                if (vlanId == 0u)
                 {
                     messages::propertyMissing(asyncResp->res, "VLANId");
                 }
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index 6088758..9ce2f05 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -359,7 +359,7 @@
                             if (value == nullptr)
                             {
                                 messages::propertyValueFormatError(
-                                    asyncResp->res, item.value().dump(2, true),
+                                    asyncResp->res, item.value().dump(2, 1),
                                     "HttpHeaders/" + item.key());
                                 return;
                             }
@@ -432,7 +432,8 @@
                                     registry.begin(), registry.end(),
                                     [&id](const redfish::message_registries::
                                               MessageEntry& messageEntry) {
-                                        return !id.compare(messageEntry.first);
+                                        return id.compare(messageEntry.first) ==
+                                               0;
                                     }))
                             {
                                 validId = true;
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 84e6b34..b2c5d4c 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -65,7 +65,7 @@
     std::span<const MessageEntry>::iterator messageIt = std::find_if(
         registry.begin(), registry.end(),
         [&messageKey](const MessageEntry& messageEntry) {
-            return !std::strcmp(messageEntry.first, messageKey.c_str());
+            return std::strcmp(messageEntry.first, messageKey.c_str()) == 0;
         });
     if (messageIt != registry.end())
     {
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index c69af7e..549ab2d 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -500,7 +500,7 @@
                                 {
                                     values = ptr;
                                 }
-                                if (keys && values)
+                                if (keys != nullptr && values != nullptr)
                                 {
                                     if (keys->size() != values->size())
                                     {
@@ -913,7 +913,7 @@
                 return CreatePIDRet::fail;
             }
             if (chassis.empty() &&
-                !findChassis(managedObj, zonesStr[0], chassis))
+                findChassis(managedObj, zonesStr[0], chassis) == nullptr)
             {
                 BMCWEB_LOG_ERROR << "Failed to get chassis from config patch";
                 messages::invalidObject(response->res, it.key());
@@ -1078,7 +1078,7 @@
                 return CreatePIDRet::fail;
             }
             if (chassis.empty() &&
-                !findChassis(managedObj, zonesStrs[0], chassis))
+                findChassis(managedObj, zonesStrs[0], chassis) == nullptr)
             {
                 BMCWEB_LOG_ERROR << "Failed to get chassis from config patch";
                 messages::invalidObject(response->res, it.key());
diff --git a/redfish-core/lib/metric_report_definition.hpp b/redfish-core/lib/metric_report_definition.hpp
index 541e631..4ac4c77 100644
--- a/redfish-core/lib/metric_report_definition.hpp
+++ b/redfish-core/lib/metric_report_definition.hpp
@@ -66,8 +66,9 @@
             interval = std::get_if<uint64_t>(&var);
         }
     }
-    if (!emitsReadingsUpdate || !logToMetricReportsCollection ||
-        !readingParams || !reportingType || !interval)
+    if (emitsReadingsUpdate == nullptr ||
+        logToMetricReportsCollection == nullptr || readingParams == nullptr ||
+        reportingType == nullptr || interval == nullptr)
     {
         BMCWEB_LOG_ERROR << "Property type mismatch or property is missing";
         messages::internalError(asyncResp->res);
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index ad3ca8e..48f22b7 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -172,8 +172,8 @@
 
                     std::string interfaceChassisName =
                         chassis.substr(lastPos + 1, len);
-                    if (!interfaceChassisName.compare(
-                            sensorAsyncResp->chassisId))
+                    if (interfaceChassisName.compare(
+                            sensorAsyncResp->chassisId) == 0)
                     {
                         found = true;
                         break;
@@ -231,17 +231,17 @@
                                              dbus::utility::DbusVariantType>&
                                  property : properties)
                         {
-                            if (!property.first.compare("Scale"))
+                            if (property.first.compare("Scale") == 0)
                             {
                                 const int64_t* i =
                                     std::get_if<int64_t>(&property.second);
 
-                                if (i)
+                                if (i != nullptr)
                                 {
                                     scale = *i;
                                 }
                             }
-                            else if (!property.first.compare("PowerCap"))
+                            else if (property.first.compare("PowerCap") == 0)
                             {
                                 const double* d =
                                     std::get_if<double>(&property.second);
@@ -250,25 +250,26 @@
                                 const uint32_t* u =
                                     std::get_if<uint32_t>(&property.second);
 
-                                if (d)
+                                if (d != nullptr)
                                 {
                                     powerCap = *d;
                                 }
-                                else if (i)
+                                else if (i != nullptr)
                                 {
                                     powerCap = static_cast<double>(*i);
                                 }
-                                else if (u)
+                                else if (u != nullptr)
                                 {
                                     powerCap = *u;
                                 }
                             }
-                            else if (!property.first.compare("PowerCapEnable"))
+                            else if (property.first.compare("PowerCapEnable") ==
+                                     0)
                             {
                                 const bool* b =
                                     std::get_if<bool>(&property.second);
 
-                                if (b)
+                                if (b != nullptr)
                                 {
                                     enabled = *b;
                                 }
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 4d4b4cc..a53c112 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -965,7 +965,7 @@
         std::string sensorNameLower =
             boost::algorithm::to_lower_copy(sensorName);
 
-        if (!sensorName.compare("total_power"))
+        if (sensorName.compare("total_power") == 0)
         {
             sensorJson["@odata.type"] = "#Power.v1_0_0.PowerControl";
             // Put multiple "sensors" into a single PowerControl, so have
@@ -2551,7 +2551,7 @@
                     }
                     else if (sensorType == "power")
                     {
-                        if (!sensorName.compare("total_power"))
+                        if (sensorName.compare("total_power") == 0)
                         {
                             fieldName = "PowerControl";
                         }
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index d680537..62bd11b 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -176,7 +176,7 @@
             const uint16_t* coreCountVal =
                 std::get_if<uint16_t>(&property.second);
 
-            if (!coreCountVal)
+            if (coreCountVal == nullptr)
             {
                 messages::internalError(aResp->res);
                 return;
@@ -1574,7 +1574,8 @@
     // Source target specified
     BMCWEB_LOG_DEBUG << "Boot source: " << *bootSource;
     // Figure out which DBUS interface and property to use
-    if (assignBootParameters(aResp, *bootSource, bootSourceStr, bootModeStr))
+    if (assignBootParameters(aResp, *bootSource, bootSourceStr, bootModeStr) !=
+        0)
     {
         BMCWEB_LOG_DEBUG
             << "Invalid property value for BootSourceOverrideTarget: "
@@ -2238,7 +2239,7 @@
                 {
                     const bool* state = std::get_if<bool>(&property.second);
 
-                    if (!state)
+                    if (state == nullptr)
                     {
                         messages::internalError(aResp->res);
                         return;
@@ -2250,7 +2251,7 @@
                 {
                     const std::string* s =
                         std::get_if<std::string>(&property.second);
-                    if (!s)
+                    if (s == nullptr)
                     {
                         messages::internalError(aResp->res);
                         return;
@@ -2353,7 +2354,7 @@
         if (property.first == "Enabled")
         {
             const bool* state = std::get_if<bool>(&property.second);
-            if (!state)
+            if (state == nullptr)
             {
                 return false;
             }
@@ -2362,7 +2363,7 @@
         else if (property.first == "EnterUtilizationPercent")
         {
             const uint8_t* util = std::get_if<uint8_t>(&property.second);
-            if (!util)
+            if (util == nullptr)
             {
                 return false;
             }
@@ -2373,7 +2374,7 @@
             // Convert Dbus time from milliseconds to seconds
             const uint64_t* timeMilliseconds =
                 std::get_if<uint64_t>(&property.second);
-            if (!timeMilliseconds)
+            if (timeMilliseconds == nullptr)
             {
                 return false;
             }
@@ -2386,7 +2387,7 @@
         else if (property.first == "ExitUtilizationPercent")
         {
             const uint8_t* util = std::get_if<uint8_t>(&property.second);
-            if (!util)
+            if (util == nullptr)
             {
                 return false;
             }
@@ -2397,7 +2398,7 @@
             // Convert Dbus time from milliseconds to seconds
             const uint64_t* timeMilliseconds =
                 std::get_if<uint64_t>(&property.second);
-            if (!timeMilliseconds)
+            if (timeMilliseconds == nullptr)
             {
                 return false;
             }
diff --git a/redfish-core/lib/telemetry_service.hpp b/redfish-core/lib/telemetry_service.hpp
index 5457530..421985a 100644
--- a/redfish-core/lib/telemetry_service.hpp
+++ b/redfish-core/lib/telemetry_service.hpp
@@ -58,7 +58,7 @@
                     minInterval = std::get_if<uint64_t>(&var);
                 }
             }
-            if (!maxReports || !minInterval)
+            if (maxReports == nullptr || minInterval == nullptr)
             {
                 BMCWEB_LOG_ERROR
                     << "Property type mismatch or property is missing";
diff --git a/redfish-core/lib/trigger.hpp b/redfish-core/lib/trigger.hpp
index bb0a0e2..cdd5781 100644
--- a/redfish-core/lib/trigger.hpp
+++ b/redfish-core/lib/trigger.hpp
@@ -80,7 +80,7 @@
     const std::vector<DiscreteThresholdParams>* discreteParams =
         std::get_if<std::vector<DiscreteThresholdParams>>(&thresholdParams);
 
-    if (!discreteParams)
+    if (discreteParams == nullptr)
     {
         return std::nullopt;
     }
@@ -113,7 +113,7 @@
     const std::vector<NumericThresholdParams>* numericParams =
         std::get_if<std::vector<NumericThresholdParams>>(&thresholdParams);
 
-    if (!numericParams)
+    if (numericParams == nullptr)
     {
         return std::nullopt;
     }
@@ -204,7 +204,8 @@
         }
     }
 
-    if (!name || !discrete || !sensors || !reports || !actions || !thresholds)
+    if (name == nullptr || discrete == nullptr || sensors == nullptr ||
+        reports == nullptr || actions == nullptr || thresholds == nullptr)
     {
         BMCWEB_LOG_ERROR
             << "Property type mismatch or property is missing in Trigger: "
diff --git a/redfish-core/lib/virtual_media.hpp b/redfish-core/lib/virtual_media.hpp
index ab27fc7..9e44e80 100644
--- a/redfish-core/lib/virtual_media.hpp
+++ b/redfish-core/lib/virtual_media.hpp
@@ -111,7 +111,7 @@
                 if (property == "WriteProtected")
                 {
                     const bool* writeProtectedValue = std::get_if<bool>(&value);
-                    if (writeProtectedValue)
+                    if (writeProtectedValue != nullptr)
                     {
                         aResp->res.jsonValue["WriteProtected"] =
                             *writeProtectedValue;
@@ -126,7 +126,7 @@
                 if (property == "Active")
                 {
                     const bool* activeValue = std::get_if<bool>(&value);
-                    if (!activeValue)
+                    if (activeValue == nullptr)
                     {
                         BMCWEB_LOG_DEBUG << "Value Active not found";
                         return;
@@ -578,7 +578,7 @@
     SecureBuffer pack(FormatterFunc formatter)
     {
         SecureBuffer packed{new Buffer{}};
-        if (formatter)
+        if (formatter != nullptr)
         {
             formatter(credentials.user(), credentials.password(), *packed);
         }
