我制作了一个在strcasecmp
上签名的小程序,在我做这个测试用例之前不知道为什么:
strcasecmp(NULL, "TEST");
在编译时,我收到以下警告:
test.c:9:4: warning: null argument where non-null required (argument 1) [-Wnonnull]
然而,man strcasecmp
没有提及任何有关NULL
论点的内容,有人可以解释一下我如何从阅读文档中理论上推断出这一点,而不是凭经验编写测试用例吗?这是一个根深蒂固的标准吗?或者const char *
可能无法成为NULL
,由于某些原因我不知道?
答案 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");