避免指针运算的结果溢出
14.5 ID_arrayIndexOverflow
指针运算的结果溢出会导致标准未定义的行为。
设数组元素个数为 N,p 为指向数组第一个元素的指针,i 为整数,标准规定:
- 当 i >= 0 且 i < N 时,p + i 的结果不会溢出
- 当 i 等于 N 时,p + i 的结果不会溢出,但不可对其解引用
- 当 i < 0 或 i > N 时,p + i 的结果可能会溢出
- 使数组下标超出 [0, N] 的运算可能会使指针值溢出,导致未定义的行为
示例:
int a[10];
int *p, *e;
p = a + 0; // Compliant
p = a + 5; // Compliant
e = a + 10; // Compliant, won't overflow
p = a - 1; // Non-compliant, the array subscript is -1, which exceeds [0, N]
e = a + 11; // Non-compliant, the array subscript is 11, which exceeds [0, N]
--p; // Non-compliant, may overflow
e++; // Non-compliant, may overflow
相关
依据
ISO/IEC 9899:1999 6.5.6(8)-undefined
ISO/IEC 9899:2011 6.5.6(8)-undefined
ISO/IEC 14882:2003 5.7(5)-undefined
ISO/IEC 14882:2011 5.7(5)-undefined
参考
MISRA C 2004 17.1
MISRA C 2012 18.1
MISRA C++ 2008 5-0-16
SEI CERT ARR30-C