diff --git a/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp b/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp
index 5f56b94..f1c8485 100644
--- a/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp
+++ b/core/fpdfapi/parser/cpdf_simple_parser_unittest.cpp
@@ -54,7 +54,7 @@
     CFX_ByteStringC word = parser.GetWord();
     EXPECT_EQ(std::string(reinterpret_cast<const char*>(data.expected),
                           data.expected_size),
-              std::string(word.c_str(), word.GetLength()))
+              std::string(word.unterminated_c_str(), word.GetLength()))
         << " for case " << i;
   }
 }
diff --git a/core/fpdfdoc/cpdf_pagelabel.cpp b/core/fpdfdoc/cpdf_pagelabel.cpp
index 3892aba..41cbb89 100644
--- a/core/fpdfdoc/cpdf_pagelabel.cpp
+++ b/core/fpdfdoc/cpdf_pagelabel.cpp
@@ -142,5 +142,7 @@
 }
 
 int32_t CPDF_PageLabel::GetPageByLabel(const CFX_WideStringC& wsLabel) const {
-  return GetPageByLabel(PDF_EncodeText(wsLabel.c_str()).AsStringC());
+  // TODO(tsepez): check usage of c_str() below.
+  return GetPageByLabel(
+      PDF_EncodeText(wsLabel.unterminated_c_str()).AsStringC());
 }
diff --git a/core/fxcrt/cfx_bytestring.cpp b/core/fxcrt/cfx_bytestring.cpp
index 9d67ed3..c88ad51 100644
--- a/core/fxcrt/cfx_bytestring.cpp
+++ b/core/fxcrt/cfx_bytestring.cpp
@@ -101,15 +101,16 @@
   ASSERT(IsValidCodePage(codepage));
 
   int src_len = wstr.GetLength();
-  int dest_len = FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len,
-                                           nullptr, 0, nullptr, nullptr);
+  int dest_len =
+      FXSYS_WideCharToMultiByte(codepage, 0, wstr.unterminated_c_str(), src_len,
+                                nullptr, 0, nullptr, nullptr);
   if (!dest_len)
     return CFX_ByteString();
 
   CFX_ByteString bstr;
   char* dest_buf = bstr.GetBuffer(dest_len);
-  FXSYS_WideCharToMultiByte(codepage, 0, wstr.c_str(), src_len, dest_buf,
-                            dest_len, nullptr, nullptr);
+  FXSYS_WideCharToMultiByte(codepage, 0, wstr.unterminated_c_str(), src_len,
+                            dest_buf, dest_len, nullptr, nullptr);
   bstr.ReleaseBuffer(dest_len);
   return bstr;
 }
@@ -153,7 +154,8 @@
 
 CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& stringSrc) {
   if (!stringSrc.IsEmpty())
-    m_pData.Reset(StringData::Create(stringSrc.c_str(), stringSrc.GetLength()));
+    m_pData.Reset(StringData::Create(stringSrc.unterminated_c_str(),
+                                     stringSrc.GetLength()));
 }
 
 CFX_ByteString::CFX_ByteString(const CFX_ByteStringC& str1,
@@ -166,8 +168,9 @@
     return;
 
   m_pData.Reset(StringData::Create(nNewLen));
-  m_pData->CopyContents(str1.c_str(), str1.GetLength());
-  m_pData->CopyContentsAt(str1.GetLength(), str2.c_str(), str2.GetLength());
+  m_pData->CopyContents(str1.unterminated_c_str(), str1.GetLength());
+  m_pData->CopyContentsAt(str1.GetLength(), str2.unterminated_c_str(),
+                          str2.GetLength());
 }
 
 CFX_ByteString::CFX_ByteString(
@@ -184,7 +187,8 @@
 
   FX_STRSIZE nOffset = 0;
   for (const auto& item : list) {
-    m_pData->CopyContentsAt(nOffset, item.c_str(), item.GetLength());
+    m_pData->CopyContentsAt(nOffset, item.unterminated_c_str(),
+                            item.GetLength());
     nOffset += item.GetLength();
   }
 }
@@ -209,7 +213,7 @@
   if (stringSrc.IsEmpty())
     clear();
   else
-    AssignCopy(stringSrc.c_str(), stringSrc.GetLength());
+    AssignCopy(stringSrc.unterminated_c_str(), stringSrc.GetLength());
 
   return *this;
 }
@@ -243,7 +247,7 @@
 
 const CFX_ByteString& CFX_ByteString::operator+=(const CFX_ByteStringC& str) {
   if (!str.IsEmpty())
-    Concat(str.c_str(), str.GetLength());
+    Concat(str.unterminated_c_str(), str.GetLength());
 
   return *this;
 }
@@ -264,7 +268,8 @@
     return str.IsEmpty();
 
   return m_pData->m_nDataLength == str.GetLength() &&
-         memcmp(m_pData->m_String, str.c_str(), str.GetLength()) == 0;
+         memcmp(m_pData->m_String, str.unterminated_c_str(), str.GetLength()) ==
+             0;
 }
 
 bool CFX_ByteString::operator==(const CFX_ByteString& other) const {
@@ -594,7 +599,7 @@
 
   const char* pStr =
       FX_strstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart,
-                pSub.c_str(), pSub.GetLength());
+                pSub.unterminated_c_str(), pSub.GetLength());
   return pStr ? (int)(pStr - m_pData->m_String) : -1;
 }
 
@@ -660,7 +665,7 @@
   char* pEnd = m_pData->m_String + m_pData->m_nDataLength;
   while (1) {
     const char* pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart),
-                                    pOld.c_str(), nSourceLen);
+                                    pOld.unterminated_c_str(), nSourceLen);
     if (!pTarget)
       break;
 
@@ -683,10 +688,10 @@
   char* pDest = pNewData->m_String;
   for (FX_STRSIZE i = 0; i < nCount; i++) {
     const char* pTarget = FX_strstr(pStart, (FX_STRSIZE)(pEnd - pStart),
-                                    pOld.c_str(), nSourceLen);
+                                    pOld.unterminated_c_str(), nSourceLen);
     memcpy(pDest, pStart, pTarget - pStart);
     pDest += pTarget - pStart;
-    memcpy(pDest, pNew.c_str(), pNew.GetLength());
+    memcpy(pDest, pNew.unterminated_c_str(), pNew.GetLength());
     pDest += pNew.GetLength();
     pStart = pTarget + nSourceLen;
   }
@@ -879,5 +884,5 @@
 }
 
 std::ostream& operator<<(std::ostream& os, const CFX_ByteStringC& str) {
-  return os.write(str.c_str(), str.GetLength());
+  return os.write(str.unterminated_c_str(), str.GetLength());
 }
diff --git a/core/fxcrt/cfx_decimal.cpp b/core/fxcrt/cfx_decimal.cpp
index a463305..b900e06 100644
--- a/core/fxcrt/cfx_decimal.cpp
+++ b/core/fxcrt/cfx_decimal.cpp
@@ -295,7 +295,7 @@
 }
 
 CFX_Decimal::CFX_Decimal(const CFX_WideStringC& strObj) {
-  const wchar_t* str = strObj.c_str();
+  const wchar_t* str = strObj.unterminated_c_str();
   const wchar_t* strBound = str + strObj.GetLength();
   bool pointmet = false;
   bool negmet = false;
diff --git a/core/fxcrt/cfx_seekablestreamproxy.cpp b/core/fxcrt/cfx_seekablestreamproxy.cpp
index 37dbed1..8cf8552 100644
--- a/core/fxcrt/cfx_seekablestreamproxy.cpp
+++ b/core/fxcrt/cfx_seekablestreamproxy.cpp
@@ -294,7 +294,7 @@
       m_wCodePage != FX_CODEPAGE_UTF8) {
     return;
   }
-  if (!m_pStream->WriteBlock(str.c_str(), m_iPosition,
+  if (!m_pStream->WriteBlock(str.unterminated_c_str(), m_iPosition,
                              str.GetLength() * sizeof(wchar_t))) {
     return;
   }
diff --git a/core/fxcrt/cfx_string_c_template.h b/core/fxcrt/cfx_string_c_template.h
index 5dfff69..1473160 100644
--- a/core/fxcrt/cfx_string_c_template.h
+++ b/core/fxcrt/cfx_string_c_template.h
@@ -112,7 +112,7 @@
   }
 
   const UnsignedType* raw_str() const { return m_Ptr.Get(); }
-  const CharType* c_str() const {
+  const CharType* unterminated_c_str() const {
     return reinterpret_cast<const CharType*>(m_Ptr.Get());
   }
 
diff --git a/core/fxcrt/cfx_widestring.cpp b/core/fxcrt/cfx_widestring.cpp
index 70a0cb6..6a4fbb9 100644
--- a/core/fxcrt/cfx_widestring.cpp
+++ b/core/fxcrt/cfx_widestring.cpp
@@ -263,15 +263,15 @@
   ASSERT(IsValidCodePage(codepage));
 
   int src_len = bstr.GetLength();
-  int dest_len =
-      FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, nullptr, 0);
+  int dest_len = FXSYS_MultiByteToWideChar(
+      codepage, 0, bstr.unterminated_c_str(), src_len, nullptr, 0);
   if (!dest_len)
     return CFX_WideString();
 
   CFX_WideString wstr;
   wchar_t* dest_buf = wstr.GetBuffer(dest_len);
-  FXSYS_MultiByteToWideChar(codepage, 0, bstr.c_str(), src_len, dest_buf,
-                            dest_len);
+  FXSYS_MultiByteToWideChar(codepage, 0, bstr.unterminated_c_str(), src_len,
+                            dest_buf, dest_len);
   wstr.ReleaseBuffer(dest_len);
   return wstr;
 }
@@ -308,7 +308,8 @@
 
 CFX_WideString::CFX_WideString(const CFX_WideStringC& stringSrc) {
   if (!stringSrc.IsEmpty()) {
-    m_pData.Reset(StringData::Create(stringSrc.c_str(), stringSrc.GetLength()));
+    m_pData.Reset(StringData::Create(stringSrc.unterminated_c_str(),
+                                     stringSrc.GetLength()));
   }
 }
 
@@ -322,8 +323,9 @@
     return;
 
   m_pData.Reset(StringData::Create(nNewLen));
-  m_pData->CopyContents(str1.c_str(), str1.GetLength());
-  m_pData->CopyContentsAt(str1.GetLength(), str2.c_str(), str2.GetLength());
+  m_pData->CopyContents(str1.unterminated_c_str(), str1.GetLength());
+  m_pData->CopyContentsAt(str1.GetLength(), str2.unterminated_c_str(),
+                          str2.GetLength());
 }
 
 CFX_WideString::CFX_WideString(
@@ -340,7 +342,8 @@
 
   FX_STRSIZE nOffset = 0;
   for (const auto& item : list) {
-    m_pData->CopyContentsAt(nOffset, item.c_str(), item.GetLength());
+    m_pData->CopyContentsAt(nOffset, item.unterminated_c_str(),
+                            item.GetLength());
     nOffset += item.GetLength();
   }
 }
@@ -361,7 +364,7 @@
   if (stringSrc.IsEmpty())
     clear();
   else
-    AssignCopy(stringSrc.c_str(), stringSrc.GetLength());
+    AssignCopy(stringSrc.unterminated_c_str(), stringSrc.GetLength());
 
   return *this;
 }
@@ -395,7 +398,7 @@
 
 const CFX_WideString& CFX_WideString::operator+=(const CFX_WideStringC& str) {
   if (!str.IsEmpty())
-    Concat(str.c_str(), str.GetLength());
+    Concat(str.unterminated_c_str(), str.GetLength());
 
   return *this;
 }
@@ -416,7 +419,8 @@
     return str.IsEmpty();
 
   return m_pData->m_nDataLength == str.GetLength() &&
-         wmemcmp(m_pData->m_String, str.c_str(), str.GetLength()) == 0;
+         wmemcmp(m_pData->m_String, str.unterminated_c_str(),
+                 str.GetLength()) == 0;
 }
 
 bool CFX_WideString::operator==(const CFX_WideString& other) const {
@@ -746,7 +750,7 @@
 
   const wchar_t* pStr =
       FX_wcsstr(m_pData->m_String + nStart, m_pData->m_nDataLength - nStart,
-                pSub.c_str(), pSub.GetLength());
+                pSub.unterminated_c_str(), pSub.GetLength());
   return pStr ? (int)(pStr - m_pData->m_String) : -1;
 }
 
@@ -812,7 +816,7 @@
   wchar_t* pEnd = m_pData->m_String + m_pData->m_nDataLength;
   while (1) {
     const wchar_t* pTarget = FX_wcsstr(pStart, (FX_STRSIZE)(pEnd - pStart),
-                                       pOld.c_str(), nSourceLen);
+                                       pOld.unterminated_c_str(), nSourceLen);
     if (!pTarget)
       break;
 
@@ -835,10 +839,10 @@
   wchar_t* pDest = pNewData->m_String;
   for (FX_STRSIZE i = 0; i < nCount; i++) {
     const wchar_t* pTarget = FX_wcsstr(pStart, (FX_STRSIZE)(pEnd - pStart),
-                                       pOld.c_str(), nSourceLen);
+                                       pOld.unterminated_c_str(), nSourceLen);
     wmemcpy(pDest, pStart, pTarget - pStart);
     pDest += pTarget - pStart;
-    wmemcpy(pDest, pNew.c_str(), pNew.GetLength());
+    wmemcpy(pDest, pNew.unterminated_c_str(), pNew.GetLength());
     pDest += pNew.GetLength();
     pStart = pTarget + nSourceLen;
   }
@@ -1060,7 +1064,7 @@
 }
 
 std::wostream& operator<<(std::wostream& os, const CFX_WideStringC& str) {
-  return os.write(str.c_str(), str.GetLength());
+  return os.write(str.unterminated_c_str(), str.GetLength());
 }
 
 std::ostream& operator<<(std::ostream& os, const CFX_WideStringC& str) {
diff --git a/core/fxcrt/fx_basic_buffer.cpp b/core/fxcrt/fx_basic_buffer.cpp
index 36da3f4..bcf0570 100644
--- a/core/fxcrt/fx_basic_buffer.cpp
+++ b/core/fxcrt/fx_basic_buffer.cpp
@@ -133,7 +133,7 @@
 }
 
 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(const CFX_WideStringC& str) {
-  AppendBlock(str.c_str(), str.GetLength() * sizeof(wchar_t));
+  AppendBlock(str.unterminated_c_str(), str.GetLength() * sizeof(wchar_t));
   return *this;
 }
 
diff --git a/core/fxcrt/fx_basic_utf.cpp b/core/fxcrt/fx_basic_utf.cpp
index 10aa918..4dbfa37 100644
--- a/core/fxcrt/fx_basic_utf.cpp
+++ b/core/fxcrt/fx_basic_utf.cpp
@@ -76,7 +76,7 @@
 
 CFX_ByteString FX_UTF8Encode(const CFX_WideStringC& wsStr) {
   FX_STRSIZE len = wsStr.GetLength();
-  const wchar_t* pStr = wsStr.c_str();
+  const wchar_t* pStr = wsStr.unterminated_c_str();
   CFX_UTF8Encoder encoder;
   while (len-- > 0)
     encoder.Input(*pStr++);
diff --git a/core/fxcrt/fx_stream.cpp b/core/fxcrt/fx_stream.cpp
index ba21461..a64b239 100644
--- a/core/fxcrt/fx_stream.cpp
+++ b/core/fxcrt/fx_stream.cpp
@@ -95,5 +95,5 @@
 }
 
 bool IFX_SeekableStream::WriteString(const CFX_ByteStringC& str) {
-  return WriteBlock(str.c_str(), str.GetLength());
+  return WriteBlock(str.unterminated_c_str(), str.GetLength());
 }
diff --git a/core/fxcrt/fxcrt_posix.cpp b/core/fxcrt/fxcrt_posix.cpp
index ca4ac16..4d867dd 100644
--- a/core/fxcrt/fxcrt_posix.cpp
+++ b/core/fxcrt/fxcrt_posix.cpp
@@ -56,7 +56,9 @@
   int32_t nFlags;
   int32_t nMasks;
   FXCRT_Posix_GetFileMode(dwMode, nFlags, nMasks);
-  m_nFD = open(fileName.c_str(), nFlags, nMasks);
+
+  // TODO(tsepez): check usage of c_str() below.
+  m_nFD = open(fileName.unterminated_c_str(), nFlags, nMasks);
   return m_nFD > -1;
 }
 
diff --git a/core/fxcrt/fxcrt_windows.cpp b/core/fxcrt/fxcrt_windows.cpp
index 6230c74..1a2a367 100644
--- a/core/fxcrt/fxcrt_windows.cpp
+++ b/core/fxcrt/fxcrt_windows.cpp
@@ -57,8 +57,8 @@
 
   uint32_t dwAccess, dwShare, dwCreation;
   FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
-  m_hFile = ::CreateFileA(fileName.c_str(), dwAccess, dwShare, nullptr,
-                          dwCreation, FILE_ATTRIBUTE_NORMAL, nullptr);
+  m_hFile = ::CreateFileA(fileName.unterminated_c_str(), dwAccess, dwShare,
+                          nullptr, dwCreation, FILE_ATTRIBUTE_NORMAL, nullptr);
   if (m_hFile == INVALID_HANDLE_VALUE)
     m_hFile = nullptr;
 
@@ -72,8 +72,9 @@
 
   uint32_t dwAccess, dwShare, dwCreation;
   FXCRT_Windows_GetFileMode(dwMode, dwAccess, dwShare, dwCreation);
-  m_hFile = ::CreateFileW((LPCWSTR)fileName.c_str(), dwAccess, dwShare, nullptr,
-                          dwCreation, FILE_ATTRIBUTE_NORMAL, nullptr);
+  m_hFile =
+      ::CreateFileW((LPCWSTR)fileName.unterminated_c_str(), dwAccess, dwShare,
+                    nullptr, dwCreation, FILE_ATTRIBUTE_NORMAL, nullptr);
   if (m_hFile == INVALID_HANDLE_VALUE)
     m_hFile = nullptr;
 
diff --git a/core/fxge/android/cfpf_skiafontmgr.cpp b/core/fxge/android/cfpf_skiafontmgr.cpp
index ec5c610..23fcd5b 100644
--- a/core/fxge/android/cfpf_skiafontmgr.cpp
+++ b/core/fxge/android/cfpf_skiafontmgr.cpp
@@ -161,7 +161,7 @@
 uint32_t FPF_SKIANormalizeFontName(const CFX_ByteStringC& bsfamily) {
   uint32_t dwHash = 0;
   int32_t iLength = bsfamily.GetLength();
-  const char* pBuffer = bsfamily.c_str();
+  const char* pBuffer = bsfamily.unterminated_c_str();
   for (int32_t i = 0; i < iLength; i++) {
     char ch = pBuffer[i];
     if (ch == ' ' || ch == '-' || ch == ',')
@@ -395,7 +395,7 @@
     return nullptr;
   FXFT_Open_Args args;
   args.flags = FT_OPEN_PATHNAME;
-  args.pathname = const_cast<FT_String*>(bsFile.c_str());
+  args.pathname = const_cast<FT_String*>(bsFile.unterminated_c_str());
   FXFT_Face face;
   if (FXFT_Open_Face(m_FTLibrary, &args, iFaceIndex, &face))
     return nullptr;
diff --git a/core/fxge/win32/cpsoutput.cpp b/core/fxge/win32/cpsoutput.cpp
index 7139340..1af6dbd 100644
--- a/core/fxge/win32/cpsoutput.cpp
+++ b/core/fxge/win32/cpsoutput.cpp
@@ -32,5 +32,5 @@
 }
 
 bool CPSOutput::WriteString(const CFX_ByteStringC& str) {
-  return WriteBlock(str.c_str(), str.GetLength());
+  return WriteBlock(str.unterminated_c_str(), str.GetLength());
 }
diff --git a/fpdfsdk/fsdk_filewriteadapter.cpp b/fpdfsdk/fsdk_filewriteadapter.cpp
index ff527a6..50394c3 100644
--- a/fpdfsdk/fsdk_filewriteadapter.cpp
+++ b/fpdfsdk/fsdk_filewriteadapter.cpp
@@ -18,5 +18,5 @@
 }
 
 bool FSDK_FileWriteAdapter::WriteString(const CFX_ByteStringC& str) {
-  return WriteBlock(str.c_str(), str.GetLength());
+  return WriteBlock(str.unterminated_c_str(), str.GetLength());
 }
diff --git a/fpdfsdk/javascript/cjs_runtime.cpp b/fpdfsdk/javascript/cjs_runtime.cpp
index cb8f69f..515bdcb 100644
--- a/fpdfsdk/javascript/cjs_runtime.cpp
+++ b/fpdfsdk/javascript/cjs_runtime.cpp
@@ -218,19 +218,16 @@
   sRet.Replace(L"_", L".");
   return sRet;
 }
+
 bool CJS_Runtime::GetValueByName(const CFX_ByteStringC& utf8Name,
                                  CFXJSE_Value* pValue) {
-  const char* name = utf8Name.c_str();
-
   v8::Isolate::Scope isolate_scope(GetIsolate());
   v8::HandleScope handle_scope(GetIsolate());
   v8::Local<v8::Context> context = NewLocalContext();
   v8::Context::Scope context_scope(context);
-
-  v8::Local<v8::Value> propvalue =
-      context->Global()->Get(v8::String::NewFromUtf8(
-          GetIsolate(), name, v8::String::kNormalString, utf8Name.GetLength()));
-
+  v8::Local<v8::Value> propvalue = context->Global()->Get(
+      v8::String::NewFromUtf8(GetIsolate(), utf8Name.unterminated_c_str(),
+                              v8::String::kNormalString, utf8Name.GetLength()));
   if (propvalue.IsEmpty()) {
     pValue->SetUndefined();
     return false;
@@ -238,24 +235,22 @@
   pValue->ForceSetValue(propvalue);
   return true;
 }
+
 bool CJS_Runtime::SetValueByName(const CFX_ByteStringC& utf8Name,
                                  CFXJSE_Value* pValue) {
   if (utf8Name.IsEmpty() || !pValue)
     return false;
-  const char* name = utf8Name.c_str();
+
   v8::Isolate* pIsolate = GetIsolate();
   v8::Isolate::Scope isolate_scope(pIsolate);
   v8::HandleScope handle_scope(pIsolate);
   v8::Local<v8::Context> context = NewLocalContext();
   v8::Context::Scope context_scope(context);
-
-  // v8::Local<v8::Context> tmpCotext =
-  // v8::Local<v8::Context>::New(GetIsolate(), m_context);
   v8::Local<v8::Value> propvalue =
       v8::Local<v8::Value>::New(GetIsolate(), pValue->DirectGetValue());
   context->Global()->Set(
-      v8::String::NewFromUtf8(pIsolate, name, v8::String::kNormalString,
-                              utf8Name.GetLength()),
+      v8::String::NewFromUtf8(pIsolate, utf8Name.unterminated_c_str(),
+                              v8::String::kNormalString, utf8Name.GetLength()),
       propvalue);
   return true;
 }
diff --git a/fxjs/cfxjse_value.cpp b/fxjs/cfxjse_value.cpp
index fb7fe20..c2eaa40 100644
--- a/fxjs/cfxjse_value.cpp
+++ b/fxjs/cfxjse_value.cpp
@@ -58,7 +58,7 @@
 
   CFXJSE_ScopeUtil_IsolateHandleRootContext scope(pIsolate);
   v8::Local<v8::String> hMessage = v8::String::NewFromUtf8(
-      pIsolate, utf8Message.c_str(), v8::String::kNormalString,
+      pIsolate, utf8Message.unterminated_c_str(), v8::String::kNormalString,
       utf8Message.GetLength());
   v8::Local<v8::Value> hError = v8::Exception::Error(hMessage);
   pIsolate->ThrowException(hError);
@@ -138,7 +138,7 @@
   v8::Local<v8::Value> hPropValue =
       v8::Local<v8::Value>::New(m_pIsolate, lpPropValue->DirectGetValue());
   return (bool)hObject.As<v8::Object>()->Set(
-      v8::String::NewFromUtf8(m_pIsolate, szPropName.c_str(),
+      v8::String::NewFromUtf8(m_pIsolate, szPropName.unterminated_c_str(),
                               v8::String::kNormalString,
                               szPropName.GetLength()),
       hPropValue);
@@ -155,8 +155,8 @@
 
   v8::Local<v8::Value> hPropValue =
       hObject.As<v8::Object>()->Get(v8::String::NewFromUtf8(
-          m_pIsolate, szPropName.c_str(), v8::String::kNormalString,
-          szPropName.GetLength()));
+          m_pIsolate, szPropName.unterminated_c_str(),
+          v8::String::kNormalString, szPropName.GetLength()));
   lpPropValue->ForceSetValue(hPropValue);
   return true;
 }
@@ -195,7 +195,7 @@
     return false;
 
   hObject.As<v8::Object>()->Delete(v8::String::NewFromUtf8(
-      m_pIsolate, szPropName.c_str(), v8::String::kNormalString,
+      m_pIsolate, szPropName.unterminated_c_str(), v8::String::kNormalString,
       szPropName.GetLength()));
   return true;
 }
@@ -209,7 +209,7 @@
     return false;
 
   v8::Local<v8::String> hKey = v8::String::NewFromUtf8(
-      m_pIsolate, szPropName.c_str(), v8::String::kNormalString,
+      m_pIsolate, szPropName.unterminated_c_str(), v8::String::kNormalString,
       szPropName.GetLength());
   return hObject.As<v8::Object>()->HasRealNamedProperty(hKey) ||
          (bUseTypeGetter &&
@@ -232,7 +232,7 @@
   return hObject.As<v8::Object>()
       ->DefineOwnProperty(
           m_pIsolate->GetCurrentContext(),
-          v8::String::NewFromUtf8(m_pIsolate, szPropName.c_str(),
+          v8::String::NewFromUtf8(m_pIsolate, szPropName.unterminated_c_str(),
                                   v8::String::kNormalString,
                                   szPropName.GetLength()),
           pValue)
diff --git a/fxjs/fxjs_v8.cpp b/fxjs/fxjs_v8.cpp
index 970e4f1..d3d2010 100644
--- a/fxjs/fxjs_v8.cpp
+++ b/fxjs/fxjs_v8.cpp
@@ -648,7 +648,7 @@
 
 v8::Local<v8::String> CFXJS_Engine::NewString(const CFX_ByteStringC& str) {
   v8::Isolate* pIsolate = m_isolate ? m_isolate : v8::Isolate::GetCurrent();
-  return v8::String::NewFromUtf8(pIsolate, str.c_str(),
+  return v8::String::NewFromUtf8(pIsolate, str.unterminated_c_str(),
                                  v8::NewStringType::kNormal, str.GetLength())
       .ToLocalChecked();
 }
diff --git a/testing/xfa_js_embedder_test.cpp b/testing/xfa_js_embedder_test.cpp
index e5a30f6..d36cc81 100644
--- a/testing/xfa_js_embedder_test.cpp
+++ b/testing/xfa_js_embedder_test.cpp
@@ -59,7 +59,7 @@
 
   CFXJSE_Value msg(GetIsolate());
   value_->GetObjectPropertyByIdx(1, &msg);
-  fprintf(stderr, "JS: %.*s\n", input.GetLength(), input.c_str());
+  fprintf(stderr, "JS: %.*s\n", input.GetLength(), input.unterminated_c_str());
   // If the parsing of the input fails, then v8 will not run, so there will be
   // no value here to print.
   if (msg.IsString() && !msg.ToWideString().IsEmpty())
diff --git a/xfa/fde/css/cfde_cssdeclaration.cpp b/xfa/fde/css/cfde_cssdeclaration.cpp
index 00a2c9e..e15e5f7 100644
--- a/xfa/fde/css/cfde_cssdeclaration.cpp
+++ b/xfa/fde/css/cfde_cssdeclaration.cpp
@@ -160,9 +160,8 @@
                                       const CFX_WideStringC& value) {
   ASSERT(!value.IsEmpty());
 
-  const wchar_t* pszValue = value.c_str();
+  const wchar_t* pszValue = value.unterminated_c_str();
   int32_t iValueLen = value.GetLength();
-
   bool bImportant = false;
   if (iValueLen >= 10 && pszValue[iValueLen - 10] == '!' &&
       FXSYS_wcsnicmp(L"important", pszValue + iValueLen - 9, 9) == 0) {
diff --git a/xfa/fde/css/cfde_cssselector.cpp b/xfa/fde/css/cfde_cssselector.cpp
index c1e9f7f..ad2ec40 100644
--- a/xfa/fde/css/cfde_cssselector.cpp
+++ b/xfa/fde/css/cfde_cssselector.cpp
@@ -52,7 +52,7 @@
     const CFX_WideStringC& str) {
   ASSERT(!str.IsEmpty());
 
-  const wchar_t* psz = str.c_str();
+  const wchar_t* psz = str.unterminated_c_str();
   const wchar_t* pStart = psz;
   const wchar_t* pEnd = psz + str.GetLength();
   for (; psz < pEnd; ++psz) {
diff --git a/xfa/fgas/crt/cfgas_formatstring.cpp b/xfa/fgas/crt/cfgas_formatstring.cpp
index a9e5f7c..0abc86f 100644
--- a/xfa/fgas/crt/cfgas_formatstring.cpp
+++ b/xfa/fgas/crt/cfgas_formatstring.cpp
@@ -769,7 +769,7 @@
   if (wsTime.GetLength() == 0)
     return false;
 
-  const wchar_t* str = wsTime.c_str();
+  const wchar_t* str = wsTime.unterminated_c_str();
   int len = wsTime.GetLength();
 
   int cc = 0;
diff --git a/xfa/fwl/theme/cfwl_widgettp.cpp b/xfa/fwl/theme/cfwl_widgettp.cpp
index 90a144f..e863a0e 100644
--- a/xfa/fwl/theme/cfwl_widgettp.cpp
+++ b/xfa/fwl/theme/cfwl_widgettp.cpp
@@ -291,8 +291,9 @@
     m_pFontMgr = CFGAS_FontMgr::Create(m_pFontSource.get());
 #endif
   }
-  m_pFont = CFGAS_GEFont::LoadFont(wsFontFamily.c_str(), dwFontStyles,
-                                   dwCodePage, m_pFontMgr.get());
+  // TODO(tsepez): check usage of c_str() below.
+  m_pFont = CFGAS_GEFont::LoadFont(wsFontFamily.unterminated_c_str(),
+                                   dwFontStyles, dwCodePage, m_pFontMgr.get());
   return !!m_pFont;
 }
 
diff --git a/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp b/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp
index 8c94444..5f1a4d2 100644
--- a/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fm2jscontext.cpp
@@ -1970,8 +1970,8 @@
   int32_t iDay = 0;
   if (iLength <= 10) {
     int32_t iStyle = -1;
-    if (!IsIsoDateFormat(szDateString.c_str(), iLength, iStyle, iYear, iMonth,
-                         iDay)) {
+    if (!IsIsoDateFormat(szDateString.unterminated_c_str(), iLength, iStyle,
+                         iYear, iMonth, iDay)) {
       return 0;
     }
   } else {
@@ -1981,9 +1981,9 @@
     int32_t iMilliSecond = 0;
     int32_t iZoneHour = 0;
     int32_t iZoneMinute = 0;
-    if (!IsIsoDateTimeFormat(szDateString.c_str(), iLength, iYear, iMonth, iDay,
-                             iHour, iMinute, iSecond, iMilliSecond, iZoneHour,
-                             iZoneMinute)) {
+    if (!IsIsoDateTimeFormat(szDateString.unterminated_c_str(), iLength, iYear,
+                             iMonth, iDay, iHour, iMinute, iSecond,
+                             iMilliSecond, iZoneHour, iZoneMinute)) {
       return 0;
     }
   }
@@ -3516,7 +3516,8 @@
 // static
 void CXFA_FM2JSContext::EncodeHTML(const CFX_ByteStringC& szHTMLString,
                                    CFX_ByteTextBuf& szResultBuf) {
-  CFX_ByteString str = szHTMLString.c_str();
+  // TODO(tsepez): check usage of c_str() below.
+  CFX_ByteString str = szHTMLString.unterminated_c_str();
   CFX_WideString wsHTMLString = CFX_WideString::FromUTF8(str.AsStringC());
   const wchar_t* strCode = L"0123456789abcdef";
   wchar_t strEncode[9];
@@ -3637,13 +3638,14 @@
                                      uint32_t* iCode) {
   auto cmpFunc = [](const XFA_FMHtmlReserveCode& iter,
                     const CFX_WideStringC& val) {
-    return wcscmp(val.c_str(), iter.m_htmlReserve) > 0;
+    // TODO(tsepez): check usage of c_str() below.
+    return wcscmp(val.unterminated_c_str(), iter.m_htmlReserve) > 0;
   };
   const XFA_FMHtmlReserveCode* result =
       std::lower_bound(std::begin(reservesForDecode),
                        std::end(reservesForDecode), pData, cmpFunc);
   if (result != std::end(reservesForEncode) &&
-      !wcscmp(pData.c_str(), result->m_htmlReserve)) {
+      !wcscmp(pData.unterminated_c_str(), result->m_htmlReserve)) {
     *iCode = result->m_uCode;
     return true;
   }
@@ -4424,7 +4426,7 @@
                                  "Sixty",  "Seventy", "Eighty", "Ninety"};
   CFX_ByteStringC pComm[] = {" Hundred ", " Thousand ", " Million ",
                              " Billion ", "Trillion"};
-  const char* pData = szData.c_str();
+  const char* pData = szData.unterminated_c_str();
   int32_t iLength = szData.GetLength();
   int32_t iComm = 0;
   if (iLength > 12)
@@ -4513,7 +4515,7 @@
 void CXFA_FM2JSContext::WordUS(const CFX_ByteStringC& szData,
                                int32_t iStyle,
                                CFX_ByteTextBuf& strBuf) {
-  const char* pData = szData.c_str();
+  const char* pData = szData.unterminated_c_str();
   int32_t iLength = szData.GetLength();
   if (iStyle < 0 || iStyle > 2) {
     return;
@@ -6094,7 +6096,9 @@
 
 void CXFA_FM2JSContext::ThrowNoDefaultPropertyException(
     const CFX_ByteStringC& name) const {
-  ThrowException(L"%.16S doesn't have a default property.", name.c_str());
+  // TODO(tsepez): check usage of c_str() below.
+  ThrowException(L"%.16S doesn't have a default property.",
+                 name.unterminated_c_str());
 }
 
 void CXFA_FM2JSContext::ThrowCompilerErrorException() const {
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
index 908cd2f..6b8508a 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
@@ -111,7 +111,7 @@
 CXFA_FMToken::~CXFA_FMToken() {}
 
 CXFA_FMLexer::CXFA_FMLexer(const CFX_WideStringC& wsFormCalc)
-    : m_ptr(wsFormCalc.c_str()),
+    : m_ptr(wsFormCalc.unterminated_c_str()),
       m_end(m_ptr + wsFormCalc.GetLength() - 1),
       m_uCurrentLine(1),
       m_LexerError(false) {}
diff --git a/xfa/fxfa/parser/cscript_hostpseudomodel.cpp b/xfa/fxfa/parser/cscript_hostpseudomodel.cpp
index b229b23..d9eb5d6 100644
--- a/xfa/fxfa/parser/cscript_hostpseudomodel.cpp
+++ b/xfa/fxfa/parser/cscript_hostpseudomodel.cpp
@@ -325,7 +325,7 @@
   }
   wchar_t* pBuf = wsFilter.GetBuffer(iLength - nStart);
   int32_t nCount = 0;
-  const wchar_t* pSrc = wsExpression.c_str();
+  const wchar_t* pSrc = wsExpression.unterminated_c_str();
   wchar_t wCur;
   while (nStart < iLength) {
     wCur = pSrc[nStart++];
diff --git a/xfa/fxfa/parser/cxfa_data.cpp b/xfa/fxfa/parser/cxfa_data.cpp
index bdfc25c..7bf18a5 100644
--- a/xfa/fxfa/parser/cxfa_data.cpp
+++ b/xfa/fxfa/parser/cxfa_data.cpp
@@ -17,7 +17,7 @@
     return 0xff000000;
 
   int cc = 0;
-  const wchar_t* str = wsValue.c_str();
+  const wchar_t* str = wsValue.unterminated_c_str();
   int len = wsValue.GetLength();
   while (FXSYS_iswspace(str[cc]) && cc < len)
     cc++;
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
index b6e6e7f..694b24d 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
@@ -1748,7 +1748,7 @@
                               : containerSize.width - fLeftInset - fRightInset;
   CFX_WideStringC wsColumnWidths;
   if (pLayoutNode->TryCData(XFA_ATTRIBUTE_ColumnWidths, wsColumnWidths)) {
-    auto widths = SeparateStringW(wsColumnWidths.c_str(),
+    auto widths = SeparateStringW(wsColumnWidths.unterminated_c_str(),
                                   wsColumnWidths.GetLength(), L' ');
     for (auto& width : widths) {
       width.TrimLeft(L' ');
diff --git a/xfa/fxfa/parser/cxfa_measurement.cpp b/xfa/fxfa/parser/cxfa_measurement.cpp
index 9173223..70420d7 100644
--- a/xfa/fxfa/parser/cxfa_measurement.cpp
+++ b/xfa/fxfa/parser/cxfa_measurement.cpp
@@ -28,7 +28,7 @@
   }
   int32_t iUsedLen = 0;
   int32_t iOffset = (wsMeasure.GetAt(0) == L'=') ? 1 : 0;
-  float fValue = FXSYS_wcstof(wsMeasure.c_str() + iOffset,
+  float fValue = FXSYS_wcstof(wsMeasure.unterminated_c_str() + iOffset,
                               wsMeasure.GetLength() - iOffset, &iUsedLen);
   XFA_UNIT eUnit = GetUnit(wsMeasure.Mid(iOffset + iUsedLen));
   Set(fValue, eUnit);
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 845d3f3..5c4f8d1 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -3591,7 +3591,7 @@
       return SetBoolean(pAttr->eName, wsValue != L"0", bNotify);
     case XFA_ATTRIBUTETYPE_Integer:
       return SetInteger(pAttr->eName,
-                        FXSYS_round(FXSYS_wcstof(wsValue.c_str(),
+                        FXSYS_round(FXSYS_wcstof(wsValue.unterminated_c_str(),
                                                  wsValue.GetLength(), nullptr)),
                         bNotify);
     case XFA_ATTRIBUTETYPE_Measure:
@@ -4554,7 +4554,8 @@
             static_cast<CFX_XMLElement*>(pNode->m_pXMLNode);
         CFX_WideStringC wsAttributeName =
             pNode->GetCData(XFA_ATTRIBUTE_QualifiedName);
-        pXMLElement->RemoveAttribute(wsAttributeName.c_str());
+        // TODO(tsepez): check usage of c_str() below.
+        pXMLElement->RemoveAttribute(wsAttributeName.unterminated_c_str());
       }
       CFX_WideString wsName;
       pNode->GetAttribute(XFA_ATTRIBUTE_Name, wsName, false);
@@ -4850,7 +4851,7 @@
 }
 
 void CXFA_Node::SetMapModuleString(void* pKey, const CFX_WideStringC& wsValue) {
-  SetMapModuleBuffer(pKey, (void*)wsValue.c_str(),
+  SetMapModuleBuffer(pKey, (void*)wsValue.unterminated_c_str(),
                      wsValue.GetLength() * sizeof(wchar_t));
 }
 
diff --git a/xfa/fxfa/parser/cxfa_resolveprocessor.cpp b/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
index add8cb8..93b2d86 100644
--- a/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_resolveprocessor.cpp
@@ -502,7 +502,7 @@
   int32_t nConditionCount = 0;
   std::vector<int32_t> stack;
   int32_t nType = -1;
-  const wchar_t* pSrc = wsExpression.c_str();
+  const wchar_t* pSrc = wsExpression.unterminated_c_str();
   wchar_t wPrev = 0, wCur;
   bool bIsCondition = false;
   while (nStart < iLength) {
