strncmp(NULL," foo",0)是否定义良好?

时间:2016-06-23 14:04:32

标签: c language-lawyer strncmp

如果第三个参数为零,将NULL指针作为strncmp的参数是否安全?即像:

这样的调用
strncmp(NULL, "foo", 0);

2 个答案:

答案 0 :(得分:32)

这是undefined behavior

C标准说,一般来说,你不应该将无效的指针传递给库函数。

引用C11,章节§7.24.1,“字符串函数约定”,(强调我的

  

声明为size_t n的参数指定a的数组长度   函数n在调用该函数时可以为零。 除非明确说明   否则在本子条款中的特定函数的描述中,指针参数   在这样的呼叫中仍然应具有有效值,如 7.1.4 中所述。在这样的电话中,a   找到一个字符的函数找不到,一个比较两个的函数   字符序列返回零,复制字符的函数复制零   字符。

我在7.24.4.4,strncmp()函数中没有看到任何具体提及(作为上述约束的例外)。

为“无效指针”添加上下文,引用§7.1.4/ p1,使用库函数

  

[...]如果函数的参数具有无效值(例如值)   在函数域之外,或者程序地址空间之外的指针,   或空指针,或指向不可修改的存储时的对应   参数不是const限定的)或函数不期望的类型(提升后)   如果参数数量可变,则行为未定义。 [...]

关于NULL,引用§7.19,<stddef.h>

  

NULL
  它扩展为实现定义的空指针常量; [...]

答案 1 :(得分:7)

来自the C strncmp documentation at cppreference.com

  

lhsrhs为空指针时,行为未定义。

只需阅读文档。