C可变参数log函数调用snprintf输出随机值问题排查求助
问题根因
代码存在两处标准用法错误,和编译器无关:
- 错误使用
snprintf处理va_list参数:snprintf直接接受可变参数列表,不能传入已经封装好的va_list类型对象,该场景下需要改用vsnprintf完成格式化。你当前的写法会导致参数解析完全错位,读取到栈上的随机内存值,所以输出的数字每次运行都会变化。 - 格式化符与变量类型不匹配:
lnum的类型是无符号的size_t,但你使用了对应有符号int的%d格式化,属于未定义行为,会额外增加参数偏移错误的概率。
修复后代码
#include <fstream> #include <cstdlib> #include <iostream> #include <cstdarg> void log(const char *file_name, size_t lnum, const char *func_name, const char *fmt, ...) { va_list args; va_start(args, fmt); char y[2048]; // 替换为vsnprintf处理va_list vsnprintf(y, sizeof(y), fmt, args); va_end(args); char x[256]; // size_t类型使用%zu作为格式化符 snprintf(x, sizeof(x), ":%s:%zu:%s:", file_name, lnum, func_name); std::cout << x << y; } int main() { int idx = -2; log(__FILE__, __LINE__, __func__, "this should be -2!? --> %d <--\n", idx); }
额外提示
编译时加上-Wall -Wextra参数开启基础警告,g++会直接提示这两处错误,不用自行排查。
内容的提问来源于stack exchange,提问作者Pyper
相关产品推荐
相关产品推荐

