【发布时间】:2018-06-08 04:36:49
【问题描述】:
将memset 结构体设置为某个值是否合法,然后将其与memcmp 进行比较?
struct S {
// struct definition not relevant, but it has bitfields
};
struct S invalid_S;
memset(&invalid_S, 0xFF, sizeof invalid_S);
struct S value;
memset(&value, 0, sizeof value); // actual data read would be here
if (memcmp(&invalid_S, &value, sizeof(struct S) != 0) {
/// operate on fields of value
}
struct S value2;
value2 = invalid_S;
if (memcmp(&invalid_S, &value2, sizeof(struct S) != 0) {
/// operate on fields of value, which doesn't happen now
}
上述代码行为是否已明确定义、未定义或实现指定?以上代码的有效性是否取决于struct S?
使用 0xFF 填充结构,然后将其与 memcmp 进行比较的原因是:我有一个函数,它返回一个与我从硬件设备读取的内容相匹配的位域结构,没有浪费位或字节,并且我想要一种有效的方法来报告错误(设备永远不会返回所有 0xFF 字节)。我有固定的平台和工具链,代码现在可以工作,但是如果我提高优化级别,我可以相信它不会中断吗?
结论:虽然如果我确保没有填充位、浮点字段等可能有问题,则可以使此代码工作,但我决定改为将一个特定的结构字段设置为特定的“不可能”值以指示错误。
【问题讨论】:
-
你不能相信跨平台的是位域的确切布局:""关于位域的几乎所有内容都取决于实现" K&R 第 150 页。
-
您的问题太笼统了,无法得到有用的答案。您应该解释您使用的实际编译器和平台,以及您的
struct S到底是什么。 -
@BasileStarynkevitch 是的,但我决定采用替代方法,希望是稳健的方法。
标签: c undefined-behavior unspecified-behavior