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会加载minmax地址rdxrcx中,而不是加载它们的rdxrcx中.

可编译示例:

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

posted @   zjh6  阅读(20)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示