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
构.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现