修复计算虚函数名冲突域时只考虑到虚函数所定义的类,而未考虑到在整个类继承树内不冲突的bug
parent
e818c6ad4d
commit
febb8c9fd8
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue