我正在开发的软件有相当多的代码处理内存不足的情况,如下所示
/* Leave object->data.cue_sheet.tracks untouched if realloc fails */
FLAC__StreamMetadata_CueSheet_Track *tmpptr;
if ((tmpptr = realloc(object->data.cue_sheet.tracks, new_size)) == NULL)
return false;
object->data.cue_sheet.tracks = tmpptr;在过去,在这样的代码中发现了bug(大部分是内存泄漏),但是调试和测试这段代码相当困难,因为我似乎找不到一种方法来模拟我的PC上内存不足的行为。华润似乎没有这方面的功能,ulimit也不适用于地址消毒器之类的工具。但是,这个软件(libFLAC)是在嵌入式环境中使用的,所以我想在一定程度上验证这种行为。
有没有办法触发内存不足的处理?
发布于 2022-09-10 18:35:14
我用模糊的方式实现了这一点。这使得它也可以很好地复制。库fuzzer在每次模糊尝试开始时设置一个数字,并且截获所有malloc/realloc/calloc调用。如果截获的malloc/realloc/calloc是该尝试中的第n个,则模拟失败。
这样,就可以使用模糊逻辑来查找有趣的设置组合和特定的分配失败。
从库中经过模糊处理的代码中摘录的内容:
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
extern int alloc_check_threshold, alloc_check_counter;
static inline int alloc_check() {
if(alloc_check_threshold == INT32_MAX)
return 0;
else if(alloc_check_counter++ == alloc_check_threshold)
return 1;
else
return 0;
}
static inline void *realloc_(void *ptr, size_t size)
{
/* Fail if requested */
if(alloc_check())
return NULL;
return realloc(ptr, size);
}
#else
#define realloc_ realloc
#endif还有一段摘录在乌云里
extern int alloc_check_threshold, alloc_check_counter;
int alloc_check_threshold = INT32_MAX, alloc_check_counter = 0;
[...]
alloc_check_threshold = data[2];
alloc_check_counter = 0;发布于 2022-08-15 16:50:27
有人开发了一种名为故障研磨机的工具(不是发行版的一部分)。
参见例如https://sourceforge.net/p/valgrind/mailman/message/29682613/
https://stackoverflow.com/questions/73316357
复制相似问题