diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index 17f5fd3..5cd70bc 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -1727,8 +1727,7 @@
                             const std::pair<sdbusplus::message::object_path,
                                             dbus::utility::DBusInteracesMap>&
                                 user) {
-                            return accountName.compare(user.first.filename()) ==
-                                   0;
+                            return accountName == user.first.filename();
                         });
 
                     if (userIt == users.end())
diff --git a/redfish-core/lib/event_service.hpp b/redfish-core/lib/event_service.hpp
index ba39140..134ef24 100644
--- a/redfish-core/lib/event_service.hpp
+++ b/redfish-core/lib/event_service.hpp
@@ -429,7 +429,7 @@
                                 registry.begin(), registry.end(),
                                 [&id](const redfish::registries::MessageEntry&
                                           messageEntry) {
-                                    return id.compare(messageEntry.first) == 0;
+                                    return id == messageEntry.first;
                                 }))
                         {
                             validId = true;
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 629db47..8a0bd3a 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -434,7 +434,7 @@
                         {
                             if (propertyMap.first == "Status")
                             {
-                                auto status = std::get_if<std::string>(
+                                const auto* status = std::get_if<std::string>(
                                     &propertyMap.second);
                                 if (status == nullptr)
                                 {
@@ -453,7 +453,7 @@
                         {
                             if (propertyMap.first == "Size")
                             {
-                                auto sizePtr =
+                                const auto* sizePtr =
                                     std::get_if<uint64_t>(&propertyMap.second);
                                 if (sizePtr == nullptr)
                                 {
@@ -988,7 +988,7 @@
                             return;
                         }
 
-                        for (auto& pathStr : subtreePath)
+                        for (const auto& pathStr : subtreePath)
                         {
                             if (pathStr.find("PostCode") != std::string::npos)
                             {
diff --git a/redfish-core/lib/power.hpp b/redfish-core/lib/power.hpp
index 694d29e..eaf7e6c 100644
--- a/redfish-core/lib/power.hpp
+++ b/redfish-core/lib/power.hpp
@@ -172,8 +172,7 @@
 
                     std::string interfaceChassisName =
                         chassis.substr(lastPos + 1, len);
-                    if (interfaceChassisName.compare(
-                            sensorAsyncResp->chassisId) == 0)
+                    if (interfaceChassisName == sensorAsyncResp->chassisId)
                     {
                         found = true;
                         break;
@@ -231,7 +230,7 @@
                                              dbus::utility::DbusVariantType>&
                                  property : properties)
                         {
-                            if (property.first.compare("Scale") == 0)
+                            if (property.first == "Scale")
                             {
                                 const int64_t* i =
                                     std::get_if<int64_t>(&property.second);
@@ -241,7 +240,7 @@
                                     scale = *i;
                                 }
                             }
-                            else if (property.first.compare("PowerCap") == 0)
+                            else if (property.first == "PowerCap")
                             {
                                 const double* d =
                                     std::get_if<double>(&property.second);
@@ -263,8 +262,7 @@
                                     powerCap = *u;
                                 }
                             }
-                            else if (property.first.compare("PowerCapEnable") ==
-                                     0)
+                            else if (property.first == "PowerCapEnable")
                             {
                                 const bool* b =
                                     std::get_if<bool>(&property.second);
diff --git a/redfish-core/lib/redfish_util.hpp b/redfish-core/lib/redfish_util.hpp
index a51aafd..a42d00d 100644
--- a/redfish-core/lib/redfish_util.hpp
+++ b/redfish-core/lib/redfish_util.hpp
@@ -120,7 +120,7 @@
 
                 // is unitsName end with ".socket"
                 std::string unitNameEnd = unitName.substr(lastCharPos);
-                if (unitNameEnd.compare(".socket") != 0)
+                if (unitNameEnd != ".socket")
                 {
                     continue;
                 }
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index dd2d752..3139635 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") == 0)
+        if (sensorName == "total_power")
         {
             sensorJson["@odata.type"] = "#Power.v1_0_0.PowerControl";
             // Put multiple "sensors" into a single PowerControl, so have
@@ -1054,13 +1054,13 @@
     for (const std::tuple<const char*, const char*,
                           nlohmann::json::json_pointer>& p : properties)
     {
-        for (auto& [interface, values] : interfacesDict)
+        for (const auto& [interface, values] : interfacesDict)
         {
             if (interface != std::get<0>(p))
             {
                 continue;
             }
-            for (auto& [valueName, valueVariant] : values)
+            for (const auto& [valueName, valueVariant] : values)
             {
                 if (valueName != std::get<1>(p))
                 {
@@ -2167,7 +2167,7 @@
         // Store value in Power Supply Inventory Items
         for (InventoryItem& inventoryItem : *inventoryItems)
         {
-            if (inventoryItem.isPowerSupply == true)
+            if (inventoryItem.isPowerSupply)
             {
                 inventoryItem.powerSupplyEfficiencyPercent =
                     static_cast<int>(value);
@@ -2551,7 +2551,7 @@
                     }
                     else if (sensorType == "power")
                     {
-                        if (sensorName.compare("total_power") == 0)
+                        if (sensorName == "total_power")
                         {
                             fieldName = "PowerControl";
                         }
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 0d1e12d..ec4db21 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -77,11 +77,11 @@
 {
     BMCWEB_LOG_DEBUG << "Cpu Present: " << isCpuPresent;
 
-    if (isCpuPresent == true)
+    if (isCpuPresent)
     {
         nlohmann::json& procCount =
             aResp->res.jsonValue["ProcessorSummary"]["Count"];
-        auto procCountPtr =
+        auto* procCountPtr =
             procCount.get_ptr<nlohmann::json::number_integer_t*>();
         if (procCountPtr != nullptr)
         {
