Skip to content

Type returned by custom demangler written in Python is not applied #8099

@bdash

Description

@bdash

Version and Platform (required):

  • Binary Ninja Version: 5.4.9471-dev Ultimate, c9252859
  • OS: macos
  • OS Version: 26.4
  • CPU Architecture: arm64

Bug Description:
A user on Slack reported that even though they're returning a type from their custom demangler, it is not being applied to the symbol in question. This works correctly for demanglers written in C++ (our GNU3 / MSVC demanglers) and Rust (our Swift demangler).

Steps to reproduce:
I was able to reproduce with this unit test:

def test_custom_demangler_applies_type(self):
	"""Test that a custom Demangler subclass correctly returns both type and name via demangle_generic."""
	mangled_prefix = "_CUSTOMTEST_"

	class TypeTestDemangler(Demangler):
		name = "TypeTestDemangler"

		def is_mangled_string(self, name: str) -> bool:
			return name.startswith(mangled_prefix)

		def demangle(self, arch, name, view=None, simplify=False):
			if not name.startswith(mangled_prefix):
				return None
			demangled_name = name[len(mangled_prefix):]
			func_type = Type.function(Type.int(4), [
				FunctionParameter(Type.pointer(arch, Type.char()), "arg1"),
			])
			return (func_type, QualifiedName(demangled_name))

	TypeTestDemangler().register()
	arch = Architecture["x86_64"]

	result = demangle_generic(arch, mangled_prefix + "my_func")
	assert result is not None, "demangle_generic returned None"
	demangled_type, demangled_name = result

	assert demangled_name == ["my_func"], f"Expected ['my_func'], got {demangled_name}"
	assert demangled_type is not None, "Custom demangler type was not returned by demangle_generic"
	assert demangled_type.type_class == bn.TypeClass.FunctionTypeClass, \
		f"Expected FunctionTypeClass, got {demangled_type.type_class}"

This gives:

FAILED AssertionError: Custom demangler type was not returned by demangle_generic

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions