gpt4 book ai didi

c++ - 将可变参数模板参数转发给类似 printf 的函数

转载 作者:太空狗 更新时间:2023-10-29 23:16:09 31 4
gpt4 key购买 nike

我有以下日志功能:

template<typename... Arguments>
void Log(const char* file, const int line, int level, const char* fmt, Arguments... args)
{
std::string formattedFile;

if (file)
{
boost::filesystem::path p(file);
formattedFile = p.filename().string();
}

std::string message{boost::str(boost::format("%1%:%2% [%3%] - %s") % formattedFile % line % m_uxid % fmt)};
__android_log_print(level, m_tag.c_str(), message.c_str(), args...);
}

此应用程序使用 NDK 在 Android 上运行,因此这是该平台的日志记录系统。问题是 __android_log_print() 编译失败:

error: format not a string literal and no format arguments [-Werror=format-security]
__android_log_print(level, m_tag.c_str(), message.c_str(), std::forward<Arguments>(args)...);
^

我不确定这是什么意思。我没有正确使用可变参数模板参数吗?

最佳答案

printf 中不受信任的输入可能是一个安全问题。使用字符串文字强制格式是 boost 安全性的一种方法

将警告转化为错误会导致构建失败,因此您不得不处理警告。

海湾合作委员会的 warning options有话要说

-错误:
将所有警告变为错误。

-Wformat-security:
警告有关表示可能存在安全问题的格式函数的使用。
目前,这会警告调用 printf 和 scanf 函数,其中格式字符串不是字符串文字 并且没有格式参数
如果格式字符串来自不受信任的输入并且包含 %n,则这可能是一个安全漏洞。

通常建议在您的函数中创建一个 std::string 并将其与 %s 格式字符串文字一起传递给您的日志记录函数

__android_log_print(level, m_tag.c_str(), "%s", message.c_str());

消息是通过处理 args... 构建的,通常使用类似 boost::formatstd::stringstream 的东西。

如果您想使用您提供的 fmt 字符串和可变参数,您可以使用生成 std 的自定义 printf 样式函数解析参数: :字符串

std::string va_string_printf(const char* format, va_list ap)
{
char stack_buf[256];

char* buf = stack_buf;
int buf_size = sizeof(stack_buf);

std::string out_str;

while(true)
{
va_list ap1;
va_copy(ap1, ap);
int min_buf_size = vsnprintf(buf, buf_size, format, ap1) + 1;
va_end(ap1);

if (min_buf_size > buf_size)
{
if (buf != stack_buf) // allocate a bigger buffer
delete[] buf;

buf = new char[min_buf_size];
buf_size = min_buf_size;
continue;
}

out_str = buf;
break;
}

if (buf != stack_buf)
delete[] buf;

return out_str;
}

std::string string_printf(const char* format, ...)
{
va_list ap;
va_start(ap, format);
std::string str = va_string_printf(format, ap);
va_end(ap);

return str;
}

关于c++ - 将可变参数模板参数转发给类似 printf 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858074/

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