[Lldb-commits] [PATCH] D57781: Fix strlen() of unbound array undefined behavior
Jan Kratochvil via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Tue Feb 5 13:21:43 PST 2019
jankratochvil created this revision.
jankratochvil added a project: LLDB.
Herald added subscribers: abidh, aprantl.
LLDB testsuite fails when built by GCC8 on:
LLDB :: SymbolFile/DWARF/find-basic-namespace.cpp
This is because this code in LLDB codebase has undefined behavior:
#include <algorithm>
#include <string.h>
// lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp:1731
static struct section_64 {
char sectname[16];
char segname[16];
} sect64 = { {'_','_','a','p','p','l','e','_','n','a','m','e','s','p','a','c'}, "__DWARF" };
int main() {
return std::min<size_t>(strlen(sect64.sectname), sizeof(sect64.sectname));
}
It has been discussed as a (false) bugreport to GCC: wrong-code: LLDB testcase fails: SymbolFile/DWARF/find-basic-namespace.cpp <https://bugzilla.redhat.com/show_bug.cgi?id=1672436>
I will check it in if there are no comments as it looks obvious enough to me.
Repository:
rLLDB LLDB
https://reviews.llvm.org/D57781
Files:
lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
lldb/source/Utility/ConstString.cpp
Index: lldb/source/Utility/ConstString.cpp
===================================================================
--- lldb/source/Utility/ConstString.cpp
+++ lldb/source/Utility/ConstString.cpp
@@ -143,7 +143,7 @@
const char *GetConstTrimmedCStringWithLength(const char *cstr,
size_t cstr_len) {
if (cstr != nullptr) {
- const size_t trimmed_len = std::min<size_t>(strlen(cstr), cstr_len);
+ const size_t trimmed_len = strnlen(cstr, cstr_len);
return GetConstCStringWithLength(cstr, trimmed_len);
}
return nullptr;
Index: lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
===================================================================
--- lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -1609,8 +1609,7 @@
bool add_section = true;
bool add_to_unified = true;
ConstString const_segname(
- load_cmd.segname,
- std::min<size_t>(strlen(load_cmd.segname), sizeof(load_cmd.segname)));
+ load_cmd.segname, strnlen(load_cmd.segname, sizeof(load_cmd.segname)));
SectionSP unified_section_sp(
context.UnifiedList.FindSectionByName(const_segname));
@@ -1729,8 +1728,7 @@
if (add_section) {
ConstString section_name(
- sect64.sectname,
- std::min<size_t>(strlen(sect64.sectname), sizeof(sect64.sectname)));
+ sect64.sectname, strnlen(sect64.sectname, sizeof(sect64.sectname)));
if (!const_segname) {
// We have a segment with no name so we need to conjure up segments
// that correspond to the section's segname if there isn't already such
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D57781.185373.patch
Type: text/x-patch
Size: 1698 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190205/4003d0f2/attachment-0001.bin>
More information about the lldb-commits
mailing list