gpt4 book ai didi

c - 使用可变宏和函数时为 "Uninitialised value was created by a stack allocation"

转载 作者:行者123 更新时间:2023-12-02 07:32:30 31 4
gpt4 key购买 nike

我有以下程序 http://ideone.com/1RPs8E .它使用可变参数函数 tlog 将在日志文件中打印一行。它接收打印行的级别、文件名、一行和调试信息的函数以及 printf 的格式和参数列表。

void tlog(int level, const char *file, int line, const char *fun, const char *fmt, ...)

我还使用了一个 LOGL 宏,它为当前文件、行和函数调用 tlog 函数。

#define LOGL(level, fmt, ...) tlog(level, __FILENAME__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)

以及各种使用 LOGL 宏的宏,例如:

#define DEBUGEX(fmt, ...) LOGL(LDEBUGEX, fmt, ##__VA_ARGS__)
#define DEBUG(fmt, ...) LOGL(LDEBUG, fmt, ##__VA_ARGS__)
#define INFO(fmt, ...) LOGL(LINFO, fmt, ##__VA_ARGS__)

在 valgrind 中运行程序时:

$ valgrind -v --track-origins=yes ./t

我在第 150 行收到以下错误:“未初始化的值是由堆栈分配创建的”(当我使用 DEBUGEX 宏时)。完整日志在这里:http://pastebin.com/rZu4nkHd

代码有什么问题?对我来说似乎没问题。如果我从 tlog 函数和所有调用它的宏中删除 level 参数,错误就不会再发生。

在 Archlinux 上用 gcc 4.8.2 测试,在 Ubuntu 12.04.3 上用 gcc 4.6.3 测试

最佳答案

#define nmemb 1
#define size 32

...
void *_nptr_ = calloc((nmemb), (size));
LOGL(LDEBUGEX, "CALLOC: %#lX nmemb %ld, size %ld", _nptr_, (nmemb), (size));

三个转换说明符都是错误的。

后两个转换说明符导致 Valgrind 报错,因为传入的数据量 (int) 与格式预期的 (long) 不匹配。

格式应该是这样的:

..., "%p ... %d ... %d", _nptr_, ...

然而,“更好”的方法是:

#define nmemb ((size_t) 1)
#define size ((size_t) 32)

...

..., "%p ... %zu ... %zu", _nptr_, nmemb, size);

关于c - 使用可变宏和函数时为 "Uninitialised value was created by a stack allocation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20439920/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com