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

问题描述 投票:0回答:1

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

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

您能否提供一个示例并解释对程序的修改,当使用给定的输入执行该程序时会导致内存故障?

c security memory-leaks valgrind dynamic-memory-allocation
1个回答
0
投票

我给你举几个例子。

#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
       ;
}

显然,这些都是琐碎的例子。在涉及更多现实世界的问题中,您应该意识到内存的“未初始化”性质是可传递的。在使用未初始化的内存会影响软件的行为之前,Valgrind不会发出错误消息。

例如,您可能有

  1. 使用malloc分配的结构s1。
  2. s1的所有字段均已初始化,但f1除外。
  3. s1被复制到s2。没有发出错误。
  4. s2被复制到s3。没有发出错误。
  5. 在s3.f1上完成了读取。现在,Valgrind发出一个错误。它将给出此处的堆栈以及步骤1的分配堆栈。
© www.soinside.com 2019 - 2024. All rights reserved.