Mar*_*ian 19 c language-lawyer strncmp
strncmp如果第三个参数为零,将NULL指针作为参数放入是否安全?即调用如:
strncmp(NULL, "foo", 0);
Run Code Online (Sandbox Code Playgroud)
Sou*_*osh 32
这是未定义的行为.
C标准表示通常不应该将无效指针传递给库函数.
引用C11,章节§7.24.1,"字符串函数约定",(强调我的)
声明为的参数
size_t n指定函数数组的长度,在n调用该函数时可以为零.除非在本子条款中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述.在这样的调用中,定位字符的函数不会发生,比较两个字符序列的函数返回零,复制字符的函数复制零个字符.
我在7.24.4.4 strncmp()函数中没有看到任何具体提及(作为上述约束的例外).
要为"无效指针"添加上下文,请引用§7.1.4/ p1,使用库函数
[...]如果函数的参数具有无效值(例如函数域外的值,或程序地址空间外的指针,或空指针,或指向不可修改的指针)当相应参数不是const限定的存储时)或具有可变数量参数的函数不期望的类型(在提升之后),行为是未定义的.[...]
并且NULL,引用§7.19,<stddef.h>
NULL
它扩展为实现定义的空指针常量; [...]
从cppreference.com上的C strncmp文档:
当其中一个
lhs或是rhs空指针时,行为是未定义的.
只需阅读文档即可.