diff --git a/src/ADCSensor.cpp b/src/ADCSensor.cpp
index c94f251..2141ac4 100644
--- a/src/ADCSensor.cpp
+++ b/src/ADCSensor.cpp
@@ -165,7 +165,7 @@
             }
             errCount = 0;
         }
-        catch (std::invalid_argument)
+        catch (std::invalid_argument&)
         {
             errCount++;
         }
diff --git a/src/ADCSensorMain.cpp b/src/ADCSensorMain.cpp
index 7cb31d0..188aad9 100644
--- a/src/ADCSensorMain.cpp
+++ b/src/ADCSensorMain.cpp
@@ -248,7 +248,7 @@
     }
 }
 
-int main(int argc, char** argv)
+int main()
 {
     boost::asio::io_service io;
     auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
diff --git a/src/CPUSensorMain.cpp b/src/CPUSensorMain.cpp
index 2f2319d..2588221 100644
--- a/src/CPUSensorMain.cpp
+++ b/src/CPUSensorMain.cpp
@@ -154,7 +154,7 @@
             bus = std::stoi(busStr);
             addr = std::stoi(addrStr, 0, 16);
         }
-        catch (std::invalid_argument)
+        catch (std::invalid_argument&)
         {
             continue;
         }
@@ -243,7 +243,7 @@
 
         auto directory = hwmonNamePath.parent_path();
         std::vector<fs::path> inputPaths;
-        if (!findFiles(fs::path(directory), R"(temp\d+_input$)", inputPaths, 0))
+        if (!findFiles(directory, R"(temp\d+_input$)", inputPaths, 0))
         {
             std::cerr << "No temperature sensors in system\n";
             continue;
@@ -645,7 +645,7 @@
     return false;
 }
 
-int main(int argc, char** argv)
+int main()
 {
     boost::asio::io_service io;
     auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
diff --git a/src/ChassisIntrusionSensor.cpp b/src/ChassisIntrusionSensor.cpp
index 4bf7fdc..f10e9b9 100644
--- a/src/ChassisIntrusionSensor.cpp
+++ b/src/ChassisIntrusionSensor.cpp
@@ -43,9 +43,6 @@
 // Status bit field masks
 const static constexpr size_t pchRegMaskIntrusion = 0x01;
 
-// Hold current PCH register values
-static unsigned int intrudeValue;
-
 // gpio sysfs path
 constexpr const char* gpioPath = "/sys/class/gpio/";
 
@@ -104,7 +101,7 @@
         return -1;
     }
 
-    unsigned int statusValue;
+    int statusValue;
     unsigned int statusMask = pchRegMaskIntrusion;
     unsigned int statusReg = pchStatusRegIntrusion;
 
diff --git a/src/ExitAirTempSensor.cpp b/src/ExitAirTempSensor.cpp
index a4aba4b..972b42b 100644
--- a/src/ExitAirTempSensor.cpp
+++ b/src/ExitAirTempSensor.cpp
@@ -266,8 +266,7 @@
 
 void CFMSensor::createMaxCFMIface(void)
 {
-    cfmLimitIface->register_property("Limit", static_cast<double>(c2) * maxCFM *
-                                                  tachs.size());
+    cfmLimitIface->register_property("Limit", c2 * maxCFM * tachs.size());
     cfmLimitIface->initialize();
 }
 
@@ -686,7 +685,7 @@
                                         (qMax - qMin) * (cfm - qMin));
     }
 
-    totalPower *= powerFactor;
+    totalPower *= static_cast<double>(powerFactor);
     totalPower += pOffset;
 
     if (totalPower == 0)
@@ -709,7 +708,7 @@
 
     // Calculate the exit air temp
     // Texit = Tfp + (1.76 * TotalPower / CFM * Faltitude)
-    double reading = 1.76 * totalPower * altitudeFactor;
+    double reading = 1.76 * totalPower * static_cast<double>(altitudeFactor);
     reading /= cfm;
     reading += inletTemp;
 
@@ -890,7 +889,7 @@
         "GetManagedObjects");
 }
 
-int main(int argc, char** argv)
+int main()
 {
 
     boost::asio::io_service io;
@@ -906,7 +905,7 @@
     boost::asio::deadline_timer configTimer(io);
 
     std::function<void(sdbusplus::message::message&)> eventHandler =
-        [&](sdbusplus::message::message& message) {
+        [&](sdbusplus::message::message&) {
             configTimer.expires_from_now(boost::posix_time::seconds(1));
             // create a timer because normally multiple properties change
             configTimer.async_wait([&](const boost::system::error_code& ec) {
diff --git a/src/FanMain.cpp b/src/FanMain.cpp
index eeface8..b0237c2 100644
--- a/src/FanMain.cpp
+++ b/src/FanMain.cpp
@@ -165,7 +165,8 @@
                 sensorData = &(sensor.second);
                 break;
             }
-            else if (baseType == "xyz.openbmc_project.Configuration.I2CFan")
+            else if (baseType ==
+                     std::string("xyz.openbmc_project.Configuration.I2CFan"))
             {
                 auto findBus = baseConfiguration->second.find("Bus");
                 auto findAddress = baseConfiguration->second.find("Address");
@@ -374,7 +375,7 @@
         "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
 }
 
-int main(int argc, char** argv)
+int main()
 {
     boost::asio::io_service io;
     auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
@@ -435,7 +436,7 @@
     // redundancy sensor
     std::function<void(sdbusplus::message::message&)> redundancyHandler =
         [&tachSensors, &systemBus,
-         &objectServer](sdbusplus::message::message& message) {
+         &objectServer](sdbusplus::message::message&) {
             createRedundancySensor(tachSensors, systemBus, objectServer);
         };
     auto match = std::make_unique<sdbusplus::bus::match::match>(
@@ -443,7 +444,7 @@
         "type='signal',member='PropertiesChanged',path_namespace='" +
             std::string(inventoryPath) + "',arg0namespace='" +
             redundancyConfiguration + "'",
-        redundancyHandler);
+        std::move(redundancyHandler));
     matches.emplace_back(std::move(match));
 
     io.run();
diff --git a/src/HwmonTempMain.cpp b/src/HwmonTempMain.cpp
index 2b1d7c1..7eaea30 100644
--- a/src/HwmonTempMain.cpp
+++ b/src/HwmonTempMain.cpp
@@ -79,7 +79,7 @@
             continue; // already searched this path
         }
 
-        auto device = fs::path(directory / "device");
+        fs::path device = directory / "device";
         std::string deviceName = fs::canonical(device).stem();
         auto findHyphen = deviceName.find("-");
         if (findHyphen == std::string::npos)
@@ -97,7 +97,7 @@
             bus = std::stoi(busStr);
             addr = std::stoi(addrStr, 0, 16);
         }
-        catch (std::invalid_argument)
+        catch (std::invalid_argument&)
         {
             continue;
         }
@@ -208,7 +208,7 @@
     }
 }
 
-int main(int argc, char** argv)
+int main()
 {
     boost::asio::io_service io;
     auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
diff --git a/src/HwmonTempSensor.cpp b/src/HwmonTempSensor.cpp
index 09161e4..16742ce 100644
--- a/src/HwmonTempSensor.cpp
+++ b/src/HwmonTempSensor.cpp
@@ -103,7 +103,7 @@
         {
             float nvalue = std::stof(response);
             nvalue /= sensorScaleFactor;
-            if (nvalue != value)
+            if (static_cast<double>(nvalue) != value)
             {
                 updateValue(nvalue);
             }
diff --git a/src/IpmbSensor.cpp b/src/IpmbSensor.cpp
index 738ef57..b3cc104 100644
--- a/src/IpmbSensor.cpp
+++ b/src/IpmbSensor.cpp
@@ -422,7 +422,7 @@
     }
 }
 
-int main(int argc, char** argv)
+int main()
 {
 
     boost::asio::io_service io;
@@ -437,7 +437,7 @@
     boost::asio::deadline_timer configTimer(io);
 
     std::function<void(sdbusplus::message::message&)> eventHandler =
-        [&](sdbusplus::message::message& message) {
+        [&](sdbusplus::message::message&) {
             configTimer.expires_from_now(boost::posix_time::seconds(1));
             // create a timer because normally multiple properties change
             configTimer.async_wait([&](const boost::system::error_code& ec) {
diff --git a/src/MCUTempSensor.cpp b/src/MCUTempSensor.cpp
index fd45327..0b621d0 100644
--- a/src/MCUTempSensor.cpp
+++ b/src/MCUTempSensor.cpp
@@ -105,7 +105,6 @@
 {
     std::string i2cBus = "/dev/i2c-" + std::to_string(busId);
     int fd = open(i2cBus.c_str(), O_RDWR);
-    size_t i = 0;
 
     if (fd < 0)
     {
@@ -172,7 +171,7 @@
             double v = static_cast<double>(temp) / 1000;
             if constexpr (debug)
             {
-                std::cerr << "Value update to " << (double)v << "raw reading "
+                std::cerr << "Value update to " << v << "raw reading "
                           << static_cast<int>(temp) << "\n";
             }
             updateValue(v);
@@ -264,7 +263,7 @@
         "GetManagedObjects");
 }
 
-int main(int argc, char** argv)
+int main()
 {
     boost::asio::io_service io;
     auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
@@ -276,7 +275,7 @@
     boost::asio::deadline_timer configTimer(io);
 
     std::function<void(sdbusplus::message::message&)> eventHandler =
-        [&](sdbusplus::message::message& message) {
+        [&](sdbusplus::message::message&) {
             configTimer.expires_from_now(boost::posix_time::seconds(1));
             // create a timer because normally multiple properties change
             configTimer.async_wait([&](const boost::system::error_code& ec) {
diff --git a/src/PSUEvent.cpp b/src/PSUEvent.cpp
index 5bfa1e4..84b7097 100644
--- a/src/PSUEvent.cpp
+++ b/src/PSUEvent.cpp
@@ -31,7 +31,7 @@
         "/xyz/openbmc_project/State/Decorator/" + psuName + "_" +
             combineEventName,
         "xyz.openbmc_project.State.Decorator.OperationalStatus");
-    eventInterface->register_property("functional", bool(true));
+    eventInterface->register_property("functional", true);
 
     if (!eventInterface->initialize())
     {
diff --git a/src/PSUSensor.cpp b/src/PSUSensor.cpp
index fdd453a..58dee54 100644
--- a/src/PSUSensor.cpp
+++ b/src/PSUSensor.cpp
@@ -97,7 +97,7 @@
             float nvalue = std::stof(response);
             responseStream.clear();
             nvalue /= sensorFactor;
-            if (nvalue != value)
+            if (static_cast<double>(nvalue) != value)
             {
                 updateValue(nvalue);
             }
diff --git a/src/PSUSensorMain.cpp b/src/PSUSensorMain.cpp
index 99f6701..49c3a08 100644
--- a/src/PSUSensorMain.cpp
+++ b/src/PSUSensorMain.cpp
@@ -198,7 +198,7 @@
             continue; // check if path has already been searched
         }
 
-        auto device = fs::path(directory / "device");
+        fs::path device = directory / "device";
         std::string deviceName = fs::canonical(device).stem();
         auto findHyphen = deviceName.find("-");
         if (findHyphen == std::string::npos)
@@ -217,7 +217,7 @@
             bus = std::stoi(busStr);
             addr = std::stoi(addrStr, 0, 16);
         }
-        catch (std::invalid_argument)
+        catch (std::invalid_argument&)
         {
             continue;
         }
@@ -309,7 +309,7 @@
         } while (findPSUName != baseConfig->second.end());
 
         std::vector<fs::path> sensorPaths;
-        if (!findFiles(fs::path(directory), R"(\w\d+_input$)", sensorPaths, 0))
+        if (!findFiles(directory, R"(\w\d+_input$)", sensorPaths, 0))
         {
             std::cerr << "No PSU non-label sensor in PSU\n";
             continue;
@@ -336,7 +336,7 @@
             std::string labelPathStr =
                 boost::replace_all_copy(sensorNameStr, "input", "label");
             std::vector<fs::path> labelPaths;
-            if (!findFiles(fs::path(directory), labelPathStr, labelPaths, 0))
+            if (!findFiles(directory, labelPathStr, labelPaths, 0))
             {
                 std::cerr << "No PSU non-label sensor in PSU\n";
                 continue;
@@ -482,7 +482,7 @@
         {"FanFault", {"fan1_alarm", "fan2_alarm", "fan1_fault", "fan2_fault"}}};
 }
 
-int main(int argc, char** argv)
+int main()
 {
     boost::asio::io_service io;
     auto systemBus = std::make_shared<sdbusplus::asio::connection>(io);
diff --git a/src/PwmSensor.cpp b/src/PwmSensor.cpp
index 6402ad0..d8a7a17 100644
--- a/src/PwmSensor.cpp
+++ b/src/PwmSensor.cpp
@@ -22,7 +22,6 @@
 #include <sdbusplus/asio/object_server.hpp>
 
 static constexpr size_t pwmMax = 255;
-static constexpr size_t pwmMin = 0;
 
 PwmSensor::PwmSensor(const std::string& name, const std::string& sysPath,
                      sdbusplus::asio::object_server& objectServer,
@@ -36,7 +35,7 @@
         "/xyz/openbmc_project/sensors/fan_pwm/" + name,
         "xyz.openbmc_project.Sensor.Value");
     uint32_t pwmValue = getValue(false);
-    double fValue = 100.0 * (static_cast<float>(pwmValue) / pwmMax);
+    double fValue = 100.0 * (static_cast<double>(pwmValue) / pwmMax);
     sensorInterface->register_property(
         "Value", fValue,
         [this](const double& req, double& resp) {
@@ -58,7 +57,7 @@
             return 1;
         },
         [this](double& curVal) {
-            float value = 100.0 * (static_cast<float>(getValue()) / pwmMax);
+            double value = 100.0 * (static_cast<double>(getValue()) / pwmMax);
             if (curVal != value)
             {
                 curVal = value;
@@ -78,7 +77,7 @@
     controlInterface->register_property(
         "Target", static_cast<uint64_t>(pwmValue),
         [this](const uint64_t& req, uint64_t& resp) {
-            if (req > pwmMax || req < pwmMin)
+            if (req > pwmMax)
             {
                 throw std::runtime_error("Value out of range");
                 return -1;
@@ -149,7 +148,7 @@
         uint32_t value = std::stoi(line);
         return value;
     }
-    catch (std::invalid_argument)
+    catch (std::invalid_argument&)
     {
         std::cerr << "Error reading pwm at " << sysPath << "\n";
         // throw if not initial read to be caught by dbus bindings
diff --git a/src/TachSensor.cpp b/src/TachSensor.cpp
index 45ac7ac..46f5389 100644
--- a/src/TachSensor.cpp
+++ b/src/TachSensor.cpp
@@ -142,7 +142,7 @@
                 std::getline(responseStream, response);
                 float nvalue = std::stof(response);
                 responseStream.clear();
-                if (nvalue != value)
+                if (static_cast<double>(nvalue) != value)
                 {
                     updateValue(nvalue);
                 }
diff --git a/src/Thresholds.cpp b/src/Thresholds.cpp
index 3dd444d..f07f086 100644
--- a/src/Thresholds.cpp
+++ b/src/Thresholds.cpp
@@ -333,7 +333,7 @@
     const std::string& inputPath, const double& scaleFactor,
     const double& offset)
 {
-    for (auto& type : attrTypes)
+    for (const std::string& type : attrTypes)
     {
         auto attrPath = boost::replace_all_copy(inputPath, "input", type);
         std::ifstream attrFile(attrPath);
