不可将对象的值赋给具有部分重叠区域的另一个对象
10.4.1 ID_overlappingAssignment
如果两个对象的存储区域有部分重叠,将其中一个对象的值赋给另一个对象会导致标准未定义的行为。
示例:
union U {
int16_t x;
int16_t y;
int64_t z;
} u;
u.x = u.y; // Compliant
u.z = u.x; // Non-compliant, undefined behavior
例中 x 和 y 的存储区域完全重叠且类型相同,可以相互赋值;x 和 z 有部分重叠,不可相互赋值。
依据
ISO/IEC 9899:1999 6.5.16.1(3)-undefined
ISO/IEC 9899:2011 6.5.16.1(3)-undefined
ISO/IEC 14882:2003 5.17(8)-undefined
ISO/IEC 14882:2011 5.17(8)-undefined
参考
MISRA C 2012 19.1
MISRA C++ 2008 0-2-1