strcasecmp空参数;strcasecmp手册

4

我写了一个小程序,其中在strcasecmp处出现了sigsegv错误,一直不知道原因,直到我创建了这个测试用例:

strcasecmp(NULL, "TEST"); 

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

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

然而,man strcasecmp并没有提到关于NULL参数的任何内容,请问有人可以解释一下我如何从理论上阅读文档来推断这一点,而不是通过经验性编写测试用例吗?这是一个更深层次的标准吗?或者const char *因某种原因没有权利成为NULL

3个回答

5
目前还没有人解释为什么会出现这种情况。
这是一种未定义的行为。为什么呢?
以下每个语句都适用,除非在详细描述中显式说明:如果函数的参数具有无效值(例如超出函数域的值、指向程序地址空间外部的指针、空指针或指向不可修改存储器的指针对应的形参不是const限定符)或函数变量参数类型(晋升后)与所期望的不同,则行为是未定义的。
(C标准, 7.1.4)
因为strcasecmp从未提到NULL,所以它不在该函数的域内。因此该函数可以自由地随意操作,包括崩溃。
(注:本文引用了这篇相关答案:https://dev59.com/mWjWa4cB1Zd3GeqPve5l#12621203)

0

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

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

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


我在我的测试用例中找到了它。然而,我的问题更多的是“为什么它需要非空字符串,因为文档上没有提到?”谢谢。 - pouzzler
您不能访问空内存地址,很明显两个地址都不应该为空。应该有一些编译器属性明确或隐含地说明这两个参数都不可能为空。 - bkausbk

0

我认为你已经大致了解后果。如果你尝试使用非NULL参数,你将会有类似的经历:

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

1
除非函数接受 null,否则这个指针几乎总是未定义的。这是一个非空的无效指针。 - Medinoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接