strlen能否被标记为[[unsequenced]]?基于C23标准条款的疑问
关于C23中
[[unsequenced]]函数的independent特性疑问 我对C23工作草案中关于unsequenced函数的表述存在疑问。unsequenced函数需具备independent特性,相关条款如下:
(6) 函数调用观测对象X的条件为:
- (6.1) 两者同步;
- (6.2) X非调用的局部对象;
- (6.3) X的生存期始于函数调用之前;
- (6.4) 调用期间对X的访问被排序;
调用前存储的X的最后值(若存在)被称为该调用观测到的X的值。
函数指针值f是independent的条件为:
- (6.5) 若某对象X被通过非基于调用参数的左值的f调用观测到,则同一程序执行中所有f调用对X的访问均观测到相同值;
- (6.6) 否则,若访问基于指针参数,则需存在唯一的此类指针参数P,使得对X的所有访问均针对基于P的左值。
若派生的函数指针值是independent的,则函数定义是independent的。
注:上述内容来自N3096 §6.7.12.7 p6,为便于阅读重新排版
我的问题是,像strlen这类函数是否满足independent特性?以下是strlen的极简实现:
size_t strlen(const char* s) { size_t len = 0; for (; *s; ++s) { ++len; } return len; }
首先,*s是否属于基于参数的访问?我认为是的,它基于指针参数,因此仅需考虑(6.6)的限制。
但(6.6)可能存在问题:(6.5)表述为“所有对X的访问均在f的调用中”,而(6.6)表述为“所有对X的访问”,范围更广,可能涵盖函数外部的访问。以下场景会引发问题:
struct string { char data[N]; } str; // ... strlen(str.data); // A str = ...; strlen(str.data); // B
并非所有对str的全局访问都通过strlen的唯一指针参数s进行,例如str = ...甚至不涉及指针。若我的理解正确,strlen将不满足independent特性,进而无法被标记为unsequenced。
综上,我的解读是否正确?strlen能否被标记为[[unsequenced]]?这是否只是措辞问题,而标准本意是允许它被标记?
关于标准意图的说明
[[unsequenced]]的提案指出,与GCC的[[gnu::const]]不同,它支持指针参数。但我不确定当前措辞是否体现了这一点,以及体现的程度如何。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

