diff --git a/core/fxcrt/stl_util.h b/core/fxcrt/stl_util.h
index b956f7e..4925039 100644
--- a/core/fxcrt/stl_util.h
+++ b/core/fxcrt/stl_util.h
@@ -6,6 +6,7 @@
 #define CORE_FXCRT_STL_UTIL_H_
 
 #include <algorithm>
+#include <array>
 #include <memory>
 
 #include "core/fxcrt/compiler_specific.h"
diff --git a/xfa/fgas/layout/cfgas_char.cpp b/xfa/fgas/layout/cfgas_char.cpp
index 64edbfc..68b27c9 100644
--- a/xfa/fgas/layout/cfgas_char.cpp
+++ b/xfa/fgas/layout/cfgas_char.cpp
@@ -4,14 +4,10 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#if defined(UNSAFE_BUFFERS_BUILD)
-// TODO(crbug.com/pdfium/2154): resolve buffer safety issues.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "xfa/fgas/layout/cfgas_char.h"
 
 #include <algorithm>
+#include <array>
 #include <iterator>
 
 #include "core/fxcrt/check.h"
@@ -103,17 +99,17 @@
 };
 #undef PACK_NIBBLES
 
-const FX_BIDICLASS kNTypes[] = {
-    FX_BIDICLASS::kN,   FX_BIDICLASS::kL,   FX_BIDICLASS::kR,
-    FX_BIDICLASS::kAN,  FX_BIDICLASS::kEN,  FX_BIDICLASS::kAL,
-    FX_BIDICLASS::kNSM, FX_BIDICLASS::kCS,  FX_BIDICLASS::kES,
-    FX_BIDICLASS::kET,  FX_BIDICLASS::kBN,  FX_BIDICLASS::kBN,
-    FX_BIDICLASS::kN,   FX_BIDICLASS::kB,   FX_BIDICLASS::kRLO,
-    FX_BIDICLASS::kRLE, FX_BIDICLASS::kLRO, FX_BIDICLASS::kLRE,
-    FX_BIDICLASS::kPDF, FX_BIDICLASS::kON,
-};
+constexpr auto kNTypes = fxcrt::ToArray<const FX_BIDICLASS>(
+    {FX_BIDICLASS::kN,   FX_BIDICLASS::kL,   FX_BIDICLASS::kR,
+     FX_BIDICLASS::kAN,  FX_BIDICLASS::kEN,  FX_BIDICLASS::kAL,
+     FX_BIDICLASS::kNSM, FX_BIDICLASS::kCS,  FX_BIDICLASS::kES,
+     FX_BIDICLASS::kET,  FX_BIDICLASS::kBN,  FX_BIDICLASS::kBN,
+     FX_BIDICLASS::kN,   FX_BIDICLASS::kB,   FX_BIDICLASS::kRLO,
+     FX_BIDICLASS::kRLE, FX_BIDICLASS::kLRO, FX_BIDICLASS::kLRE,
+     FX_BIDICLASS::kPDF, FX_BIDICLASS::kON});
 
-const FX_BIDIWEAKSTATE kWeakStates[20][10] = {
+using WeakStateRow = std::array<const FX_BIDIWEAKSTATE, 10>;
+constexpr std::array<const WeakStateRow, 20> kWeakStateTable = {{
     {FX_BWSao, FX_BWSxl, FX_BWSxr, FX_BWScn, FX_BWScn, FX_BWSxa, FX_BWSxa,
      FX_BWSao, FX_BWSao, FX_BWSao},
     {FX_BWSro, FX_BWSxl, FX_BWSxr, FX_BWSra, FX_BWSre, FX_BWSxa, FX_BWSxr,
@@ -154,9 +150,10 @@
      FX_BWSro, FX_BWSro, FX_BWSret},
     {FX_BWSlo, FX_BWSxl, FX_BWSxr, FX_BWSla, FX_BWSle, FX_BWSxa, FX_BWSlet,
      FX_BWSlo, FX_BWSlo, FX_BWSlet},
-};
+}};
 
-const FX_BIDIWEAKACTION kWeakActions[20][10] = {
+using WeakActionRow = std::array<const FX_BIDIWEAKACTION, 10>;
+constexpr std::array<const WeakActionRow, 20> kWeakActionTable = {{
     {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxA, FX_BWAxxR,
      FX_BWAxxR, FX_BWAxxN, FX_BWAxxN, FX_BWAxxN},
     {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxE, FX_BWAxxR,
@@ -197,30 +194,33 @@
      FX_BWAxxE, FX_BWAxxN, FX_BWAxxN, FX_BWAxxE},
     {FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxx, FX_BWAxxL, FX_BWAxxR,
      FX_BWAxxL, FX_BWAxxN, FX_BWAxxN, FX_BWAxxL},
-};
+}};
 
-const FX_BIDINEUTRALSTATE kNeutralStates[6][5] = {
+using NeutralStateRow = std::array<const FX_BIDINEUTRALSTATE, 5>;
+constexpr std::array<const NeutralStateRow, 6> kNeutralStateTable = {{
     {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr},
     {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
     {FX_BNSrn, FX_BNSl, FX_BNSr, FX_BNSr, FX_BNSr},
     {FX_BNSln, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
     {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
     {FX_BNSna, FX_BNSl, FX_BNSr, FX_BNSa, FX_BNSl},
-};
+}};
 
-const FX_BIDINEUTRALACTION kNeutralActions[6][5] = {
+using NeutralActionRow = std::array<const FX_BIDINEUTRALACTION, 5>;
+constexpr std::array<const NeutralActionRow, 6> kNeutralActionTable = {{
     {FX_BNAIn, FX_BNAZero, FX_BNAZero, FX_BNAZero, FX_BNAZero},
     {FX_BNAIn, FX_BNAZero, FX_BNAZero, FX_BNAZero, FX_BNAnL},
     {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNARn},
     {FX_BNAIn, FX_BNALn, FX_BNAEn, FX_BNAEn, FX_BNALnL},
     {FX_BNAIn, FX_BNAZero, FX_BNAZero, FX_BNAZero, FX_BNAnL},
     {FX_BNAIn, FX_BNAEn, FX_BNARn, FX_BNARn, FX_BNAEn},
-};
+}};
 
-const uint8_t kAddLevel[2][4] = {
+using AddLevelRow = std::array<const uint8_t, 4>;
+constexpr std::array<const AddLevelRow, 2> kAddLevelTable = {{
     {0, 1, 2, 2},
     {1, 0, 1, 1},
-};
+}};
 
 FX_BIDICLASS Direction(int32_t val) {
   return FX_IsOdd(val) ? FX_BIDICLASS::kR : FX_BIDICLASS::kL;
@@ -244,31 +244,25 @@
 }
 
 FX_BIDIWEAKSTATE GetWeakState(FX_BIDIWEAKSTATE eState, FX_BIDICLASS eClass) {
-  DCHECK(static_cast<size_t>(eState) < std::size(kWeakStates));
-  DCHECK(static_cast<size_t>(eClass) < std::size(kWeakStates[0]));
-  return kWeakStates[static_cast<size_t>(eState)][static_cast<size_t>(eClass)];
+  return kWeakStateTable[static_cast<size_t>(eState)]
+                        [static_cast<size_t>(eClass)];
 }
 
 FX_BIDIWEAKACTION GetWeakAction(FX_BIDIWEAKSTATE eState, FX_BIDICLASS eClass) {
-  DCHECK(static_cast<size_t>(eState) < std::size(kWeakActions));
-  DCHECK(static_cast<size_t>(eClass) < std::size(kWeakActions[0]));
-  return kWeakActions[static_cast<size_t>(eState)][static_cast<size_t>(eClass)];
+  return kWeakActionTable[static_cast<size_t>(eState)]
+                         [static_cast<size_t>(eClass)];
 }
 
 FX_BIDINEUTRALSTATE GetNeutralState(FX_BIDINEUTRALSTATE eState,
                                     FX_BIDICLASS eClass) {
-  DCHECK(static_cast<size_t>(eState) < std::size(kNeutralStates));
-  DCHECK(static_cast<size_t>(eClass) < std::size(kNeutralStates[0]));
-  return kNeutralStates[static_cast<size_t>(eState)]
-                       [static_cast<size_t>(eClass)];
+  return kNeutralStateTable[static_cast<size_t>(eState)]
+                           [static_cast<size_t>(eClass)];
 }
 
 FX_BIDINEUTRALACTION GetNeutralAction(FX_BIDINEUTRALSTATE eState,
                                       FX_BIDICLASS eClass) {
-  DCHECK(static_cast<size_t>(eState) < std::size(kNeutralActions));
-  DCHECK(static_cast<size_t>(eClass) < std::size(kNeutralActions[0]));
-  return kNeutralActions[static_cast<size_t>(eState)]
-                        [static_cast<size_t>(eClass)];
+  return kNeutralActionTable[static_cast<size_t>(eState)]
+                            [static_cast<size_t>(eClass)];
 }
 
 void ReverseString(std::vector<CFGAS_Char>* chars,
@@ -447,8 +441,9 @@
         eCls >= FX_BIDICLASS::kAL) {
       continue;
     }
-    (*chars)[i].m_iBidiLevel += kAddLevel[FX_IsOdd((*chars)[i].m_iBidiLevel)]
-                                         [static_cast<size_t>(eCls) - 1];
+    (*chars)[i].m_iBidiLevel +=
+        kAddLevelTable[FX_IsOdd((*chars)[i].m_iBidiLevel)]
+                      [static_cast<size_t>(eCls) - 1];
   }
 }
 
diff --git a/xfa/fgas/layout/cfgas_rtfbreak.cpp b/xfa/fgas/layout/cfgas_rtfbreak.cpp
index 976766d..3e1a4c4 100644
--- a/xfa/fgas/layout/cfgas_rtfbreak.cpp
+++ b/xfa/fgas/layout/cfgas_rtfbreak.cpp
@@ -4,17 +4,13 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#if defined(UNSAFE_BUFFERS_BUILD)
-// TODO(crbug.com/pdfium/2154): resolve buffer safety issues.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "xfa/fgas/layout/cfgas_rtfbreak.h"
 
 #include <algorithm>
 
 #include "build/build_config.h"
 #include "core/fxcrt/check.h"
+#include "core/fxcrt/compiler_specific.h"
 #include "core/fxcrt/containers/adapters.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
@@ -377,7 +373,7 @@
   int32_t iLast = fxcrt::CollectionSize<int32_t>(m_pCurLine->m_LineChars) - 1;
   int32_t j = 0;
   for (int32_t i = 0; i <= iLast;) {
-    const CFGAS_Char* pTC = pCurChars + i;
+    const CFGAS_Char* pTC = UNSAFE_TODO(pCurChars + i);
     if (bNew) {
       tp.SetStartChar(i);
       tp.IncrementStartPos(tp.GetWidth());
@@ -595,7 +591,7 @@
   }
 
   CFGAS_Char* pCharArray = tca.data();
-  CFGAS_Char* pCur = pCharArray + iLength;
+  CFGAS_Char* pCur = UNSAFE_TODO(pCharArray + iLength);
   --iLength;
   if (bAllChars)
     pCur->m_eLineBreakType = FX_LINEBREAKTYPE::kUNKNOWN;
@@ -606,7 +602,7 @@
     *pEndPos -= iCharWidth;
 
   while (iLength >= 0) {
-    pCur = pCharArray + iLength;
+    pCur = UNSAFE_TODO(pCharArray + iLength);
     FX_BREAKPROPERTY nCur =
         pdfium::unicode::GetBreakProperty(pCur->char_code());
     bool bNeedBreak = false;
diff --git a/xfa/fgas/layout/cfgas_txtbreak.cpp b/xfa/fgas/layout/cfgas_txtbreak.cpp
index f10b9ff..79e9f17 100644
--- a/xfa/fgas/layout/cfgas_txtbreak.cpp
+++ b/xfa/fgas/layout/cfgas_txtbreak.cpp
@@ -4,17 +4,14 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#if defined(UNSAFE_BUFFERS_BUILD)
-// TODO(crbug.com/pdfium/2154): resolve buffer safety issues.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "xfa/fgas/layout/cfgas_txtbreak.h"
 
 #include <algorithm>
+#include <array>
 
 #include "build/build_config.h"
 #include "core/fxcrt/check.h"
+#include "core/fxcrt/compiler_specific.h"
 #include "core/fxcrt/containers/adapters.h"
 #include "core/fxcrt/fx_codepage.h"
 #include "core/fxcrt/fx_extension.h"
@@ -675,8 +672,8 @@
       wch = pEngine->GetChar(iAbsolute);
       iWidth = pEngine->GetWidthOfChar(iAbsolute);
     } else {
-      wch = *pStr++;
-      iWidth = *pWidths++;
+      wch = UNSAFE_TODO(*pStr++);
+      iWidth = UNSAFE_TODO(*pWidths++);
     }
 
     FX_CHARTYPE chartype = pdfium::unicode::GetCharType(wch);
@@ -708,7 +705,7 @@
             if (i + j >= iLength)
               break;
 
-            wNext = pStr[j];
+            wNext = UNSAFE_TODO(pStr[j]);
           } while (pdfium::unicode::GetCharType(wNext) ==
                    FX_CHARTYPE::kCombination);
           if (i + j >= iLength)
@@ -788,27 +785,27 @@
       iCharWidth = -iCharWidth;
 
     iCharWidth /= iFontSize;
-    FX_FORMCHAR formChars[3];
-    formChars[0].wch = wch;
-    formChars[0].wForm = wForm;
-    formChars[0].iWidth = iCharWidth;
+    std::array<FX_FORMCHAR, 3> form_chars;
+    form_chars[0].wch = wch;
+    form_chars[0].wForm = wForm;
+    form_chars[0].iWidth = iCharWidth;
     if (bLam) {
-      formChars[1].wForm = pdfium::arabic::kArabicShadda;
-      formChars[1].iWidth =
+      form_chars[1].wForm = pdfium::arabic::kArabicShadda;
+      form_chars[1].iWidth =
           pFont->GetCharWidth(pdfium::arabic::kArabicShadda).value_or(0);
-      formChars[2].wForm = pdfium::arabic::kArabicLetterSuperscriptAlef;
-      formChars[2].iWidth =
+      form_chars[2].wForm = pdfium::arabic::kArabicLetterSuperscriptAlef;
+      form_chars[2].iWidth =
           pFont->GetCharWidth(pdfium::arabic::kArabicLetterSuperscriptAlef)
               .value_or(0);
     }
 
     for (int32_t j = 0; j < iForms; j++) {
-      wForm = (wchar_t)formChars[j].wForm;
-      iCharWidth = formChars[j].iWidth;
+      wForm = (wchar_t)form_chars[j].wForm;
+      iCharWidth = form_chars[j].iWidth;
       if (j > 0) {
         chartype = FX_CHARTYPE::kCombination;
         wch = wForm;
-        wLast = (wchar_t)formChars[j - 1].wForm;
+        wLast = (wchar_t)form_chars[j - 1].wForm;
       }
       if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
         pCharPos->m_GlyphIndex = pFont->GetGlyphIndex(wForm);
@@ -870,11 +867,11 @@
           pCharPos->m_AdjustMatrix[3] =
               pCharPos->m_AdjustMatrix[3] * iVerScale / 100.0f;
         }
-        pCharPos++;
+        UNSAFE_TODO(pCharPos++);
       }
     }
     if (iWidth > 0)
-      wPrev = static_cast<wchar_t>(formChars[0].wch);
+      wPrev = static_cast<wchar_t>(form_chars[0].wch);
     wLast = wch;
   }
   return szCount;
@@ -903,8 +900,8 @@
       wch = pEngine->GetChar(iAbsolute);
       iCharSize = pEngine->GetWidthOfChar(iAbsolute);
     } else {
-      wch = *pStr++;
-      iCharSize = *pWidths++;
+      wch = UNSAFE_TODO(*pStr++);
+      iCharSize = UNSAFE_TODO(*pWidths++);
     }
     float fCharSize = static_cast<float>(iCharSize) / kConversionFactor;
     bool bRet = (!bSingleLine && IsCtrlCode(wch));
diff --git a/xfa/fgas/layout/fgas_arabic.cpp b/xfa/fgas/layout/fgas_arabic.cpp
index d9fc7be..aa056d8 100644
--- a/xfa/fgas/layout/fgas_arabic.cpp
+++ b/xfa/fgas/layout/fgas_arabic.cpp
@@ -4,11 +4,6 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#if defined(UNSAFE_BUFFERS_BUILD)
-// TODO(crbug.com/pdfium/2154): resolve buffer safety issues.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "xfa/fgas/layout/fgas_arabic.h"
 
 #include <iterator>
@@ -142,7 +137,7 @@
   if (unicode < kFirstFormTableEntry || unicode > kLastFormTableEntry)
     return nullptr;
 
-  return &kFormTable[unicode - kFirstFormTableEntry];
+  return UNSAFE_TODO(&kFormTable[unicode - kFirstFormTableEntry]);
 }
 
 const FX_ARBFORMTABLE* ParseChar(const CFGAS_Char* pTC,
@@ -221,7 +216,7 @@
   if (shadda < kFirstShaddaTableEntry || shadda > kLastShaddaTableEntry)
     return std::nullopt;
 
-  return kShaddaTable[shadda - kFirstShaddaTableEntry];
+  return UNSAFE_TODO(kShaddaTable[shadda - kFirstShaddaTableEntry]);
 }
 
 }  // namespace pdfium::arabic
diff --git a/xfa/fgas/layout/fgas_linebreak.cpp b/xfa/fgas/layout/fgas_linebreak.cpp
index 2e5f1f6..a40c6fb 100644
--- a/xfa/fgas/layout/fgas_linebreak.cpp
+++ b/xfa/fgas/layout/fgas_linebreak.cpp
@@ -4,16 +4,13 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#if defined(UNSAFE_BUFFERS_BUILD)
-// TODO(crbug.com/pdfium/2154): resolve buffer safety issues.
-#pragma allow_unsafe_buffers
-#endif
-
 #include "xfa/fgas/layout/fgas_linebreak.h"
 
+#include <array>
 #include <iterator>
 
 #include "core/fxcrt/check.h"
+#include "core/fxcrt/compiler_specific.h"
 #include "core/fxcrt/fx_unicode.h"
 
 namespace {
@@ -26,7 +23,8 @@
 #define FX_LBPB FX_LINEBREAKTYPE::kPROHIBITED_BRK
 #define FX_LBHS FX_LINEBREAKTYPE::kHANGUL_SPACE_BRK
 
-const FX_LINEBREAKTYPE kFX_LineBreak_PairTable[38][38] = {
+using LineBreakPairRow = std::array<const FX_LINEBREAKTYPE, 38>;
+constexpr std::array<const LineBreakPairRow, 38> kLineBreakPairTable = {{
     {FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
      FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
      FX_LBPB, FX_LBPB, FX_LBPB, FX_LBCP, FX_LBPB, FX_LBPB, FX_LBPB, FX_LBPB,
@@ -217,7 +215,7 @@
      FX_LBDB, FX_LBDB, FX_LBPB, FX_LBCB, FX_LBPB, FX_LBDB, FX_LBDB, FX_LBDB,
      FX_LBDB, FX_LBDB, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN,
      FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN, FX_LBUN},
-};
+}};
 
 #undef FX_LBUN
 #undef FX_LBDB
@@ -231,9 +229,7 @@
 
 FX_LINEBREAKTYPE GetLineBreakTypeFromPair(FX_BREAKPROPERTY curr_char,
                                           FX_BREAKPROPERTY next_char) {
-  size_t row = static_cast<size_t>(curr_char);
-  size_t col = static_cast<size_t>(next_char);
-  DCHECK(row < std::size(kFX_LineBreak_PairTable));
-  DCHECK(col < std::size(kFX_LineBreak_PairTable[0]));
-  return kFX_LineBreak_PairTable[row][col];
+  const size_t row = static_cast<size_t>(curr_char);
+  const size_t col = static_cast<size_t>(next_char);
+  return kLineBreakPairTable[row][col];
 }
