d小参数abi漏洞
原文
微软在其C++x64调用约定中声明,最大大小为8字节的构应通过寄存器按值传递(POD与否并不重要).Dmd通过引用传递,所以错了,调用大小为8的非pod标记为extern(C++)的函数时.被调的C++函数按值解释寄存器中指针,并无意义的计算.
Ldc没有该漏洞,正确.
如,对以下定义:
void imgui_draw_rectangle(ImVec2 min, ImVec2 max);
struct ImVec2{
float x, y;
~this(){}
}
调用imgui_draw_rectangle会加载min和max的地址到rdx和rcx中,而不是加载它们的值到rdx和rcx中.
可编译示例:
struct FF {
float x, y;
~this();
}
void draw(FF min, FF max);
void test(FF *a, FF *b) {
draw(*a, *b);
}
如果注释掉~this();',则按值传递参数来绘画.
微软的文档与他们的编译器行为不匹配.有析构器不影响构是否按ref传递,但(与文档相反)有复制构造器会影响.
没错.注意,MSVC++ABI还有另一个特例:通过构中(隐藏的结果指针)返回带有构造器的POD构.
浙公网安备 33010602011771号