You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:36:03