【发布时间】:2015-08-21 16:06:33
【问题描述】:
我想利用可以更改内存分配参数的 MALLOC_PERTURB_ 环境变量(man 3 mallopt)。但是,我想控制应用程序级别的分配参数,而不是整个系统级别。理想情况下,如果我可以通过项目的 makefile 控制它们。我尝试通过 makefile 更改提到的变量,但没有成功。
为了测试,我创建了这个 test.c 文件:
#include<stdlib.h>
#include<stdio.h>
#define N 50
int main()
{
char *chars;
int i;
if (NULL == (chars = malloc(N * sizeof(*chars))))
return EXIT_FAILURE;
free(chars);
for (i = 0; i < N; ++i)
printf("%c", chars[i]);
printf("\n");
return EXIT_SUCCESS;
}
是的,我知道我正在从释放的内存中读取,但这就是使用 MALLOC_PERTURB_ 的全部意义所在。
预期结果:50 个字符的 ASCII 字符,值为 MALLOC_PERTURB_。
足够接近:
$ export MALLOC_PERTURB_=97
$ gcc test.c -o test
$ ./test
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa��
$ export MALLOC_PERTURB_=105
$ gcc test.c -o test
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��
然后我尝试将编译包含在makefile中,但没有成功。
导出变量 (as proposed here)
生成文件
all:
export MALLOC_PERTURB_=110
gcc test.c -o test
结果(我希望 110 有 'n' 个字母)
$ export MALLOC_PERTURB_=105
$ make
export MALLOC_PERTURB_=110
gcc test.c -o test
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��
递归调用 make (as proposed here)
生成文件
all:
MALLOC_PERTURB_=110
$(MAKE) rec
rec:
gcc test.c -o test
结果(我希望 110 有 'n' 个字母)
$ export MALLOC_PERTURB_=105
$ make
MALLOC_PERTURB_=110
make rec
make[1]: Entering directory '~/test'
gcc test.c -o test
make[1]: Leaving directory '~/test'
$ ./test
iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii��
我试图从 github 的包含 MALLOC_PERTURB_ 的 makefile 中找到任何灵感,但它们太复杂了,我无法理解。 一些例子:(1)、(2)、(3)
一些技术信息:
Linux 4.0.1-1-ARCH x86_64
gcc version 4.9.2 20150304 (prerelease) (GCC)
GNU Make 4.1
【问题讨论】:
-
只是为了我的教化,这个表达式是什么:'sizeof(*chars)'试图完成? sizeof() 唯一知道的是 'char * chars' 的大小为(对于 32 位系统)为 4 并且取消引用指针为 1。这似乎是一种复杂的说 sizeof(char) 的方式,它始终为 1 并且malloc() 参数中永远不需要
-
在第一个示例中,与您的问题相关的唯一行是:'.PHONY: test test: $(BIN)/gtest$(BASENAME) MALLOC_PERTURB_=21 MALLOC_CHECK_=2 LD_LIBRARY_PATH=$(LIB ) $(BIN)/gtest$(BASENAME)' 在调用 gtest... 程序之前设置了 2 个(临时)环境变量
-
您可以在
export行之后添加分号和反斜杠,这样就可以了。就目前而言,make创建一个运行export的 shell,然后创建另一个 shell 来运行测试(因此第二个 shell 不知道导出的变量)。我的建议迫使make将两条线视为一条线。还有一个指令可以添加到makefile,它告诉GNUmake在单个shell 中运行目标的所有操作;它被恰当地命名为.ONESHELL:。 -
@user3629249 考虑到 sizeof:我更喜欢使用 sizeof(*VARIABLE_NAME) 而不是 sizeof(VARIABLE_TYPE),因为它允许我快速安全地更改变量类型。这样我就不必在我的代码中搜索所有出现的 sizeof(VARIABLE_TYPE) 。有关更多信息,请参阅此问题的已接受答案:(stackoverflow.com/questions/373252/…)。
标签: c unix makefile malloc gnu-make