禁用 restrict 指针
6.2.9 ID_forbidRestrictPtr
restrict 指针要求其他指针不能指向与之相同的区域,否则会导致标准未定义的行为,这种特性有助于编译器优化代码,但也增加了误用风险。restrict 指针由 C99 标准提出,不在 C++ 标准之内,在 C++ 代码中不应使用。
应在效率和风险之间合理取舍,不建议在有高可靠性要求的代码中使用这种特性。
示例:
void foo(int* restrict a, int* restrict b) // Non-compliant
{
*a += *b;
*a *= *b;
}
例中指针 a 和 b 由 restrict 关键字限定,表示指向不同的对象,由于未通过 b 写入数据,在优化时可以认为 b 指向的对象不变,可将相关对象存入寄存器等高速存储器,不必每次都从内存中读取。
但如果 a 和 b 指向同一对象会导致未定义的行为,如:
int main(void)
{
int i = 8;
foo(&i, &i); // Undefined behavior
printf("%d", i);
}
这段代码在启用优化时和关闭优化时可能会有不同的输出。
依据
ISO/IEC 9899:1999 6.7.3.1(4 9 11)-undefined
ISO/IEC 9899:2011 6.7.3.1(4 9 11)-undefined
参考
MISRA C 2012 8.14
SEI CERT EXP43-C