【发布时间】:2020-05-10 11:28:59
【问题描述】:
我对以下功能有疑问:
std::string TimeToTimestampStr(time_t t)
{
tm aTm;
ACE_OS::localtime_r(&t, &aTm);
// YYYY year
// MM month (2 digits 01-12)
// DD day (2 digits 01-31)
// HH hour (2 digits 00-23)
// MM minutes (2 digits 00-59)
// SS seconds (2 digits 00-59)
char buf[20];
snprintf(buf, 20, "%04d-%02d-%02d_%02d-%02d-%02d",
(aTm.tm_year+1900)%10000,
(aTm.tm_mon+1)%13,
aTm.tm_mday%32,
aTm.tm_hour%24,
aTm.tm_min%60, // warning on this parameter
aTm.tm_sec%60);
return std::string(buf);
}
error: ‘%02d’ directive output may be truncated writing between 2 and 3 bytes into a region of size between 2 and 6 [-Werror=format-truncation=]
不知道为什么会出现这个问题,2-3 字节不应该在 2-6 字节大小的区域中被截断,那么警告的原因是什么?最好的猜测是区域(2)的下限可能会截断 3 个字节?但这完全是假的 - 区域的大小最多为 6 个字节,并且只有在写入超过 6 个字节时才应该截断......对吗?
编辑:我发现的其他问题与将更多字节写入字节较少的区域有关,这导致添加 % 以强制执行输入的大小上限。
【问题讨论】:
-
当您激活有关 format-truncation 的警告时,您将收到该警告。它并没有说你的代码是错误的,它说你截断了,包括你明确截断的时候。 格式截断也有类似的情况。我认为当截断是显式时发出警告也很奇怪,当隐式好的时发出警告,但隐式是“强迫”我们要求 gcc 不产生它们的最佳方式,所以很奇怪
-
如果你的意思是通过 % 截断会激活警告,那么我相信你错了。显式截断允许我摆脱位置 2 的截断警告:
aTm.tm_mon+1。问题是 - 为什么它在位置 5 上不起作用:aTm.tm_min%60?项目 makefile 启用警告,并且由于警告而构建失败。我无法删除 gcc 标志,所以我必须找到解决警告的方法。谢谢! -
看我的回答
-
是的。忘记标记为答案,抱歉
标签: c++ gcc directive format-truncation