Author: jankratochvil Date: Wed Feb 6 00:44:13 2019 New Revision: 353280 URL: http://llvm.org/viewvc/llvm-project?rev=353280&view=rev Log: Fix strlen() of unbound array undefined behavior
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 Differential Revision: https://reviews.llvm.org/D57781 Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp lldb/trunk/source/Utility/ConstString.cpp Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=353280&r1=353279&r2=353280&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original) +++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Wed Feb 6 00:44:13 2019 @@ -1609,8 +1609,7 @@ void ObjectFileMachO::ProcessSegmentComm 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 @@ void ObjectFileMachO::ProcessSegmentComm 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 Modified: lldb/trunk/source/Utility/ConstString.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/ConstString.cpp?rev=353280&r1=353279&r2=353280&view=diff ============================================================================== --- lldb/trunk/source/Utility/ConstString.cpp (original) +++ lldb/trunk/source/Utility/ConstString.cpp Wed Feb 6 00:44:13 2019 @@ -143,7 +143,7 @@ public: 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; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits