-Wformat-truncation error writing 2-3 bytes into region of 2-6 bytes
-Wformat-truncation error writing 2-3 bytes into region of 2-6 bytes
我对以下功能有疑问:
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-6 字节大小的区域中不应截断 2-3 字节,那么出现警告的原因是什么?最好的猜测是区域 (2) 的下限可能会截断 3 个字节?但这完全是假的——区域的大小最多为 6 个字节,并且只有在写入超过 6 个字节时才应该截断....对吗?
编辑:我发现的其他问题与将更多字节写入更少字节的区域有关,这导致添加 % 以强制执行输入大小上限。
在 tm
中,字段是 int
,所以有 signed,对于编译器,你计算的所有数字都可以是负数,但你调整了你的大小数组假设所有都是正数,因为你知道 localtime_r
做什么,但是对于编译器来说,26 个字节是必需的,因为最坏的情况就像 -9999--13--31_-23--59--59
当然大小为 20 没有未定义的行为,因为您使用 snprintf
而不是 printf
,但是例如使用 -Wall
编译会激活警告的产生
将尺寸 20 至少替换为 26,您将不会收到警告
我对以下功能有疑问:
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-6 字节大小的区域中不应截断 2-3 字节,那么出现警告的原因是什么?最好的猜测是区域 (2) 的下限可能会截断 3 个字节?但这完全是假的——区域的大小最多为 6 个字节,并且只有在写入超过 6 个字节时才应该截断....对吗?
编辑:我发现的其他问题与将更多字节写入更少字节的区域有关,这导致添加 % 以强制执行输入大小上限。
在 tm
中,字段是 int
,所以有 signed,对于编译器,你计算的所有数字都可以是负数,但你调整了你的大小数组假设所有都是正数,因为你知道 localtime_r
做什么,但是对于编译器来说,26 个字节是必需的,因为最坏的情况就像 -9999--13--31_-23--59--59
当然大小为 20 没有未定义的行为,因为您使用 snprintf
而不是 printf
,但是例如使用 -Wall
编译会激活警告的产生
将尺寸 20 至少替换为 26,您将不会收到警告