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

Reply via email to