4

我做了一个 sigsegved on 的小程序,strcasecmp直到我做了这个测试用例才知道为什么:

strcasecmp(NULL, "TEST"); 

编译时,它给了我以下警告:

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

但是,man strcasecmp没有说任何关于NULL论点的事情,有人可以解释一下我如何从阅读文档中从理论上推断出这一点,而不是根据经验编写测试用例吗?它是一个根深蒂固的标准吗?或者也许const char *没有权利NULL,出于某种我不知道的原因?

4

3 回答 3

5

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

它是未定义的行为。为什么?

除非在随后的详细描述中另有明确说明,否则以下每个语句都适用: 如果函数的参数具有无效值(例如函数域之外的值,或程序地址空间之外的指针,或空指针,或指向不可修改存储的指针(当相应参数不是 const 限定时)或具有可变数量参数的函数不期望的类型(提升后),行为未定义。

(C 标准,7.1.4)

由于 strcasecmp 从未提及 NULL,因此它在函数的域之外。因此,该功能可以随心所欲。包括崩溃。

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

于 2013-08-21T08:58:57.107 回答
0

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

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

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

于 2013-08-21T08:49:30.693 回答
0

我认为这是假设您对后果有一个粗略的了解。NULL如果您尝试使用非参数,您将有类似的体验:

strcasecmp((const char *)1, "A string");
于 2013-08-21T08:51:35.093 回答