diff --git a/http/http_client.hpp b/http/http_client.hpp
index cb67022..99565be 100644
--- a/http/http_client.hpp
+++ b/http/http_client.hpp
@@ -243,13 +243,13 @@
         {
             return;
         }
+        auto& ssl = *sslConn;
         state = ConnState::handshakeInProgress;
         timer.expires_after(std::chrono::seconds(30));
         timer.async_wait(std::bind_front(onTimeout, weak_from_this()));
-        sslConn->async_handshake(
-            boost::asio::ssl::stream_base::client,
-            std::bind_front(&ConnectionInfo::afterSslHandshake, this,
-                            shared_from_this()));
+        ssl.async_handshake(boost::asio::ssl::stream_base::client,
+                            std::bind_front(&ConnectionInfo::afterSslHandshake,
+                                            this, shared_from_this()));
     }
 
     void afterSslHandshake(const std::shared_ptr<ConnectionInfo>& /*self*/,
diff --git a/http/http_connection.hpp b/http/http_connection.hpp
index 5277981..955cb34 100644
--- a/http/http_connection.hpp
+++ b/http/http_connection.hpp
@@ -630,16 +630,17 @@
             BMCWEB_LOG_ERROR("Parser was unexpectedly null");
             return;
         }
+        auto& parse = *parser;
+        const auto& value = parser->get();
 
         if (authenticationEnabled)
         {
-            boost::beast::http::verb method = parser->get().method();
+            boost::beast::http::verb method = value.method();
             userSession = authentication::authenticate(
-                ip, res, method, parser->get().base(), mtlsSession);
+                ip, res, method, value.base(), mtlsSession);
         }
 
-        std::string_view expect =
-            parser->get()[boost::beast::http::field::expect];
+        std::string_view expect = value[boost::beast::http::field::expect];
         if (bmcweb::asciiIEquals(expect, "100-continue"))
         {
             res.result(boost::beast::http::status::continue_);
@@ -652,9 +653,9 @@
             return;
         }
 
-        parser->body_limit(getContentLengthLimit());
+        parse.body_limit(getContentLengthLimit());
 
-        if (parser->is_done())
+        if (parse.is_done())
         {
             handle();
             return;
@@ -749,18 +750,19 @@
         {
             return;
         }
+        auto& parse = *parser;
         startDeadline();
         if (httpType == HttpType::HTTP)
         {
             boost::beast::http::async_read_some(
-                adaptor.next_layer(), buffer, *parser,
+                adaptor.next_layer(), buffer, parse,
                 std::bind_front(&self_type::afterRead, this,
                                 shared_from_this()));
         }
         else
         {
             boost::beast::http::async_read_some(
-                adaptor, buffer, *parser,
+                adaptor, buffer, parse,
                 std::bind_front(&self_type::afterRead, this,
                                 shared_from_this()));
         }
diff --git a/include/authentication.hpp b/include/authentication.hpp
index 3d026f3..c71b5ec 100644
--- a/include/authentication.hpp
+++ b/include/authentication.hpp
@@ -231,8 +231,7 @@
         {
             return true;
         }
-        if (crow::webroutes::routes.find(std::string(url)) !=
-            crow::webroutes::routes.end())
+        if (crow::webroutes::routes.contains(std::string(url)))
         {
             return true;
         }
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 5963486..d2bd48f8 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -210,7 +210,7 @@
             // An enumerate does not return the target path's properties
             continue;
         }
-        if (dataJson.find(path) == dataJson.end())
+        if (!dataJson.contains(path))
         {
             for (const auto& [service, interfaces] : interface_map)
             {
diff --git a/meson.build b/meson.build
index 4549ab2..74c0492 100644
--- a/meson.build
+++ b/meson.build
@@ -76,6 +76,8 @@
     add_project_arguments(
         '-Weverything',
         '-Wformat=2',
+        # https://github.com/llvm/llvm-project/issues/101614
+        '-fno-builtin-std-forward_like',
         '-Wno-c++20-extensions',
         '-Wno-c++23-extensions',
         '-Wno-c++26-extensions',
@@ -94,6 +96,7 @@
         '-Wno-switch-enum',
         '-Wno-unneeded-internal-declaration',
         '-Wno-unsafe-buffer-usage-in-container',
+        '-Wno-unsafe-buffer-usage-in-libc-call',
         '-Wno-unused-macros',
         '-Wno-used-but-marked-unused',
         '-Wno-weak-vtables',
diff --git a/redfish-core/lib/eventservice_sse.hpp b/redfish-core/lib/eventservice_sse.hpp
index eb0552f..bfd97c1 100644
--- a/redfish-core/lib/eventservice_sse.hpp
+++ b/redfish-core/lib/eventservice_sse.hpp
@@ -41,11 +41,11 @@
 
     if (filterIt != req.url().params().end())
     {
-        std::string_view filterValue = (*filterIt).value;
-        filter = parseFilter(filterValue);
+        const boost::urls::param& filterParam = *filterIt;
+        filter = parseFilter(filterParam.value);
         if (!filter)
         {
-            conn.close(std::format("Bad $filter param: {}", filterValue));
+            conn.close(std::format("Bad $filter param: {}", filterParam.value));
             return;
         }
     }
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 9151d59..781a41c 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -287,7 +287,7 @@
                                      std::string, std::vector<std::string>>>>&
                      object : subtree)
             {
-                if (sensorNames->find(object.first) != sensorNames->end())
+                if (sensorNames->contains(object.first))
                 {
                     for (const std::pair<std::string, std::vector<std::string>>&
                              objData : object.second)
@@ -1894,7 +1894,7 @@
                     const std::string& sensorName = split[5];
                     BMCWEB_LOG_DEBUG("sensorName {} sensorType {}", sensorName,
                                      sensorType);
-                    if (sensorNames->find(objPath) == sensorNames->end())
+                    if (!sensorNames->contains(objPath))
                     {
                         BMCWEB_LOG_DEBUG("{} not in sensor list ", sensorName);
                         continue;
