strdup 在传递 NULL 时转储核心

问题描述 投票:0回答:4

strdup(null) 转储核心。

在 ubuntu 和 freeBSD 上都尝试过。

为什么?不是应该返回 null 吗?

char *b = NULL;
a = strdup(b);

这将在 strdup 调用上转储核心。

c linux compiler-construction posix freebsd
4个回答
26
投票

那还可以。

文档暗示其参数必须是字符串。如果是其他东西,例如空指针,那么任何人都可以猜测会发生什么。本质上,当将 NULL

 指针传递给 
strdup
 时,您会得到未定义的行为。

如果您向函数传递了不应该传递的内容,则函数产生未定义的行为是很正常的。许多标准 C 函数(例如

strcpy

strlen
)也不接受空指针。


7
投票

strdup

 如果分配失败,则返回 NULL。

这不是分配失败。 传入野指针时的行为是未定义的。 您需要传递一个指向以 NUL 结尾的字符串的有效指针。


2
投票
我认为这是

预期的行为


2
投票
当然,所有答案都是正确的。尽管如此,在 strdup() 的情况下,如果它也能够处理空指针那就太好了——在这种情况下,也只返回一个“空”字符串。当然,很容易定义一个 strdupnullok() 函数,并将该行为作为 strdup() 的包装器,但它是一个额外的包装器和函数调用,因此会使代码稍微慢一点。

© www.soinside.com 2019 - 2024. All rights reserved.