繁体   English   中英

堆缓冲区溢出——这是地址清理程序的误报吗?

[英]Heap buffer overflow--is this a false positive of address sanitizer?

我有以下简单的程序

void copy(const int16_t *buffer) {
    int16_t *b;
    memcpy(b,buffer,2);
    return ;
}


int LLVMFuzzerTestOneInput(const int16_t *buffer) {
  copy(buffer);
  return 0;
}

我使用地址清理器和模糊器标志使用 clang (v9) 编译如下

clang -fsanitize=address,fuzzer -g test5.c

当我运行生成的可执行文件时,模糊器发现由于无效读取导致堆缓冲区溢出 - 特别是在尝试复制 memcpy 中的第二个字节时。

我无法真正理解为什么这是一个错误。 有什么解释吗? 先感谢您。

由于b在您对其进行memcpy时未初始化,因此您正在调用未定义的行为。 从字面上看,“您要将数据复制到哪里?”

消毒剂是正确的,指出这个问题对你有很大帮助。

那个副本 function 打算做什么?

void copy(const int16_t *buffer) {
    int16_t *b;
    memcpy(b,buffer,2);
    return ;
}

memcpy()复制到“指向”它的缓冲区时b的值是多少?

您可能正在尝试复制指针的,而不是它们指向的 memory,在这种情况下,您将使用类似的东西:

memcpy(&b, &buffer, sizeof b);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM