【发布时间】:2018-05-06 08:21:28
【问题描述】:
今天遇到一些代码,大致如下sn-p。 valgrind 和 UndefinedBehaviorSanitizer 都检测到未初始化数据的读取。
template <typename T>
void foo(const T& x)
{
static_assert(std::is_pod_v<T> && sizeof(T) > 1);
auto p = reinterpret_cast<const char*>(&x);
std::size_t i = 1;
for(; i < sizeof(T); ++i)
{
if(p[i] != p[0]) { break; }
}
// ...
}
上述工具抱怨 p[i] != p[0] 比较时,
包含填充字节的对象已传递给foo。示例:
struct obj { char c; int* i; };
foo(obj{'b', nullptr});
从 POD 类型中读取填充字节并将它们与其他内容进行比较是未定义的行为吗?我在 Standard 和 StackOverflow 上都找不到明确的答案。
【问题讨论】:
标签: c++ language-lawyer padding undefined-behavior standard-layout