我有以下程序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 测试