c++ 地址清理程序未找到缺失的delete语句

9rygscc1  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(98)

我已经在Visual Studio中为我的项目启用了Address Sanitizer,并在Microsoft Learn中的以下代码上成功地测试了它。

#include <stdio.h>

int x[100];

int main() {
    printf("Hello!\n");
    x[100] = 5; // Boom!
    return 0;
}

但是,清理程序无法在以下代码中找到缺失的delete语句:

struct Object {
    int x;
    int y;
};

int main() {
    Object* obj = new Object();
    // Boom!
    return 0;
}

查看生成的程序集,我们可以看到new操作符确实被调用了,并且没有被优化掉。以下输出取自Debug/x86配置,但类似的输出可以从Debug/x64、Release/x86和Release/x64配置中获得。

; 6    : int main() {

    push    ebp
    mov ebp, esp
    sub esp, 12                 ; 0000000cH
    mov ecx, OFFSET __62A33F1D_Source@cpp
    call    @__CheckForDebuggerJustMyCode@4

; 7    :    Object* obj = new Object();

    push    8
    call    ??2@YAPAXI@Z                ; operator new

地址过滤器能检测到这种类型的错误吗?如果能,我怎样才能成功地检测到错误?

v1uwarro

v1uwarro1#

Microsoft地址清理程序不检测内存泄漏。请参阅链接的page的第二个注解。
...请向我们发送有关您希望在未来版本中看到的内容的反馈。您的反馈有助于我们为将来的其他杀毒软件确定优先级,例如/fsanitize=thread/fsanitize=leak/fsanitize=memory ...

相关问题