llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: Dave Lee (kastiglione) <details> <summary>Changes</summary> Fixes parsing of an ObjC type encoding such as `{?="a""b"}`. Parsing of such a type encoding would lead to an assert. This was observed when running `language objc class-table dump`. The function `ReadQuotedString` consumes the closing quote, however one of its two callers (`ReadStructElement`) was also consuming a quote. For the above type encoding, where two quoted strings occur back to back, the parser would unintentionally consume the opening quote of the second quoted string - leaving the remaining text with an unbalanced quote. This changes fixes `ReadStructElement` to not consume a quote after calling `ReadQuotedString`. In order for the `ReadStructElement` to know whether a string was successfully parsed, `ReadQuotedString` now returns an optional string. --- Full diff: https://github.com/llvm/llvm-project/pull/137067.diff 2 Files Affected: - (modified) lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.cpp (+20-10) - (modified) lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.h (+1-1) ``````````diff diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.cpp index ddaa7a8a597b4..f29a876ba2f24 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.cpp @@ -19,6 +19,7 @@ #include "clang/Basic/TargetInfo.h" +#include <optional> #include <vector> using namespace lldb_private; @@ -41,13 +42,17 @@ std::string AppleObjCTypeEncodingParser::ReadStructName(StringLexer &type) { return std::string(buffer.GetString()); } -std::string AppleObjCTypeEncodingParser::ReadQuotedString(StringLexer &type) { +std::optional<std::string> +AppleObjCTypeEncodingParser::ReadQuotedString(StringLexer &type) { + if (!type.HasAtLeast(1)) + return std::nullopt; + StreamString buffer; - while (type.HasAtLeast(1) && type.Peek() != '"') + while (type.Peek() != '"') { buffer.Printf("%c", type.Next()); - StringLexer::Character next = type.Next(); - UNUSED_IF_ASSERT_DISABLED(next); - assert(next == '"'); + if (!type.HasAtLeast(1)) + return std::nullopt; + } return std::string(buffer.GetString()); } @@ -70,10 +75,12 @@ AppleObjCTypeEncodingParser::ReadStructElement(TypeSystemClang &ast_ctx, StringLexer &type, bool for_expression) { StructElement retval; - if (type.NextIf('"')) - retval.name = ReadQuotedString(type); - if (!type.NextIf('"')) - return retval; + if (type.NextIf('"')) { + if (auto maybe_name = ReadQuotedString(type)) + retval.name = *maybe_name; + else + return retval; + } uint32_t bitfield_size = 0; retval.type = BuildType(ast_ctx, type, for_expression, &bitfield_size); retval.bitfield = bitfield_size; @@ -198,7 +205,10 @@ clang::QualType AppleObjCTypeEncodingParser::BuildObjCObjectPointerType( // quoted string is a class name. - If we see anything else, the quoted // string is a field name and we push it back onto type. - name = ReadQuotedString(type); + if (auto maybe_name = ReadQuotedString(type)) + name = *maybe_name; + else + return clang::QualType(); if (type.HasAtLeast(1)) { switch (type.Peek()) { diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.h b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.h index 57ed9c21fabad..3058514f38ba1 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.h +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTypeEncodingParser.h @@ -63,7 +63,7 @@ class AppleObjCTypeEncodingParser : public ObjCLanguageRuntime::EncodingToType { uint32_t ReadNumber(StringLexer &type); - std::string ReadQuotedString(StringLexer &type); + std::optional<std::string> ReadQuotedString(StringLexer &type); ObjCLanguageRuntime &m_runtime; }; `````````` </details> https://github.com/llvm/llvm-project/pull/137067 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits