☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

禁用 restrict 指针

6.2.9 ID_forbidRestrictPtr
目录 › next › previous

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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.