如何创建 Valgrind 可检测到的动态分配的内存故障?

How to create a dynamically allocated memory fault detectable by Valgrind?

我需要使用一个真正的 C 程序来举例说明内存安全概念。这个想法是在使用 malloc 的程序中注入或删除一些语句,以造成内存问题。程序的修改版本必须在运行时导致内存错误。 Valgrind 应该可以检测到该问题,因此与动态分配的内存(而非堆栈内存)有关。它还应该有一个预制的测试用例或测试输入来触发问题。

我不明白如何创建动态分配的内存错误。

您能否举个例子并解释当程序以给定输入执行时导致内存错误的程序修改?

我举几个例子。

#include <stdlib.h>

int main(void)
{
    int*pi1  = malloc(10*sizeof(int));
    if (pi1[5]) // ERROR here, see 4.2.2 in the manual
        ;
    free(pi1);

    int* pi2 = malloc(10*sizeof(int));
    free(pi2);
    if (pi2[5]) // ERROR here, a variation of 4.2.1 in the manual
        ;

    int* pi3 = (int*)0x500000000000U;
    if (*pi3) // ERROR and probably a crash, see 4.2.1 in the manual
       ;
}

显然这些都是微不足道的例子。在更复杂的现实世界问题中,您应该意识到 'uninitialized' 内存的性质是可传递的。在未初始化内存的使用对软件的行为产生影响之前,Valgrind 不会发出错误消息。

例如,您可以

  1. 用 malloc 分配的结构 s1。
  2. 除 f1 外,s1 的所有字段都已初始化。
  3. s1 被复制到 s2。没有发出错误。
  4. s2 被复制到 s3。没有发出错误。
  5. 对 s3.f1 进行了读取。现在 Valgrind 发出一个错误。会给出这里的栈和第一步的分配栈。