修复 VirtualMethodGroupCalculator没有考虑到某个类本身没有实现它的接口类的某个函数但它的父类实现了它的接口类的该函数时没有将接口的该函数和父类的该虚函数计算为一个Group的bug

before-split
walon 2025-05-24 00:01:33 +08:00
parent 48f1dfe64a
commit b2d7637438
1 changed files with 23 additions and 2 deletions

View File

@ -61,6 +61,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
var typeMethods = new TypeFlatMethods();
var interfaceMethods = new List<MethodDef>();
if (typeDef.BaseType != null)
{
TypeDef baseTypeDef = MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(typeDef.BaseType);
@ -70,10 +71,30 @@ namespace Obfuz.ObfusPasses.SymbolObfus
{
TypeDef intfTypeDef = MetaUtil.GetTypeDefOrGenericTypeBaseThrowException(intfType.Interface);
CalculateType(intfTypeDef);
typeMethods.flatMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods);
//typeMethods.flatMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods);
interfaceMethods.AddRange(_visitedTypes[intfTypeDef].flatMethods);
}
}
foreach (var method in typeDef.Methods)
foreach (MethodDef method in interfaceMethods)
{
if (typeMethods.TryFindMatchVirtualMethod(method, out var matchMethodDef))
{
// merge group
var group = _methodGroups[matchMethodDef];
var matchGroup = _methodGroups[method];
if (group != matchGroup)
{
foreach (var m in matchGroup.methods)
{
group.methods.Add(m);
_methodGroups[m] = group;
}
}
}
}
typeMethods.flatMethods.AddRange(interfaceMethods);
foreach (MethodDef method in typeDef.Methods)
{
if (!method.IsVirtual)
{