class 中不相关的虚函数 Table 条目
Virtual Function Table entry from class that is not related
我正在浏览一个简单的 C++ Windows 程序的 VFT (VMT)(我没有源代码,只有二进制文件),由 Visual Studio 编译,并进行了某种优化.
我注意到它使用了继承和多态性。我为程序的每个 class 找到了 struct s_RTTIBaseClassArray
的位置。在那个位置有一个指向结构 _s_RTTIBaseClassDescriptor
的指针数组。基本 class 描述符数组应该为您提供有关当前 class 派生自的所有 class 的信息。
虚函数(方法)Table是一个table,包含指向当前class的所有虚函数的指针。然而,在一些 classes 的 VFT 中,我发现了一个指向虚拟方法的指针,它实际上属于另一个 class ,即(根据 Base Class Array)与当前不相关class。下面的示例:
ClassA_BaseClassArray:
dd offset ClassA_BaseClassDescriptor
dd offset ClassB_BaseClassDescriptor ; ClassA inherits from ClassB
ClassB_BaseClassArray:
dd offset ClassB_BaseClassDescriptor
ClassC_BaseClassArray:
dd offset ClassC_BaseClassDescriptor
ClassA_VMT:
dd offset ClassA_VM1 ; virtual method of ClassA
dd offset ClassA_VM2
dd offset ClassB_VM2 ; virtual method of ClassB - override
dd offset ClassC_VM3 ; virtual method of ClassC - NOTHING TO DO HERE
dd offset ClassA_VM3
例子很短,实际classes有更多的虚拟方法。
检查 ClassC_VM3
后我注意到,它只包含两条指令:
mov eax, [ecx+10h]
retn
到目前为止,我发现了大约3个与此示例类似的VMT,无关的方法总是这么短。
我的问题是:这是什么原因造成的?难不成ClassC_VM3
的代码和某个ClassA
方法的代码一样,所以编译器直接优化掉了?
这可能是由 COMDAT folding 引起的,这是一种将具有完全相同的机器代码的函数合并为一个的优化。由于它是如此简单的功能,所以它的机会很大。
我正在浏览一个简单的 C++ Windows 程序的 VFT (VMT)(我没有源代码,只有二进制文件),由 Visual Studio 编译,并进行了某种优化.
我注意到它使用了继承和多态性。我为程序的每个 class 找到了 struct s_RTTIBaseClassArray
的位置。在那个位置有一个指向结构 _s_RTTIBaseClassDescriptor
的指针数组。基本 class 描述符数组应该为您提供有关当前 class 派生自的所有 class 的信息。
虚函数(方法)Table是一个table,包含指向当前class的所有虚函数的指针。然而,在一些 classes 的 VFT 中,我发现了一个指向虚拟方法的指针,它实际上属于另一个 class ,即(根据 Base Class Array)与当前不相关class。下面的示例:
ClassA_BaseClassArray:
dd offset ClassA_BaseClassDescriptor
dd offset ClassB_BaseClassDescriptor ; ClassA inherits from ClassB
ClassB_BaseClassArray:
dd offset ClassB_BaseClassDescriptor
ClassC_BaseClassArray:
dd offset ClassC_BaseClassDescriptor
ClassA_VMT:
dd offset ClassA_VM1 ; virtual method of ClassA
dd offset ClassA_VM2
dd offset ClassB_VM2 ; virtual method of ClassB - override
dd offset ClassC_VM3 ; virtual method of ClassC - NOTHING TO DO HERE
dd offset ClassA_VM3
例子很短,实际classes有更多的虚拟方法。
检查 ClassC_VM3
后我注意到,它只包含两条指令:
mov eax, [ecx+10h]
retn
到目前为止,我发现了大约3个与此示例类似的VMT,无关的方法总是这么短。
我的问题是:这是什么原因造成的?难不成ClassC_VM3
的代码和某个ClassA
方法的代码一样,所以编译器直接优化掉了?
这可能是由 COMDAT folding 引起的,这是一种将具有完全相同的机器代码的函数合并为一个的优化。由于它是如此简单的功能,所以它的机会很大。