`T *restrict`无别名保证何时生效?未使用的restrict指针是否为UB?
关于
restrict指针的未定义行为与NULL值问题 核心结论
- 未使用的
restrict指针(哪怕存在理论上的别名)不会触发未定义行为(UB),因为restrict的约束仅在通过该指针访问其指向的对象时才生效。 - 你给出的示例代码完全合法,不属于UB。
T *restrict指针可以是NULL,不存在“几乎不会为NULL”的说法。
详细解释
C标准对restrict的定义核心是:如果一个指针被restrict修饰,那么在它的有效作用域内,所有通过该指针对对象的访问,都不能有其他可修改的指针同时访问同一个对象。换句话说,restrict是对“指针访问行为”的约束,不是对“指针存在本身”的约束。
如果一个restrict指针从声明到销毁都没有被用来访问任何对象(比如示例里的also_nothing),那restrict的约束条件根本没被触发,自然不会产生UB——哪怕它和另一个指针指向同一块内存(或者都是NULL),只要没去访问,就不会违反规则。
针对你给出的代码:
int *nothing = NULL; int *restrict also_nothing = NULL;
这两个指针都未被使用,不管有没有restrict修饰,都是完全合法的,不存在任何未定义行为。
至于restrict指针是否可以为NULL:当然可以。restrict只是约束指针访问对象时的别名情况,和指针本身的取值(是否为NULL)没有直接关联。比如你可以写这样的代码:
void func(int *restrict ptr) { if (ptr != NULL) { *ptr = 10; // 这里只要没有其他可修改指针访问同一对象,就符合restrict规则 } }
调用func(NULL)完全合法,只要函数内部不对NULL指针进行解引用即可——而NULL指针解引用的UB是独立于restrict的规则的,和restrict本身无关。
内容的提问来源于stack exchange,提问作者doliphin
相关产品推荐
相关产品推荐

