gpt4 book ai didi

c++ - 简单记录器类 vsnprintf 因读取访问冲突而崩溃

转载 作者:行者123 更新时间:2023-11-28 01:55:59 27 4
gpt4 key购买 nike

在实现一个简单的 printf 样式记录器时,我遇到了 vsnprintf 崩溃。这就是我调用记录器实用程序的方式:

LoggerUtil->LogInfo("Whatever info here %s", "just a test!");

它调用一个参数数量可变的函数。我的想法是向格式字符串添加额外信息,因此我需要更改 fmt:

std::string LoggerUtil::LogClientInfo(const char* fmt)
{
return "Some info here %s";
}

void LoggerUtil::LogInfo(const char* fmt, ...)
{
std::string formatStr = LogClientInfo(fmt); // returns "Some info here %s" just for testing altering the format string
const char* format = formatStr.c_str(); // checked memory and its '\0' terminated string
va_list arg_list;
va_start(arg_list, format);
Logger::InfoVA(format, arg_list);
va_end(arg_list);
}

void Logger::InfoVA(const char* fmt, va_list arg_list)
{
Log(Priority_Info, fmt, arg_list);
}

void Logger::Log(Priority priority, const char* fmt, va_list args)
{
char str[MaxLogEntrySize];
memset(str,0,MaxLogEntrySize*sizeof(char));
vsnprintf(str,MaxLogEntrySize-1, fmt, args); // CRASH :(
...
}

无法找出主要问题,不使用 fmt 回火解决了问题,但这不是一个选项:

void LoggerUtil::LogInfo(const char* fmt, ...)
{
va_list arg_list;
va_start(arg_list, fmt);
Logger::InfoVA(fmt, arg_list);
va_end(arg_list);
}

我在这里错过了什么?

最佳答案

在使用 LogClientInfo() 创建新的格式字符串后,您将错误的输入值传递给 va_start() 的第二个参数。您正在传递本地 format 变量,但您需要传递 LogInfo()fmt 参数。仅仅因为您在调用 Logger::InfoVA() 时使用了不同的格式字符串,不会更改输入格式值的存储位置。 va_start()va_list 配置为指向相对于指定参数的下一个函数参数,在这种情况下,它需要是 fmt函数参数,而不是本地 format 变量:

void LoggerUtil::LogInfo(const char* fmt, ...)
{
std::string formatStr = LogClientInfo(fmt);
va_list arg_list;
va_start(arg_list, fmt); // <-- use fmt here !
Logger::InfoVA(formatStr.c_str(), arg_list);
va_end(arg_list);
}

关于c++ - 简单记录器类 vsnprintf 因读取访问冲突而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41172274/

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