From 25005cff160911250ed7a9d80daec503cd9ea202 Mon Sep 17 00:00:00 2001 From: frosch Date: Tue, 25 Mar 2025 20:32:19 +0100 Subject: [PATCH] Codefix: std::string_view::data() is not necessarily null terminated. (#13891) --- src/fios.cpp | 6 +++--- src/help_gui.cpp | 3 ++- src/newgrf/newgrf_act0_globalvar.cpp | 2 +- src/os/windows/crashlog_win.cpp | 2 +- src/script/script_instance.cpp | 2 +- src/textbuf.cpp | 2 +- src/viewport.cpp | 2 +- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/fios.cpp b/src/fios.cpp index 1729a58451..25cb67509b 100644 --- a/src/fios.cpp +++ b/src/fios.cpp @@ -108,9 +108,9 @@ const FiosItem *FileList::FindItem(const std::string_view file) } /* If no name matches, try to parse it as number */ - char *endptr; - int i = std::strtol(file.data(), &endptr, 10); - if (file.data() == endptr || *endptr != '\0') i = -1; + int i; + const char *endptr = std::from_chars(file.data(), file.data() + file.size(), i, 10).ptr; + if (file.data() == endptr || endptr != file.data() + file.size()) i = -1; if (IsInsideMM(i, 0, this->size())) return &this->at(i); diff --git a/src/help_gui.cpp b/src/help_gui.cpp index 242aedbfcb..43493d0897 100644 --- a/src/help_gui.cpp +++ b/src/help_gui.cpp @@ -51,7 +51,8 @@ static std::optional FindGameManualFilePath(std::string_view filena }; for (Searchpath sp : searchpaths) { - auto file_path = FioGetDirectory(sp, subdir) + filename.data(); + std::string file_path = FioGetDirectory(sp, subdir); + file_path.append(filename); if (FioCheckFileExists(file_path, NO_DIRECTORY)) return file_path; } diff --git a/src/newgrf/newgrf_act0_globalvar.cpp b/src/newgrf/newgrf_act0_globalvar.cpp index 803995d937..3f765b79fd 100644 --- a/src/newgrf/newgrf_act0_globalvar.cpp +++ b/src/newgrf/newgrf_act0_globalvar.cpp @@ -297,7 +297,7 @@ static ChangeInfoResult GlobalVarChangeInfo(uint first, uint last, int prop, Byt * such as Cyrillic. Thus we will simply assume they're all UTF8. */ char32_t c; size_t len = Utf8Decode(&c, name.data()); - if (c == NFO_UTF8_IDENTIFIER) name = name.substr(len); + if (len <= name.size() && c == NFO_UTF8_IDENTIFIER) name = name.substr(len); LanguageMap::Mapping map; map.newgrf_id = newgrf_id; diff --git a/src/os/windows/crashlog_win.cpp b/src/os/windows/crashlog_win.cpp index f0ae64fc3a..802802839d 100644 --- a/src/os/windows/crashlog_win.cpp +++ b/src/os/windows/crashlog_win.cpp @@ -494,7 +494,7 @@ static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARA char *crashlog_dos_nl = reinterpret_cast(filename_buf + filename_buf_length * filename_count); /* Convert unix -> dos newlines because the edit box only supports that properly. */ - const char *crashlog_unix_nl = crashlog.data(); + const char *crashlog_unix_nl = crashlog.c_str(); char *p = crashlog_dos_nl; char32_t c; while ((c = Utf8Consume(&crashlog_unix_nl))) { diff --git a/src/script/script_instance.cpp b/src/script/script_instance.cpp index 0b0ee2934e..c600f94df7 100644 --- a/src/script/script_instance.cpp +++ b/src/script/script_instance.cpp @@ -128,7 +128,7 @@ bool ScriptInstance::LoadCompatibilityScript(std::string_view api_version, Subdi bool ScriptInstance::LoadCompatibilityScripts(Subdirectory dir, std::span api_versions) { /* Don't try to load compatibility scripts for the current version. */ - if (this->versionAPI == std::rbegin(api_versions)->data()) return true; + if (this->versionAPI == api_versions.back()) return true; ScriptLog::Info(fmt::format("Downgrading API to be compatible with version {}", this->versionAPI)); diff --git a/src/textbuf.cpp b/src/textbuf.cpp index 3fe748e8d0..fe5d253750 100644 --- a/src/textbuf.cpp +++ b/src/textbuf.cpp @@ -444,7 +444,7 @@ void Textbuf::Assign(const std::string_view text) */ void Textbuf::UpdateSize() { - this->chars = static_cast(Utf8StringLength(this->buf.data()) + 1); // terminating zero + this->chars = static_cast(Utf8StringLength(this->buf.c_str()) + 1); // terminating zero assert(this->buf.size() < this->max_bytes); assert(this->chars <= this->max_chars); diff --git a/src/viewport.cpp b/src/viewport.cpp index 6a33ba29ce..e3f5f6ce47 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1699,7 +1699,7 @@ static void ViewportDrawParentSprites(const ParentSpriteToSortVector *psd, const int child_idx = ps->first_child; while (child_idx >= 0) { - const ChildScreenSpriteToDraw *cs = csstdv->data() + child_idx; + const ChildScreenSpriteToDraw *cs = &(*csstdv)[child_idx]; child_idx = cs->next; if (cs->relative) { DrawSpriteViewport(cs->image, cs->pal, ps->left + cs->x, ps->top + cs->y, cs->sub);