修复计算虚函数名冲突域时只考虑到虚函数所定义的类,而未考虑到在整个类继承树内不冲突的bug

before-split
walon 2025-05-29 09:20:40 +08:00
parent e818c6ad4d
commit febb8c9fd8
2 changed files with 34 additions and 4 deletions

View File

@ -59,7 +59,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers
public bool IsNamePreserved(VirtualMethodGroup virtualMethodGroup, string name)
{
return virtualMethodGroup.methods.Any(m => GetNameScope(m.DeclaringType).IsNamePreserved(name));
return virtualMethodGroup.GetNameConflictTypeScopes().Any(m => GetNameScope(m).IsNamePreserved(name));
}
private string GetDefaultNewName(object scope, string originName)
@ -93,15 +93,15 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers
while (true)
{
string newName = scope.GetNewName(originalName, false);
if (virtualMethodGroup.methods.Any(m => GetNameScope(m.DeclaringType).IsNamePreserved(newName)))
if (virtualMethodGroup.GetNameConflictTypeScopes().Any(s => GetNameScope(s).IsNamePreserved(newName)))
{
continue;
}
else
{
foreach (var method in virtualMethodGroup.methods)
foreach (var s in virtualMethodGroup.GetNameDeclaringTypeScopes())
{
GetNameScope(method.DeclaringType).AddPreservedName(newName);
GetNameScope(s).AddPreservedName(newName);
}
return newName;
}

View File

@ -12,6 +12,36 @@ namespace Obfuz.ObfusPasses.SymbolObfus
public class VirtualMethodGroup
{
public List<MethodDef> methods;
private HashSet<TypeDef> _nameScopes;
public HashSet<TypeDef> GetNameConflictTypeScopes()
{
if (_nameScopes != null)
{
return _nameScopes;
}
_nameScopes = new HashSet<TypeDef>();
foreach (var method in methods)
{
TypeDef cur = method.DeclaringType;
while (cur != null)
{
_nameScopes.Add(cur);
cur = MetaUtil.GetBaseTypeDef(cur);
}
}
return _nameScopes;
}
public IEnumerable<TypeDef> GetNameDeclaringTypeScopes()
{
foreach (var method in methods)
{
yield return method.DeclaringType;
}
}
}
public class VirtualMethodGroupCalculator