修复计算虚函数名冲突域时只考虑到虚函数所定义的类,而未考虑到在整个类继承树内不冲突的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) 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) private string GetDefaultNewName(object scope, string originName)
@ -93,15 +93,15 @@ namespace Obfuz.ObfusPasses.SymbolObfus.NameMakers
while (true) while (true)
{ {
string newName = scope.GetNewName(originalName, false); 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; continue;
} }
else else
{ {
foreach (var method in virtualMethodGroup.methods) foreach (var s in virtualMethodGroup.GetNameDeclaringTypeScopes())
{ {
GetNameScope(method.DeclaringType).AddPreservedName(newName); GetNameScope(s).AddPreservedName(newName);
} }
return newName; return newName;
} }

View File

@ -12,6 +12,36 @@ namespace Obfuz.ObfusPasses.SymbolObfus
public class VirtualMethodGroup public class VirtualMethodGroup
{ {
public List<MethodDef> methods; 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 public class VirtualMethodGroupCalculator