strcasecmp NULL参数;男人strcasecmp

时间:2013-08-21 08:45:06

标签: c string

我制作了一个在strcasecmp上签名的小程序,在我做这个测试用例之前不知道为什么:

strcasecmp(NULL, "TEST"); 

在编译时,我收到以下警告:

test.c:9:4: warning: null argument where non-null required (argument 1) [-Wnonnull]

然而,man strcasecmp没有提及任何有关NULL论点的内容,有人可以解释一下我如何从阅读文档中理论上推断出这一点,而不是凭经验编写测试用例吗?这是一个根深蒂固的标准吗?或者const char *可能无法成为NULL,由于某些原因我不知道?

3 个答案:

答案 0 :(得分:3)

没有人真正解释过为什么会这样。

未定义的行为。为什么呢?

  

除非另有明确说明,否则以下各项陈述均适用   在下面的详细描述中:如果函数的参数有一个   无效值(例如函数域外的值,或a   指针在程序的地址空间之外,或者是空指针,或者是   指向不可修改的存储,当相应的参数不是时   const-qualified)或函数不期望的类型(促销后)   可变数量的参数,行为未定义。

(C标准,7.1.4)

由于strcasecmp从未提及NULL,因此它位于函数的域之外。因此,该功能可随意使用。包括崩溃。

(注意:我的来源是这个相关答案:https://stackoverflow.com/a/12621203/1180785

答案 1 :(得分:0)

字符串比较strcasecmp需要2个参数,都带有非空字符串。由于两者都是指针,因此NULL也是有效的。但是strcasecmp可以被定义为:

int strcasecmp(const char *s1, const char *s2) __attribute__((nonnull));

如果至少有一个参数为NULL,则此属性将产生警告。

答案 2 :(得分:0)

我认为你会对结果有一个粗略的了解。如果您尝试使用非NULL参数,那么您将获得类似的体验:

strcasecmp((const char *)1, "A string");