diff --git a/include/multipart_parser.hpp b/include/multipart_parser.hpp
index abc1657..5ac196d 100644
--- a/include/multipart_parser.hpp
+++ b/include/multipart_parser.hpp
@@ -74,13 +74,12 @@
         lookbehind.resize(boundary.size() + 8);
         state = State::START;
 
-        const char* buffer = req.body().data();
-        size_t len = req.body().size();
+        const std::string& buffer = req.body();
+        size_t len = buffer.size();
         char cl = 0;
 
         for (size_t i = 0; i < len; i++)
         {
-            // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
             char c = buffer[i];
             switch (state)
             {
@@ -142,8 +141,7 @@
                             return ParserError::ERROR_EMPTY_HEADER;
                         }
 
-                        // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
-                        currentHeaderName.append(buffer + headerFieldMark,
+                        currentHeaderName.append(&buffer[headerFieldMark],
                                                  i - headerFieldMark);
                         state = State::HEADER_VALUE_START;
                         break;
@@ -165,8 +163,7 @@
                 case State::HEADER_VALUE:
                     if (c == cr)
                     {
-                        // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
-                        std::string_view value(buffer + headerValueMark,
+                        std::string_view value(&buffer[headerValueMark],
                                                i - headerValueMark);
                         mime_fields.rbegin()->fields.set(currentHeaderName,
                                                          value);
@@ -199,13 +196,11 @@
                 {
                     if (index == 0)
                     {
-                        skipNonBoundary(buffer, len, boundary.size() - 1, i);
-
-                        // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
+                        skipNonBoundary(buffer, boundary.size() - 1, i);
                         c = buffer[i];
                     }
-                    const ParserError ec = processPartData(buffer, i, c);
-                    if (ec != ParserError::PARSER_SUCCESS)
+                    if (auto ec = processPartData(buffer, i, c);
+                        ec != ParserError::PARSER_SUCCESS)
                     {
                         return ec;
                     }
@@ -246,13 +241,12 @@
         return boundaryIndex[static_cast<unsigned char>(c)];
     }
 
-    void skipNonBoundary(const char* buffer, size_t len, size_t boundaryEnd,
+    void skipNonBoundary(const std::string& buffer, size_t boundaryEnd,
                          size_t& i)
     {
         // boyer-moore derived algorithm to safely skip non-boundary data
-        while (i + boundary.size() <= len)
+        while (i + boundary.size() <= buffer.length())
         {
-            // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
             if (isBoundaryChar(buffer[i + boundaryEnd]))
             {
                 break;
@@ -261,7 +255,7 @@
         }
     }
 
-    ParserError processPartData(const char* buffer, size_t& i, char c)
+    ParserError processPartData(const std::string& buffer, size_t& i, char c)
     {
         size_t prevIndex = index;
 
@@ -271,8 +265,7 @@
             {
                 if (index == 0)
                 {
-                    // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
-                    const char* start = buffer + partDataMark;
+                    const char* start = &buffer[partDataMark];
                     size_t size = i - partDataMark;
                     mime_fields.rbegin()->content += std::string_view(start,
                                                                       size);
