首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何验证程序的内存不足行为

如何验证程序的内存不足行为
EN

Stack Overflow用户
提问于 2022-08-11 06:46:40
回答 2查看 30关注 0票数 0

我正在开发的软件有相当多的代码处理内存不足的情况,如下所示

代码语言:javascript
复制
/* 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)是在嵌入式环境中使用的,所以我想在一定程度上验证这种行为。

有没有办法触发内存不足的处理?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-10 18:35:14

我用模糊的方式实现了这一点。这使得它也可以很好地复制。库fuzzer在每次模糊尝试开始时设置一个数字,并且截获所有malloc/realloc/calloc调用。如果截获的malloc/realloc/calloc是该尝试中的第n个,则模拟失败。

这样,就可以使用模糊逻辑来查找有趣的设置组合和特定的分配失败。

下面是我实现的代码和一个小的附加位这里

从库中经过模糊处理的代码中摘录的内容:

代码语言:javascript
复制
#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

还有一段摘录在乌云里

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2022-08-15 16:50:27

有人开发了一种名为故障研磨机的工具(不是发行版的一部分)。

参见例如https://sourceforge.net/p/valgrind/mailman/message/29682613/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73316357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档