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 @ 2022-11-25 09:49  zjh6  阅读(23)  评论(0)    收藏  举报  来源