Dumper-7 should be using FindFunctionChecked on ProcessEvent calls to account for overrides. #447
Labels
No labels
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
OldButImportant
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
software-migration-backups/Dumper-7-17-05-2026#447
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Dumper-7 does not call UFunctions properly.
Currently, this is the generator's FunctionImplementation string.
By "hardcoding" the C++ class name as the first parameter of the GetFunction call, it's explicitly telling Unreal to get the function from a specific class, even when the actual instance might have an override.
Using FixedOuterName is not a foolproof solution in this scenario. Sometimes FixedOuterName gets the Blueprint class name when dumping Blueprint classes, but it can't know if that function will be overridden later.
FixedOuterName is just whatever class owned the function during the dump, not necessarily the right class to call it from at runtime.
FindFunctionChecked
FindFunctionChecked handles this dynamically. It just finds the right function to call. If there's an override, it finds it. If not, it uses the parent version. I believe this is the only way to correctly handle blueprint overrides that you can't predict when generating code.
Dumper-7's generator output should look something like this:
The code above resembles what the engine itself does, as shown through this screenshot from IDA:
If there's no FName constructor, UKismetStringLibrary::Conv_StringToName could be used.
For compatibility, you can find the address to FindFunctionChecked using a single string reference in memory. I have confirmed the existence of that string starting at least from UE4.16 -> latest UE5. It's very likely that it exists on earlier engine versions.
The string ref is: "Failed to find function %s in %s".
Why does this matter?
It matters because this is not intended behavior. Blueprint overrides, if any, are not supposed to be ignored.
With this issue, I intend to bring attention to this problem to Fischsalat, the project's main developer. I will make a pull request eventually if I need to, I just need to learn this codebase fully.
I think you missed the point that the function pointer is cached with
static class UFunction* Func.You can’t use
FindFunctionCheckedin a base class, the first call will cache the pointer to the UFunction of the object’s class and may call the wrong function later.I don't see a good way to solve this in the Dumper, since not all Blueprint classes are loaded at all times and the Dumper can't know how many child classes a parent class has.
I think you're better off making your own function-wrapper, and call the function you need.
You are right, and the only workaround in this situation to me is to not cache the function pointers. Unreal calls FindFunctionChecked with cached FNames (ones that are already in memory), but the function pointer is entirely local per call.