【发布时间】:2018-02-05 20:47:16
【问题描述】:
为了在限制条件下测试软件,我正在尝试创建一个测试用例,其中提供的用户缓冲区分配在某个非常低的内存地址。非常接近NULL 的东西,例如0x1000h。
事实证明,这是一个艰难的条件。
实际上,我无法在 Linux、BSD、Windows 或 OS-X 上使用 malloc() 生成它。
我确信这种情况可能发生在其他类型的设备上,但我需要一个可以插入到 CI 测试套件中的可重现测试用例。
是否有任何已知的具有中等复杂性(和依赖性)的方法来生成此类条件?
编辑:选择解决方案proposed by Eric Postpischil,使用mmap()。请注意,as underlined by R.,首先需要降低最低地址限制,在/proc/sys/vm/mmap_min_addr(在 Linux 上)可读。
sudo sysctl -w vm.mmap_min_addr="4096"
然后是示例代码:
#include <stdio.h> /* printf */
#include <sys/mman.h> /* mmap */
int main(int argc, const char** argv)
{
void* lowBuff = mmap((void*)(0x1000), 64<<10,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS,
-1, 0);
printf("lowBuff starts at %p \n", lowBuff);
}
结果:
lowBuff starts at 0x1000
【问题讨论】:
-
虚拟内存不是这样工作的。程序中的物理地址和虚拟地址没有联系。哎呀,内存甚至可能被分页到磁盘而不是实际的 RAM。
-
至于在内存不足的情况下进行测试,有一些工具可以帮助您解决这个问题(但在 SO 上询问它们是题外话)。但是,当您运行不足时会发生什么取决于。您的进程可能会终止,其他一些随机进程可能会终止,或者
malloc可能只是返回一个空指针(您应该始终检查并处理它)。 -
@Someprogrammerdude:这个问题问的是低值地址,而不是低内存。
-
@Cyan 你可能有一个XY Problem。你的问题是你想测试一个如果给定低内存地址可能有错误的程序。您的解决方案是尝试并实际分配该低内存地址。你在问你的解决方案。或许您应该问一下您的问题:我如何测试这种情况? 甚至更好:我如何消除这类问题? i>
-
@Someprogrammerdude:这个问题没有提到物理或虚拟寻址。是什么让您认为 OP 想要一个低物理地址?对于测试软件处理低地址的错误,虚拟地址是相关的,而不是物理地址
标签: c memory-address