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
构.