diff --git a/src/ADCSensor.cpp b/src/ADCSensor.cpp
index fe600d7..646c269 100644
--- a/src/ADCSensor.cpp
+++ b/src/ADCSensor.cpp
@@ -14,10 +14,9 @@
 // limitations under the License.
 */
 
-#include "ADCSensor.hpp"
-
 #include <unistd.h>
 
+#include <ADCSensor.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/asio/read_until.hpp>
@@ -49,13 +48,12 @@
                      sdbusplus::asio::object_server& objectServer,
                      std::shared_ptr<sdbusplus::asio::connection>& conn,
                      boost::asio::io_service& io, const std::string& sensorName,
-                     std::vector<thresholds::Threshold>&& _thresholds,
+                     std::vector<thresholds::Threshold>&& thresholds,
                      const double scaleFactor, PowerState readState,
                      const std::string& sensorConfiguration,
                      std::optional<BridgeGpio>&& bridgeGpio) :
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"),
-           std::move(_thresholds), sensorConfiguration,
-           "xyz.openbmc_project.Configuration.ADC",
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), std::move(thresholds),
+           sensorConfiguration, "xyz.openbmc_project.Configuration.ADC",
            maxVoltageReading / scaleFactor, minVoltageReading / scaleFactor,
            conn, readState),
     std::enable_shared_from_this<ADCSensor>(), objServer(objectServer),
diff --git a/src/ADCSensorMain.cpp b/src/ADCSensorMain.cpp
index 473d8a1..5265321 100644
--- a/src/ADCSensorMain.cpp
+++ b/src/ADCSensorMain.cpp
@@ -14,10 +14,9 @@
 // limitations under the License.
 */
 
-#include "ADCSensor.hpp"
-#include "Utils.hpp"
-#include "VariantVisitors.hpp"
-
+#include <ADCSensor.hpp>
+#include <Utils.hpp>
+#include <VariantVisitors.hpp>
 #include <boost/algorithm/string/case_conv.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
@@ -36,7 +35,7 @@
 #include <variant>
 #include <vector>
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 namespace fs = std::filesystem;
 
@@ -321,7 +320,7 @@
                     /* we were canceled*/
                     return;
                 }
-                else if (ec)
+                if (ec)
                 {
                     std::cerr << "timer error\n";
                     return;
@@ -369,7 +368,7 @@
                     /* we were canceled*/
                     return;
                 }
-                else if (ec)
+                if (ec)
                 {
                     std::cerr << "timer error\n";
                     return;
diff --git a/src/CPUSensor.cpp b/src/CPUSensor.cpp
index ea56d03..c28b230 100644
--- a/src/CPUSensor.cpp
+++ b/src/CPUSensor.cpp
@@ -14,12 +14,10 @@
 // limitations under the License.
 */
 
-#include "CPUSensor.hpp"
-
-#include "Utils.hpp"
-
 #include <unistd.h>
 
+#include <CPUSensor.hpp>
+#include <Utils.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/asio/read_until.hpp>
@@ -39,12 +37,11 @@
                      sdbusplus::asio::object_server& objectServer,
                      std::shared_ptr<sdbusplus::asio::connection>& conn,
                      boost::asio::io_service& io, const std::string& sensorName,
-                     std::vector<thresholds::Threshold>&& _thresholds,
+                     std::vector<thresholds::Threshold>&& thresholds,
                      const std::string& sensorConfiguration, int cpuId,
                      bool show, double dtsOffset) :
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"),
-           std::move(_thresholds), sensorConfiguration, objectType, 0, 0, conn,
-           PowerState::on),
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), std::move(thresholds),
+           sensorConfiguration, objectType, 0, 0, conn, PowerState::on),
     objServer(objectServer), inputDev(io), waitTimer(io), path(path),
     privTcontrol(std::numeric_limits<double>::quiet_NaN()),
     dtsOffset(dtsOffset), show(show), pollTime(CPUSensor::sensorPollMs),
@@ -205,7 +202,7 @@
     {
         return; // we're being destroyed
     }
-    else if (err == boost::system::errc::operation_canceled)
+    if (err == boost::system::errc::operation_canceled)
     {
         if (readingStateGood())
         {
@@ -214,7 +211,7 @@
                 std::cerr << name << " interface down!\n";
                 loggedInterfaceDown = true;
             }
-            pollTime = 10000 + rand() % 10000;
+            pollTime = CPUSensor::sensorPollMs * 10u;
             markFunctional(false);
         }
         return;
diff --git a/src/CPUSensorMain.cpp b/src/CPUSensorMain.cpp
index dfc942f..07be8f6 100644
--- a/src/CPUSensorMain.cpp
+++ b/src/CPUSensorMain.cpp
@@ -14,18 +14,16 @@
 // limitations under the License.
 */
 
-#include "CPUSensor.hpp"
-#include "Utils.hpp"
-#include "VariantVisitors.hpp"
-
 #include <fcntl.h>
 
+#include <CPUSensor.hpp>
+#include <Utils.hpp>
+#include <VariantVisitors.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
 #include <boost/container/flat_set.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/process/child.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 #include <sdbusplus/bus/match.hpp>
@@ -51,7 +49,7 @@
 #endif
 // clang-format on
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 boost::container::flat_map<std::string, std::unique_ptr<CPUSensor>> gCpuSensors;
 boost::container::flat_map<std::string,
@@ -194,7 +192,7 @@
         fs::path::iterator it = hwmonNamePath.begin();
         std::advance(it, 6); // pick the 6th part for a PECI client device name
         std::string deviceName = *it;
-        auto findHyphen = deviceName.find("-");
+        auto findHyphen = deviceName.find('-');
         if (findHyphen == std::string::npos)
         {
             std::cerr << "found bad device " << deviceName << "\n";
@@ -208,7 +206,7 @@
         try
         {
             bus = std::stoi(busStr);
-            addr = std::stoi(addrStr, 0, 16);
+            addr = std::stoi(addrStr, nullptr, 16);
         }
         catch (std::invalid_argument&)
         {
@@ -229,7 +227,7 @@
             // shouldn't have an empty name file
             continue;
         }
-        if (DEBUG)
+        if (debug)
         {
             std::cout << "Checking: " << hwmonNamePath << ": " << hwmonName
                       << "\n";
@@ -331,7 +329,7 @@
             auto findSensor = gCpuSensors.find(sensorName);
             if (findSensor != gCpuSensors.end())
             {
-                if (DEBUG)
+                if (debug)
                 {
                     std::cout << "Skipped: " << inputPath << ": " << sensorName
                               << " is already created\n";
@@ -367,7 +365,7 @@
             }
 
             std::vector<thresholds::Threshold> sensorThresholds;
-            std::string labelHead = label.substr(0, label.find(" "));
+            std::string labelHead = label.substr(0, label.find(' '));
             parseThresholdsFromConfig(*sensorData, sensorThresholds,
                                       &labelHead);
             if (sensorThresholds.empty())
@@ -388,7 +386,7 @@
                 sensorName, std::move(sensorThresholds), *interfacePath, cpuId,
                 show, dtsOffset);
             createdSensors.insert(sensorName);
-            if (DEBUG)
+            if (debug)
             {
                 std::cout << "Mapped: " << inputPath << " to " << sensorName
                           << "\n";
@@ -428,7 +426,7 @@
         if (boost::starts_with(directoryName, busStr) &&
             boost::ends_with(directoryName, addrHexStr))
         {
-            if (DEBUG)
+            if (debug)
             {
                 std::cout << parameters << " on bus " << busStr
                           << " is already exported\n";
@@ -544,7 +542,7 @@
             keepPinging = true;
         }
 
-        if (DEBUG)
+        if (debug)
         {
             std::cout << config.name << ", state: " << config.state << "\n";
         }
@@ -681,7 +679,7 @@
                 uint64_t addr = std::visit(VariantToUnsignedIntVisitor(),
                                            findAddress->second);
 
-                if (DEBUG)
+                if (debug)
                 {
                     std::cout << "bus: " << bus << "\n";
                     std::cout << "addr: " << addr << "\n";
@@ -739,7 +737,7 @@
                 return;
             }
 
-            if (DEBUG)
+            if (debug)
             {
                 std::cout << message.get_path() << " is changed\n";
             }
diff --git a/src/ChassisIntrusionSensor.cpp b/src/ChassisIntrusionSensor.cpp
index 8293bab..af5ced3 100644
--- a/src/ChassisIntrusionSensor.cpp
+++ b/src/ChassisIntrusionSensor.cpp
@@ -14,22 +14,21 @@
 // limitations under the License.
 */
 
-#include "ChassisIntrusionSensor.hpp"
-
-#include <errno.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <unistd.h>
 
-#include <boost/asio.hpp>
-#include <boost/bind.hpp>
+#include <ChassisIntrusionSensor.hpp>
+#include <boost/asio/io_service.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
+#include <cerrno>
 #include <chrono>
 #include <iostream>
 #include <memory>
 #include <string>
 #include <thread>
+#include <utility>
 
 extern "C"
 {
@@ -37,7 +36,7 @@
 #include <linux/i2c-dev.h>
 }
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 static constexpr unsigned int intrusionSensorPollSec = 1;
 
@@ -47,7 +46,7 @@
 // Status bit field masks
 const static constexpr size_t pchRegMaskIntrusion = 0x01;
 
-void ChassisIntrusionSensor::updateValue(const std::string newValue)
+void ChassisIntrusionSensor::updateValue(const std::string& newValue)
 {
     // Take no action if value already equal
     // Same semantics as Sensor::updateValue(const double&)
@@ -109,12 +108,11 @@
         return -1;
     }
 
-    int statusValue;
-    unsigned int statusMask = pchRegMaskIntrusion;
-    unsigned int statusReg = pchStatusRegIntrusion;
+    int32_t statusMask = pchRegMaskIntrusion;
+    int32_t statusReg = pchStatusRegIntrusion;
 
-    statusValue = i2c_smbus_read_byte_data(fd, statusReg);
-    if (DEBUG)
+    int32_t statusValue = i2c_smbus_read_byte_data(fd, statusReg);
+    if (debug)
     {
         std::cout << "\nRead bus " << busId << " addr " << slaveAddr
                   << ", value = " << statusValue << "\n";
@@ -131,7 +129,7 @@
     // Get status value with mask
     int newValue = statusValue & statusMask;
 
-    if (DEBUG)
+    if (debug)
     {
         std::cout << "statusValue is " << statusValue << "\n";
         std::cout << "Intrusion sensor value is " << newValue << "\n";
@@ -180,7 +178,7 @@
     // set string defined in chassis redfish schema
     std::string newValue = value ? "HardwareIntrusion" : "Normal";
 
-    if (DEBUG)
+    if (debug)
     {
         std::cout << "\nGPIO value is " << value << "\n";
         std::cout << "Intrusion sensor value is " << newValue << "\n";
@@ -203,7 +201,7 @@
             {
                 return; // we're being destroyed
             }
-            else if (ec)
+            if (ec)
             {
                 std::cerr
                     << "Error on GPIO based intrusion sensor wait event\n";
@@ -274,7 +272,7 @@
 void ChassisIntrusionSensor::start(IntrusionSensorType type, int busId,
                                    int slaveAddr, bool gpioInverted)
 {
-    if (DEBUG)
+    if (debug)
     {
         std::cerr << "enter ChassisIntrusionSensor::start, type = " << type
                   << "\n";
@@ -361,7 +359,7 @@
 ChassisIntrusionSensor::ChassisIntrusionSensor(
     boost::asio::io_service& io,
     std::shared_ptr<sdbusplus::asio::dbus_interface> iface) :
-    mIface(iface),
+    mIface(std::move(iface)),
     mType(IntrusionSensorType::gpio), mValue("unknown"), mOldValue("unknown"),
     mBusId(-1), mSlaveAddr(-1), mPollTimer(io), mGpioInverted(false),
     mGpioFd(io)
diff --git a/src/ExitAirTempSensor.cpp b/src/ExitAirTempSensor.cpp
index c667457..725cb12 100644
--- a/src/ExitAirTempSensor.cpp
+++ b/src/ExitAirTempSensor.cpp
@@ -14,13 +14,9 @@
 // limitations under the License.
 */
 
-#include "ExitAirTempSensor.hpp"
-
-#include "Utils.hpp"
-#include "VariantVisitors.hpp"
-
-#include <math.h>
-
+#include <ExitAirTempSensor.hpp>
+#include <Utils.hpp>
+#include <VariantVisitors.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
@@ -41,7 +37,7 @@
 #include <variant>
 #include <vector>
 
-constexpr const float altitudeFactor = 1.14;
+constexpr const double altitudeFactor = 1.14;
 constexpr const char* exitAirIface =
     "xyz.openbmc_project.Configuration.ExitAirTempSensor";
 constexpr const char* cfmIface = "xyz.openbmc_project.Configuration.CFMSensor";
@@ -54,7 +50,7 @@
 constexpr const char* cfmSettingPath = "/xyz/openbmc_project/control/cfm_limit";
 constexpr const char* cfmSettingIface = "xyz.openbmc_project.Control.CFMLimit";
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 static constexpr double cfmMaxReading = 255;
 static constexpr double cfmMinReading = 0;
@@ -128,8 +124,8 @@
 
                 conn->async_method_call(
                     [conn, value, owner,
-                     path](const boost::system::error_code ec,
-                           const std::variant<std::string>& classType) {
+                     path{path}](const boost::system::error_code ec,
+                                 const std::variant<std::string>& classType) {
                         if (ec)
                         {
                             std::cerr << "Error getting pid class\n";
@@ -411,7 +407,7 @@
             });
         if (findReading == tachReadings.end())
         {
-            if constexpr (DEBUG)
+            if constexpr (debug)
             {
                 std::cerr << "Can't find " << tachName << "in readings\n";
             }
@@ -438,7 +434,7 @@
         rpm /= findRange->second.second;
         rpm *= 100;
 
-        if constexpr (DEBUG)
+        if constexpr (debug)
         {
             std::cout << "Tach " << tachName << "at " << rpm << "\n";
         }
@@ -468,7 +464,7 @@
         // Now calculate the CFM for this tach
         // CFMi = Ci * Qmaxi * TACHi
         totalCFM += ci * maxCFM * rpm;
-        if constexpr (DEBUG)
+        if constexpr (debug)
         {
             std::cerr << "totalCFM = " << totalCFM << "\n";
             std::cerr << "Ci " << ci << " MaxCFM " << maxCFM << " rpm " << rpm
@@ -480,7 +476,7 @@
 
     // divide by 100 since rpm is in percent
     value = totalCFM / 100;
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cerr << "cfm value = " << value << "\n";
     }
@@ -603,7 +599,7 @@
 
                             double reading =
                                 std::visit(VariantToDoubleVisitor(), value);
-                            if constexpr (DEBUG)
+                            if constexpr (debug)
                             {
                                 std::cerr << path << "Reading " << reading
                                           << "\n";
@@ -695,7 +691,7 @@
 
     // Calculate power correction factor
     // Ci = CL + (CH - CL)/(QMax - QMin) * (CFM - QMin)
-    float powerFactor = 0.0;
+    double powerFactor = 0.0;
     if (cfm <= qMin)
     {
         powerFactor = powerFactorMin;
@@ -710,7 +706,7 @@
                                         (qMax - qMin) * (cfm - qMin));
     }
 
-    totalPower *= static_cast<double>(powerFactor);
+    totalPower *= powerFactor;
     totalPower += pOffset;
 
     if (totalPower == 0)
@@ -724,7 +720,7 @@
         return false;
     }
 
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cout << "Power Factor " << powerFactor << "\n";
         std::cout << "Inlet Temp " << inletTemp << "\n";
@@ -733,11 +729,11 @@
 
     // Calculate the exit air temp
     // Texit = Tfp + (1.76 * TotalPower / CFM * Faltitude)
-    double reading = 1.76 * totalPower * static_cast<double>(altitudeFactor);
+    double reading = 1.76 * totalPower * altitudeFactor;
     reading /= cfm;
     reading += inletTemp;
 
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cout << "Reading 1: " << reading << "\n";
     }
@@ -778,14 +774,14 @@
         alphaDT = 1.0;
     }
 
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cout << "AlphaDT: " << alphaDT << "\n";
     }
 
     reading = ((reading * alphaDT) + (lastReading * (1.0 - alphaDT)));
 
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cout << "Reading 2: " << reading << "\n";
     }
diff --git a/src/ExternalSensor.cpp b/src/ExternalSensor.cpp
index 13e9415..f867151 100644
--- a/src/ExternalSensor.cpp
+++ b/src/ExternalSensor.cpp
@@ -21,16 +21,16 @@
     const std::string& objectType, sdbusplus::asio::object_server& objectServer,
     std::shared_ptr<sdbusplus::asio::connection>& conn,
     const std::string& sensorName, const std::string& sensorUnits,
-    std::vector<thresholds::Threshold>&& _thresholds,
+    std::vector<thresholds::Threshold>&& thresholds,
     const std::string& sensorConfiguration, const double& maxReading,
     const double& minReading, const PowerState& powerState) :
     // TODO(): When the Mutable feature is integrated,
     // make sure all ExternalSensor instances are mutable,
     // because that is the entire point of ExternalSensor,
     // to accept sensor values written by an external source.
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"),
-           std::move(_thresholds), sensorConfiguration, objectType, maxReading,
-           minReading, conn, powerState),
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), std::move(thresholds),
+           sensorConfiguration, objectType, maxReading, minReading, conn,
+           powerState),
     std::enable_shared_from_this<ExternalSensor>(), objServer(objectServer)
 {
     // The caller must specify what physical characteristic
diff --git a/src/ExternalSensorMain.cpp b/src/ExternalSensorMain.cpp
index 9067d7e..19b8f60 100644
--- a/src/ExternalSensorMain.cpp
+++ b/src/ExternalSensorMain.cpp
@@ -43,7 +43,7 @@
 // there is no other way to tell, and it will be used for the object path
 // here: /xyz/openbmc_project/sensors/<Measure>/<Name>
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 static const char* sensorType =
     "xyz.openbmc_project.Configuration.ExternalSensor";
diff --git a/src/FanMain.cpp b/src/FanMain.cpp
index 2e7442d..25e5739 100644
--- a/src/FanMain.cpp
+++ b/src/FanMain.cpp
@@ -14,11 +14,10 @@
 // limitations under the License.
 */
 
-#include "PwmSensor.hpp"
-#include "TachSensor.hpp"
-#include "Utils.hpp"
-#include "VariantVisitors.hpp"
-
+#include <PwmSensor.hpp>
+#include <TachSensor.hpp>
+#include <Utils.hpp>
+#include <VariantVisitors.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
@@ -40,7 +39,7 @@
 #include <variant>
 #include <vector>
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 namespace fs = std::filesystem;
 
@@ -77,7 +76,7 @@
     {
         return FanTypes::aspeed;
     }
-    else if (boost::ends_with(canonical, "f0103000.pwm-fan-controller"))
+    if (boost::ends_with(canonical, "f0103000.pwm-fan-controller"))
     {
         return FanTypes::nuvoton;
     }
@@ -88,13 +87,13 @@
 void createRedundancySensor(
     const boost::container::flat_map<std::string, std::unique_ptr<TachSensor>>&
         sensors,
-    std::shared_ptr<sdbusplus::asio::connection> conn,
+    const std::shared_ptr<sdbusplus::asio::connection>& conn,
     sdbusplus::asio::object_server& objectServer)
 {
 
     conn->async_method_call(
         [&objectServer, &sensors](boost::system::error_code& ec,
-                                  const ManagedObjectType managedObj) {
+                                  const ManagedObjectType& managedObj) {
             if (ec)
             {
                 std::cerr << "Error calling entity manager \n";
@@ -182,7 +181,7 @@
                     std::string link =
                         fs::read_symlink(directory / "device").filename();
 
-                    size_t findDash = link.find("-");
+                    size_t findDash = link.find('-');
                     if (findDash == std::string::npos ||
                         link.size() <= findDash + 1)
                     {
@@ -235,7 +234,7 @@
                         sensorData = &(sensor.second);
                         break;
                     }
-                    else if (fanType == FanTypes::i2c)
+                    if (fanType == FanTypes::i2c)
                     {
                         auto findBus = baseConfiguration->second.find("Bus");
                         auto findAddress =
@@ -471,7 +470,7 @@
                     /* we were canceled*/
                     return;
                 }
-                else if (ec)
+                if (ec)
                 {
                     std::cerr << "timer error\n";
                     return;
diff --git a/src/HwmonTempMain.cpp b/src/HwmonTempMain.cpp
index 8a583b9..79eab20 100644
--- a/src/HwmonTempMain.cpp
+++ b/src/HwmonTempMain.cpp
@@ -14,9 +14,8 @@
 // limitations under the License.
 */
 
-#include "HwmonTempSensor.hpp"
-#include "Utils.hpp"
-
+#include <HwmonTempSensor.hpp>
+#include <Utils.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
@@ -37,7 +36,7 @@
 #include <variant>
 #include <vector>
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 static constexpr float pollRateDefault = 0.5;
 
 namespace fs = std::filesystem;
@@ -97,7 +96,7 @@
 
                 fs::path device = directory / "device";
                 std::string deviceName = fs::canonical(device).stem();
-                auto findHyphen = deviceName.find("-");
+                auto findHyphen = deviceName.find('-');
                 if (findHyphen == std::string::npos)
                 {
                     std::cerr << "found bad device " << deviceName << "\n";
@@ -111,7 +110,7 @@
                 try
                 {
                     bus = std::stoi(busStr);
-                    addr = std::stoi(addrStr, 0, 16);
+                    addr = std::stoi(addrStr, nullptr, 16);
                 }
                 catch (std::invalid_argument&)
                 {
@@ -312,7 +311,7 @@
                     /* we were canceled*/
                     return;
                 }
-                else if (ec)
+                if (ec)
                 {
                     std::cerr << "timer error\n";
                     return;
diff --git a/src/HwmonTempSensor.cpp b/src/HwmonTempSensor.cpp
index e1e8f6c..b804b25 100644
--- a/src/HwmonTempSensor.cpp
+++ b/src/HwmonTempSensor.cpp
@@ -14,10 +14,9 @@
 // limitations under the License.
 */
 
-#include "HwmonTempSensor.hpp"
-
 #include <unistd.h>
 
+#include <HwmonTempSensor.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/asio/read_until.hpp>
@@ -43,14 +42,14 @@
     sdbusplus::asio::object_server& objectServer,
     std::shared_ptr<sdbusplus::asio::connection>& conn,
     boost::asio::io_service& io, const std::string& sensorName,
-    std::vector<thresholds::Threshold>&& _thresholds, const float pollRate,
+    std::vector<thresholds::Threshold>&& thresholds, const float pollRate,
     const std::string& sensorConfiguration, const PowerState powerState) :
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"),
-           std::move(_thresholds), sensorConfiguration, objectType, maxReading,
-           minReading, conn, powerState),
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), std::move(thresholds),
+           sensorConfiguration, objectType, maxReading, minReading, conn,
+           powerState),
     std::enable_shared_from_this<HwmonTempSensor>(), objServer(objectServer),
     inputDev(io, open(path.c_str(), O_RDONLY)), waitTimer(io), path(path),
-    sensorPollMs(pollRate * 1000)
+    sensorPollMs(static_cast<unsigned int>(pollRate * 1000))
 {
     sensorInterface = objectServer.add_interface(
         "/xyz/openbmc_project/sensors/temperature/" + name,
diff --git a/src/IntrusionSensorMain.cpp b/src/IntrusionSensorMain.cpp
index f3d95fb..e40c240 100644
--- a/src/IntrusionSensorMain.cpp
+++ b/src/IntrusionSensorMain.cpp
@@ -14,13 +14,12 @@
 // limitations under the License.
 */
 
-#include "ChassisIntrusionSensor.hpp"
-#include "Utils.hpp"
-
 #include <systemd/sd-journal.h>
 
+#include <ChassisIntrusionSensor.hpp>
+#include <Utils.hpp>
 #include <boost/algorithm/string/predicate.hpp>
-#include <boost/asio.hpp>
+#include <boost/asio/io_service.hpp>
 #include <boost/container/flat_map.hpp>
 #include <sdbusplus/asio/connection.hpp>
 #include <sdbusplus/asio/object_server.hpp>
@@ -32,6 +31,7 @@
 #include <sdbusplus/timer.hpp>
 
 #include <array>
+#include <charconv>
 #include <chrono>
 #include <ctime>
 #include <fstream>
@@ -43,7 +43,7 @@
 #include <utility>
 #include <vector>
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 static constexpr const char* sensorType =
     "xyz.openbmc_project.Configuration.ChassisIntrusionSensor";
@@ -125,7 +125,7 @@
                 continue;
             }
 
-            if (DEBUG)
+            if (debug)
             {
                 std::cout << "find chassis intrusion sensor polarity inverted "
                              "flag is "
@@ -136,7 +136,7 @@
         }
 
         // case to find I2C info
-        else if (*pType == IntrusionSensorType::pch)
+        if (*pType == IntrusionSensorType::pch)
         {
             auto findBus = baseConfiguration->second.find("Bus");
             auto findAddress = baseConfiguration->second.find("Address");
@@ -158,7 +158,7 @@
                 continue;
             }
 
-            if (DEBUG)
+            if (debug)
             {
                 std::cout << "find matched bus " << *pBusId
                           << ", matched slave addr " << *pSlaveAddr << "\n";
@@ -340,7 +340,7 @@
     }
 
     // iterate through all found eth files, and save ifindex
-    for (auto& fileName : files)
+    for (const fs::path& fileName : files)
     {
         if (debugLanLeash)
         {
@@ -363,11 +363,9 @@
         const int pos = fileStr.find("eth");
         const std::string& ethNumStr = fileStr.substr(pos + 3);
         int ethNum = 0;
-        try
-        {
-            ethNum = std::stoul(ethNumStr);
-        }
-        catch (const std::invalid_argument& err)
+        std::from_chars_result r = std::from_chars(
+            ethNumStr.data(), ethNumStr.data() + ethNumStr.size(), ethNum);
+        if (r.ec != std::errc())
         {
             std::cerr << "invalid ethNum string: " << ethNumStr << "\n";
             continue;
diff --git a/src/IpmbSensor.cpp b/src/IpmbSensor.cpp
index 29fd7f4..0f35353 100644
--- a/src/IpmbSensor.cpp
+++ b/src/IpmbSensor.cpp
@@ -14,14 +14,9 @@
 // limitations under the License.
 */
 
-#include "IpmbSensor.hpp"
-
-#include "Utils.hpp"
-#include "VariantVisitors.hpp"
-
-#include <math.h>
-
-#include <boost/algorithm/string.hpp>
+#include <IpmbSensor.hpp>
+#include <Utils.hpp>
+#include <VariantVisitors.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
@@ -30,6 +25,7 @@
 #include <sdbusplus/bus/match.hpp>
 
 #include <chrono>
+#include <cmath>
 #include <functional>
 #include <iostream>
 #include <limits>
@@ -181,9 +177,13 @@
             case IpmbSubType::curr:
                 uint8_t snsNum;
                 if (subType == IpmbSubType::temp)
+                {
                     snsNum = 0x8d;
+                }
                 else
+                {
                     snsNum = 0x8c;
+                }
                 netfn = ipmi::me_bridge::netFn;
                 command = ipmi::me_bridge::sendRawPmbus;
                 commandData = {0x57, 0x01, 0x00, 0x86, deviceAddress,
@@ -354,18 +354,16 @@
                     read();
                     return;
                 }
-                else
+
+                // rawValue only used in debug logging
+                // up to 5th byte in data are used to derive value
+                size_t end = std::min(sizeof(uint64_t), data.size());
+                uint64_t rawData = 0;
+                for (size_t i = 0; i < end; i++)
                 {
-                    // rawValue only used in debug logging
-                    // up to 5th byte in data are used to derive value
-                    size_t end = std::min(sizeof(uint64_t), data.size());
-                    uint64_t rawData = 0;
-                    for (size_t i = 0; i < end; i++)
-                    {
-                        reinterpret_cast<uint8_t*>(&rawData)[i] = data[i];
-                    }
-                    rawValue = static_cast<double>(rawData);
+                    reinterpret_cast<uint8_t*>(&rawData)[i] = data[i];
                 }
+                rawValue = static_cast<double>(rawData);
 
                 /* Adjust value as per scale and offset */
                 value = (value * scaleVal) + offsetVal;
diff --git a/src/MCUTempSensor.cpp b/src/MCUTempSensor.cpp
index 6d94bd2..f637932 100644
--- a/src/MCUTempSensor.cpp
+++ b/src/MCUTempSensor.cpp
@@ -13,14 +13,9 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 */
-#include "MCUTempSensor.hpp"
-
-#include "Utils.hpp"
-#include "VariantVisitors.hpp"
-
-#include <math.h>
-
-#include <boost/algorithm/string.hpp>
+#include <MCUTempSensor.hpp>
+#include <Utils.hpp>
+#include <VariantVisitors.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
@@ -29,6 +24,7 @@
 #include <sdbusplus/bus/match.hpp>
 
 #include <chrono>
+#include <cmath>
 #include <functional>
 #include <iostream>
 #include <limits>
@@ -166,7 +162,7 @@
             return; // we're being cancelled
         }
         // read timer error
-        else if (ec)
+        if (ec)
         {
             std::cerr << "timer error\n";
             return;
@@ -291,7 +287,7 @@
                     return; // we're being canceled
                 }
                 // config timer error
-                else if (ec)
+                if (ec)
                 {
                     std::cerr << "timer error\n";
                     return;
diff --git a/src/NVMeSensor.cpp b/src/NVMeSensor.cpp
index cfa7d20..db6a05b 100644
--- a/src/NVMeSensor.cpp
+++ b/src/NVMeSensor.cpp
@@ -14,13 +14,11 @@
 // limitations under the License.
 */
 
-#include "NVMeSensor.hpp"
-
-#include "NVMeDevice.hpp"
-
 #include <crc32c.h>
 #include <libmctp-smbus.h>
 
+#include <NVMeDevice.hpp>
+#include <NVMeSensor.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/asio/ip/tcp.hpp>
 
@@ -29,7 +27,7 @@
 static constexpr double maxReading = 127;
 static constexpr double minReading = 0;
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 void rxMessage(uint8_t eid, void* data, void* msg, size_t len);
 
@@ -241,7 +239,7 @@
 
     readResponse(nvmeDevice);
 
-    if (DEBUG)
+    if (debug)
     {
         std::cout << "Sending message to read data from Drive on bus: "
                   << sensor->bus << " , rootBus: " << nvmeDevice->rootBus
@@ -300,7 +298,7 @@
         return;
     }
 
-    if (DEBUG)
+    if (debug)
     {
         std::cout << "Eid from the received messaged: " << eid << "\n";
     }
@@ -358,7 +356,7 @@
     }
 
     std::shared_ptr<NVMeSensor> sensorInfo = self->sensors.front();
-    if (DEBUG)
+    if (debug)
     {
         std::cout << "Temperature Reading: "
                   << getTemperatureReading(messageData[5])
@@ -376,7 +374,7 @@
         sensorInfo->updateValue(value);
     }
 
-    if (DEBUG)
+    if (debug)
     {
         std::cout << "Cancelling the timer now\n";
     }
@@ -435,13 +433,12 @@
                        boost::asio::io_service&,
                        std::shared_ptr<sdbusplus::asio::connection>& conn,
                        const std::string& sensorName,
-                       std::vector<thresholds::Threshold>&& _thresholds,
+                       std::vector<thresholds::Threshold>&& thresholds,
                        const std::string& sensorConfiguration,
                        const int busNumber) :
-    Sensor(boost::replace_all_copy(sensorName, " ", "_"),
-           std::move(_thresholds), sensorConfiguration,
-           "xyz.openbmc_project.Configuration.NVMe", maxReading, minReading,
-           conn, PowerState::on),
+    Sensor(boost::replace_all_copy(sensorName, " ", "_"), std::move(thresholds),
+           sensorConfiguration, "xyz.openbmc_project.Configuration.NVMe",
+           maxReading, minReading, conn, PowerState::on),
     objServer(objectServer), bus(busNumber)
 {
     sensorInterface = objectServer.add_interface(
diff --git a/src/NVMeSensorMain.cpp b/src/NVMeSensorMain.cpp
index 0552fad..21e722f 100644
--- a/src/NVMeSensorMain.cpp
+++ b/src/NVMeSensorMain.cpp
@@ -14,8 +14,7 @@
 // limitations under the License.
 */
 
-#include "NVMeSensor.hpp"
-
+#include <NVMeSensor.hpp>
 #include <boost/asio/deadline_timer.hpp>
 
 #include <regex>
@@ -25,7 +24,7 @@
 
 static NVMEMap nvmeDeviceMap;
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 NVMEMap& getNVMEMap()
 {
diff --git a/src/PSUEvent.cpp b/src/PSUEvent.cpp
index 4266918..375c24d 100644
--- a/src/PSUEvent.cpp
+++ b/src/PSUEvent.cpp
@@ -14,10 +14,9 @@
 // limitations under the License.
 */
 
-#include "PSUEvent.hpp"
-
 #include <systemd/sd-journal.h>
 
+#include <PSUEvent.hpp>
 #include <boost/asio/io_service.hpp>
 #include <boost/asio/read_until.hpp>
 #include <boost/container/flat_map.hpp>
@@ -145,10 +144,10 @@
     std::shared_ptr<std::set<std::string>> combineEvent,
     std::shared_ptr<bool> state, const std::string& psuName) :
     std::enable_shared_from_this<PSUSubEvent>(),
-    eventInterface(eventInterface), asserts(asserts),
-    combineEvent(combineEvent), assertState(state), errCount(0), path(path),
-    eventName(eventName), waitTimer(io), inputDev(io), psuName(psuName),
-    groupEventName(groupEventName), systemBus(conn)
+    eventInterface(std::move(eventInterface)), asserts(std::move(asserts)),
+    combineEvent(std::move(combineEvent)), assertState(std::move(state)),
+    errCount(0), path(path), eventName(eventName), waitTimer(io), inputDev(io),
+    psuName(psuName), groupEventName(groupEventName), systemBus(conn)
 {
     fd = open(path.c_str(), O_RDONLY);
     if (fd < 0)
@@ -174,7 +173,7 @@
     if (fanPos != std::string::npos)
     {
         fanName = path.substr(fanPos);
-        auto fanNamePos = fanName.find("_");
+        auto fanNamePos = fanName.find('_');
         if (fanNamePos != std::string::npos)
         {
             fanName = fanName.substr(0, fanNamePos);
diff --git a/src/PSUSensor.cpp b/src/PSUSensor.cpp
index 25cc5ad..e292863 100644
--- a/src/PSUSensor.cpp
+++ b/src/PSUSensor.cpp
@@ -14,10 +14,9 @@
 // limitations under the License.
 */
 
-#include "PSUSensor.hpp"
-
 #include <unistd.h>
 
+#include <PSUSensor.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/asio/read_until.hpp>
@@ -34,25 +33,25 @@
 
 static constexpr const char* sensorPathPrefix = "/xyz/openbmc_project/sensors/";
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 PSUSensor::PSUSensor(const std::string& path, const std::string& objectType,
                      sdbusplus::asio::object_server& objectServer,
                      std::shared_ptr<sdbusplus::asio::connection>& conn,
                      boost::asio::io_service& io, const std::string& sensorName,
-                     std::vector<thresholds::Threshold>&& _thresholds,
+                     std::vector<thresholds::Threshold>&& thresholdsIn,
                      const std::string& sensorConfiguration,
                      std::string& sensorTypeName, unsigned int factor,
                      double max, double min, const std::string& label,
                      size_t tSize) :
     Sensor(boost::replace_all_copy(sensorName, " ", "_"),
-           std::move(_thresholds), sensorConfiguration, objectType, max, min,
+           std::move(thresholdsIn), sensorConfiguration, objectType, max, min,
            conn),
     std::enable_shared_from_this<PSUSensor>(), objServer(objectServer),
     inputDev(io), waitTimer(io), path(path), pathRatedMax(""), pathRatedMin(""),
     sensorFactor(factor), minMaxReadCounter(0)
 {
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cerr << "Constructed sensor: path " << path << " type "
                   << objectType << " config " << sensorConfiguration
@@ -88,7 +87,7 @@
     // This should be called before initializing association.
     // createInventoryAssoc() does add more associations before doing
     // register and initialize "Associations" property.
-    if (label.empty() || tSize == _thresholds.size())
+    if (label.empty() || tSize == thresholds.size())
     {
         setInitialProperties(conn);
     }
@@ -110,7 +109,7 @@
             pathRatedMin = boost::replace_all_copy(path, item, "rated_min");
         }
     }
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cerr << "File: " << pathRatedMax
                   << " will be used to update MaxValue\n";
diff --git a/src/PSUSensorMain.cpp b/src/PSUSensorMain.cpp
index b8966a6..3397ea8 100644
--- a/src/PSUSensorMain.cpp
+++ b/src/PSUSensorMain.cpp
@@ -14,10 +14,9 @@
 // limitations under the License.
 */
 
-#include "PSUEvent.hpp"
-#include "PSUSensor.hpp"
-#include "Utils.hpp"
-
+#include <PSUEvent.hpp>
+#include <PSUSensor.hpp>
+#include <Utils.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
@@ -38,7 +37,7 @@
 #include <variant>
 #include <vector>
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 
 static constexpr std::array<const char*, 17> sensorTypes = {
     "xyz.openbmc_project.Configuration.ADM1272",
@@ -102,7 +101,9 @@
         const std::string& eventName = match.first;
         for (const auto& eventAttr : eventAttrs)
         {
-            auto eventPath = directory + "/" + eventAttr;
+            std::string eventPath = directory;
+            eventPath += "/";
+            eventPath += eventAttr;
 
             std::ifstream eventFile(eventPath);
             if (!eventFile.good())
@@ -141,7 +142,9 @@
             const std::vector<std::string>& eventAttrs = match.second;
             for (const auto& eventAttr : eventAttrs)
             {
-                auto eventPath = directory + "/" + eventAttr;
+                std::string eventPath = directory;
+                eventPath += "/";
+                eventPath += eventAttr;
                 std::ifstream eventFile(eventPath);
                 if (!eventFile.good())
                 {
@@ -279,7 +282,7 @@
 
         fs::path device = directory / "device";
         std::string deviceName = fs::canonical(device).stem();
-        auto findHyphen = deviceName.find("-");
+        auto findHyphen = deviceName.find('-');
         if (findHyphen == std::string::npos)
         {
             std::cerr << "found bad device" << deviceName << "\n";
@@ -294,7 +297,7 @@
         try
         {
             bus = std::stoi(busStr);
-            addr = std::stoi(addrStr, 0, 16);
+            addr = std::stoi(addrStr, nullptr, 16);
         }
         catch (std::invalid_argument&)
         {
@@ -432,7 +435,7 @@
         /* read max value in sysfs for in, curr, power, temp, ... */
         if (!findFiles(directory, R"(\w\d+_max$)", sensorPaths, 0))
         {
-            if constexpr (DEBUG)
+            if constexpr (debug)
             {
                 std::cerr << "No max name in PSU \n";
             }
@@ -473,7 +476,7 @@
             std::string labelPath;
 
             /* find and differentiate _max and _input to replace "label" */
-            size_t pos = sensorPathStr.find("_");
+            size_t pos = sensorPathStr.find('_');
             if (pos != std::string::npos)
             {
 
@@ -499,14 +502,14 @@
             std::ifstream labelFile(labelPath);
             if (!labelFile.good())
             {
-                if constexpr (DEBUG)
+                if constexpr (debug)
                 {
                     std::cerr << "Input file " << sensorPath
                               << " has no corresponding label file\n";
                 }
                 // hwmon *_input filename with number:
                 // temp1, temp2, temp3, ...
-                labelHead = sensorNameStr.substr(0, sensorNameStr.find("_"));
+                labelHead = sensorNameStr.substr(0, sensorNameStr.find('_'));
             }
             else
             {
@@ -521,16 +524,16 @@
 
                 // hwmon corresponding *_label file contents:
                 // vin1, vout1, ...
-                labelHead = label.substr(0, label.find(" "));
+                labelHead = label.substr(0, label.find(' '));
             }
 
             /* append "max" for labelMatch */
             if (maxLabel)
             {
-                labelHead = "max" + labelHead;
+                labelHead.insert(0, "max");
             }
 
-            if constexpr (DEBUG)
+            if constexpr (debug)
             {
                 std::cerr << "Sensor type=\"" << sensorNameSubStr
                           << "\" label=\"" << labelHead << "\"\n";
@@ -545,7 +548,7 @@
                 if (std::find(findLabels.begin(), findLabels.end(),
                               labelHead) == findLabels.end())
                 {
-                    if constexpr (DEBUG)
+                    if constexpr (debug)
                     {
                         std::cerr << "could not find " << labelHead
                                   << " in the Labels list\n";
@@ -557,7 +560,7 @@
             auto findProperty = labelMatch.find(labelHead);
             if (findProperty == labelMatch.end())
             {
-                if constexpr (DEBUG)
+                if constexpr (debug)
                 {
                     std::cerr << "Could not find matching default property for "
                               << labelHead << "\n";
@@ -697,7 +700,7 @@
 
                 psuNameFromIndex = psuNames[nameIndex];
 
-                if constexpr (DEBUG)
+                if constexpr (debug)
                 {
                     std::cerr << "Sensor label head " << labelHead
                               << " paired with " << psuNameFromIndex
@@ -717,7 +720,8 @@
                 factor = std::pow(10.0, factor);
 
                 /* Change first char of substring to uppercase */
-                char firstChar = sensorNameSubStr[0] - 0x20;
+                char firstChar =
+                    static_cast<char>(std::toupper(sensorNameSubStr[0]));
                 std::string strScaleFactor =
                     firstChar + sensorNameSubStr.substr(1) + "ScaleFactor";
 
@@ -730,7 +734,7 @@
                                         findScaleFactor->second);
                 }
 
-                if constexpr (DEBUG)
+                if constexpr (debug)
                 {
                     std::cerr << "Sensor scaling factor " << factor
                               << " string " << strScaleFactor << "\n";
@@ -753,7 +757,7 @@
                 continue;
             }
 
-            if constexpr (DEBUG)
+            if constexpr (debug)
             {
                 std::cerr << "Sensor properties: Name \""
                           << psuProperty->labelTypeName << "\" Scale "
@@ -781,7 +785,7 @@
                     psuNameFromIndex + " " + psuProperty->labelTypeName;
             }
 
-            if constexpr (DEBUG)
+            if constexpr (debug)
             {
                 std::cerr << "Sensor name \"" << sensorName << "\" path \""
                           << sensorPathStr << "\" type \"" << sensorType
@@ -796,7 +800,7 @@
                 psuProperty->minReading, labelHead, thresholdConfSize);
             sensors[sensorName]->setupRead();
             ++numCreated;
-            if constexpr (DEBUG)
+            if constexpr (debug)
             {
                 std::cerr << "Created " << numCreated << " sensors so far\n";
             }
@@ -810,7 +814,7 @@
                 groupEventPathList, "OperationalStatus");
     }
 
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         std::cerr << "Created total of " << numCreated << " sensors\n";
     }
@@ -953,7 +957,7 @@
                 {
                     return;
                 }
-                else if (ec)
+                if (ec)
                 {
                     std::cerr << "timer error\n";
                 }
diff --git a/src/PwmSensor.cpp b/src/PwmSensor.cpp
index 8993f2b..bd9c9d6 100644
--- a/src/PwmSensor.cpp
+++ b/src/PwmSensor.cpp
@@ -13,10 +13,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 */
-#include "PwmSensor.hpp"
-
-#include "Utils.hpp"
-
+#include <PwmSensor.hpp>
+#include <Utils.hpp>
 #include <sdbusplus/asio/object_server.hpp>
 
 #include <fstream>
diff --git a/src/TachSensor.cpp b/src/TachSensor.cpp
index 0490135..bffc30e 100644
--- a/src/TachSensor.cpp
+++ b/src/TachSensor.cpp
@@ -14,12 +14,10 @@
 // limitations under the License.
 */
 
-#include "TachSensor.hpp"
-
-#include "Utils.hpp"
-
 #include <unistd.h>
 
+#include <TachSensor.hpp>
+#include <Utils.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/asio/read_until.hpp>
@@ -48,12 +46,12 @@
                        std::unique_ptr<PresenceSensor>&& presenceSensor,
                        std::optional<RedundancySensor>* redundancy,
                        boost::asio::io_service& io, const std::string& fanName,
-                       std::vector<thresholds::Threshold>&& _thresholds,
+                       std::vector<thresholds::Threshold>&& thresholds,
                        const std::string& sensorConfiguration,
                        const std::pair<size_t, size_t>& limits,
                        const PowerState& powerState,
                        const std::optional<std::string>& ledIn) :
-    Sensor(boost::replace_all_copy(fanName, " ", "_"), std::move(_thresholds),
+    Sensor(boost::replace_all_copy(fanName, " ", "_"), std::move(thresholds),
            sensorConfiguration, objectType, limits.second, limits.first, conn,
            powerState),
     objServer(objectServer), redundancy(redundancy),
@@ -255,7 +253,7 @@
                           {
                               return; // we're being destroyed
                           }
-                          else if (ec)
+                          if (ec)
                           {
                               std::cerr << "Error on presence sensor " << name
                                         << " \n";
@@ -330,7 +328,7 @@
             newState = redundancy::failed;
             break;
         }
-        else if (failedCount)
+        if (failedCount)
         {
             newState = redundancy::degraded;
         }
diff --git a/src/Thresholds.cpp b/src/Thresholds.cpp
index f4d4ed0..df56b21 100644
--- a/src/Thresholds.cpp
+++ b/src/Thresholds.cpp
@@ -1,11 +1,8 @@
-#include "Thresholds.hpp"
-
-#include "VariantVisitors.hpp"
-#include "sensor.hpp"
-
+#include <Thresholds.hpp>
+#include <VariantVisitors.hpp>
 #include <boost/algorithm/string/replace.hpp>
 #include <boost/container/flat_map.hpp>
-#include <boost/lexical_cast.hpp>
+#include <sensor.hpp>
 
 #include <array>
 #include <cmath>
@@ -19,7 +16,7 @@
 #include <variant>
 #include <vector>
 
-static constexpr bool DEBUG = false;
+static constexpr bool debug = false;
 namespace thresholds
 {
 unsigned int toBusValue(const Level& level)
@@ -75,10 +72,14 @@
         {
             auto labelFind = item.second.find("Label");
             if (labelFind == item.second.end())
+            {
                 continue;
+            }
             if (std::visit(VariantToStringVisitor(), labelFind->second) !=
                 *matchLabel)
+            {
                 continue;
+            }
         }
         auto directionFind = item.second.find("Direction");
         auto severityFind = item.second.find("Severity");
@@ -323,7 +324,7 @@
         }
     }
 
-    if constexpr (DEBUG)
+    if constexpr (debug)
     {
         // Throttle debug output, so that it does not continuously spam
         ++cDebugThrottle;
@@ -491,7 +492,7 @@
                 if (auto val = readFile(attrPath, scaleFactor))
                 {
                     *val += offset;
-                    if (DEBUG)
+                    if (debug)
                     {
                         std::cout << "Threshold: " << attrPath << ": " << *val
                                   << "\n";
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 899ec98..5217129 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -14,8 +14,7 @@
 // limitations under the License.
 */
 
-#include "Utils.hpp"
-
+#include <Utils.hpp>
 #include <boost/algorithm/string/predicate.hpp>
 #include <boost/container/flat_map.hpp>
 #include <sdbusplus/asio/connection.hpp>
@@ -130,6 +129,14 @@
 bool getSensorConfiguration(
     const std::string& type,
     const std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
+    ManagedObjectType& resp)
+{
+    return getSensorConfiguration(type, dbusConnection, resp, false);
+}
+
+bool getSensorConfiguration(
+    const std::string& type,
+    const std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
     ManagedObjectType& resp, bool useCache)
 {
     static ManagedObjectType managedObj;
@@ -182,25 +189,31 @@
     return true;
 }
 
-bool findFiles(const fs::path dirPath, const std::string& matchString,
-               std::vector<fs::path>& foundPaths, unsigned int symlinkDepth)
+bool findFiles(const fs::path& dirPath, const std::string& matchString,
+               std::vector<fs::path>& foundPaths, int symlinkDepth)
 {
     if (!fs::exists(dirPath))
+    {
         return false;
+    }
 
     std::regex search(matchString);
     std::smatch match;
-    for (auto& p : fs::recursive_directory_iterator(dirPath))
+    for (auto p = fs::recursive_directory_iterator(
+             dirPath, fs::directory_options::follow_directory_symlink);
+         p != fs::recursive_directory_iterator(); ++p)
     {
-        std::string path = p.path().string();
-        if (!is_directory(p))
+        std::string path = p->path().string();
+        if (!is_directory(*p))
         {
             if (std::regex_search(path, match, search))
-                foundPaths.emplace_back(p.path());
+            {
+                foundPaths.emplace_back(p->path());
+            }
         }
-        else if (is_symlink(p) && symlinkDepth)
+        if (p.depth() >= symlinkDepth)
         {
-            findFiles(p.path(), matchString, foundPaths, symlinkDepth - 1);
+            p.disable_recursion_pending();
         }
     }
     return true;
@@ -328,7 +341,7 @@
                     {
                         return;
                     }
-                    else if (ec)
+                    if (ec)
                     {
                         std::cerr << "Timer error " << ec.message() << "\n";
                         return;
@@ -390,15 +403,15 @@
         std::filesystem::path p(path);
 
         std::vector<Association> associations;
-        associations.push_back(
-            Association("chassis", "all_sensors", p.parent_path().string()));
+        associations.emplace_back("chassis", "all_sensors",
+                                  p.parent_path().string());
         association->register_property("Associations", associations);
         association->initialize();
     }
 }
 
 void setInventoryAssociation(
-    std::shared_ptr<sdbusplus::asio::dbus_interface> association,
+    const std::shared_ptr<sdbusplus::asio::dbus_interface>& association,
     const std::string& path,
     const std::vector<std::string>& chassisPaths = std::vector<std::string>())
 {
@@ -408,13 +421,12 @@
         std::vector<Association> associations;
         std::string objPath(p.parent_path().string());
 
-        associations.push_back(Association("inventory", "sensors", objPath));
-        associations.push_back(Association("chassis", "all_sensors", objPath));
+        associations.emplace_back("inventory", "sensors", objPath);
+        associations.emplace_back("chassis", "all_sensors", objPath);
 
         for (const std::string& chassisPath : chassisPaths)
         {
-            associations.push_back(
-                Association("chassis", "all_sensors", chassisPath));
+            associations.emplace_back("chassis", "all_sensors", chassisPath);
         }
 
         association->register_property("Associations", associations);
@@ -423,8 +435,8 @@
 }
 
 void createInventoryAssoc(
-    std::shared_ptr<sdbusplus::asio::connection> conn,
-    std::shared_ptr<sdbusplus::asio::dbus_interface> association,
+    const std::shared_ptr<sdbusplus::asio::connection>& conn,
+    const std::shared_ptr<sdbusplus::asio::dbus_interface>& association,
     const std::string& path)
 {
     if (!association)
