-
Notifications
You must be signed in to change notification settings - Fork 13.9k
[lldb] Fix crash in SymbolFileCTF::ParseFunctions #89845
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Make SymbolFileCTF::ParseFunctions resilient against not being able to resolve the argument or return type of a function. ResolveTypeUID can fail for a variety of reasons so we should always check its result.
@llvm/pr-subscribers-lldb Author: Jonas Devlieghere (JDevlieghere) ChangesMake SymbolFileCTF::ParseFunctions resilient against not being able to The type that caused the crash was rdar://126943722 Full diff: https://github.com/llvm/llvm-project/pull/89845.diff 5 Files Affected:
diff --git a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
index 65f5b1a5f1b0a2..386ba44c5ea653 100644
--- a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
+++ b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
@@ -342,7 +342,7 @@ SymbolFileCTF::CreateInteger(const CTFInteger &ctf_integer) {
CompilerType compiler_type = m_ast->GetBasicType(basic_type);
- if (basic_type != eBasicTypeVoid) {
+ if (basic_type != eBasicTypeVoid && basic_type != eBasicTypeBool) {
// Make sure the type we got is an integer type.
bool compiler_type_is_signed = false;
if (!compiler_type.IsIntegerType(compiler_type_is_signed))
@@ -802,7 +802,8 @@ size_t SymbolFileCTF::ParseFunctions(CompileUnit &cu) {
}
Type *arg_type = ResolveTypeUID(arg_uid);
- arg_types.push_back(arg_type->GetFullCompilerType());
+ arg_types.push_back(arg_type ? arg_type->GetFullCompilerType()
+ : CompilerType());
}
if (symbol) {
@@ -813,8 +814,9 @@ size_t SymbolFileCTF::ParseFunctions(CompileUnit &cu) {
// Create function type.
CompilerType func_type = m_ast->CreateFunctionType(
- ret_type->GetFullCompilerType(), arg_types.data(), arg_types.size(),
- is_variadic, 0, clang::CallingConv::CC_C);
+ ret_type ? ret_type->GetFullCompilerType() : CompilerType(),
+ arg_types.data(), arg_types.size(), is_variadic, 0,
+ clang::CallingConv::CC_C);
lldb::user_id_t function_type_uid = m_types.size() + 1;
TypeSP type_sp =
MakeType(function_type_uid, symbol->GetName(), 0, nullptr,
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 2621f682011b41..662da313af5989 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -838,8 +838,11 @@ lldb::BasicType TypeSystemClang::GetBasicTypeEnumeration(llvm::StringRef name) {
{"__int128_t", eBasicTypeInt128},
{"__uint128_t", eBasicTypeUnsignedInt128},
- // Miscellaneous
+ // "bool"
{"bool", eBasicTypeBool},
+ {"_Bool", eBasicTypeBool},
+
+ // Miscellaneous
{"float", eBasicTypeFloat},
{"double", eBasicTypeDouble},
{"long double", eBasicTypeLongDouble},
diff --git a/lldb/test/API/macosx/ctf/Makefile b/lldb/test/API/macosx/ctf/Makefile
index afe6ab1b5db06b..0857e234837e54 100644
--- a/lldb/test/API/macosx/ctf/Makefile
+++ b/lldb/test/API/macosx/ctf/Makefile
@@ -4,7 +4,7 @@ MAKE_DSYM := YES
ifeq "$(COMPRESS_CTF)" "YES"
COMPRESS := -c
else
- COMPRESS :=
+ COMPRESS :=
endif
all: a.out a.ctf
diff --git a/lldb/test/API/macosx/ctf/TestCTF.py b/lldb/test/API/macosx/ctf/TestCTF.py
index f5fd29f6ed968f..b0a3b4a7eb985c 100644
--- a/lldb/test/API/macosx/ctf/TestCTF.py
+++ b/lldb/test/API/macosx/ctf/TestCTF.py
@@ -53,6 +53,7 @@ def do_test(self):
"[2] = 'b'",
"[3] = 'c'",
'u = (i = 1, s = "")',
+ 'b = false',
"f = 0x0000000000000000",
],
)
diff --git a/lldb/test/API/macosx/ctf/test.c b/lldb/test/API/macosx/ctf/test.c
index 358006646e766e..a15f7a5161334f 100644
--- a/lldb/test/API/macosx/ctf/test.c
+++ b/lldb/test/API/macosx/ctf/test.c
@@ -1,3 +1,4 @@
+#include <stdbool.h>
#include <stdio.h>
struct ForwardDecl;
@@ -24,6 +25,7 @@ typedef struct MyNestedStruct {
char a[4];
MyEnumT e;
MyUnionT u;
+ _Bool b;
} MyNestedStructT;
typedef struct MyStruct {
@@ -54,6 +56,7 @@ void populate(MyInt i) {
foo.n.a[2] = 'c';
foo.n.a[3] = 'd';
foo.n.e = eOne;
+ foo.n.b = false;
foo.f = NULL;
forward = NULL;
bar.b = i;
|
✅ With the latest revision this PR passed the Python code formatter. |
a4bf873
to
f6e9b1e
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Makes sense to me.
Make SymbolFileCTF::ParseFunctions resilient against not being able to resolve the argument or return type of a function. ResolveTypeUID can fail for a variety of reasons so we should always check its result. The type that caused the crash was `_Bool` which we didn't recognize as a basic type. This commit also fixes the underlying issue and adds a test. rdar://126943722 (cherry picked from commit fd4399c)
Make SymbolFileCTF::ParseFunctions resilient against not being able to
resolve the argument or return type of a function. ResolveTypeUID can
fail for a variety of reasons so we should always check its result.
The type that caused the crash was
_Bool
which we didn't recognizeas a basic type. This commit also fixes the underlying issue and adds
a test.
rdar://126943722