我需要使用真实的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
;
}
显然,这些都是琐碎的例子。在涉及更多现实世界的问题中,您应该意识到内存的“未初始化”性质是可传递的。在使用未初始化的内存会影响软件的行为之前,Valgrind不会发出错误消息。
例如,您可能有