gpt4 book ai didi

c - gethostname 的主机名数组是否应该声明为 MAXHOSTNAMELEN+1?

转载 作者:行者123 更新时间:2023-11-30 15:04:37 25 4
gpt4 key购买 nike

我正在修复对 gethostname() 的调用,其中旧代码将 hostName 数组声明为 10 个字符,导致边界错误,因为主机名大于该值。我的修复方法是使用 MAXHOSTNAMELEN 声明 hostName(我的平台的 parm.h 声明为 64)。另一位程序员现在表示,该数组需要声明为 hostName[MAXHOSTNAMELEN+1]清除,因为(来自他的电子邮件):

This is from the man page: POSIX.1-2001 guarantees that "Host names (not including the terminating null byte) are limited to HOST_NAME_MAX bytes”

So to handle all situations, you must add one to the buffer size and initialize the buffer with null characters.

现在,我在网上看到的每个示例都在执行 char hostName[MAXHOSTNAMELEN] ,并且由于该调用要么有效,要么无效,所以对我来说将 归零是没有意义的hostName 数组或将其初始化为 null,因为如果它有效,则该数组将设置为主机名,如果无效,则调用将返回错误。

声明或初始化 gethostname() 参数的可靠方法是什么?

最佳答案

POSIX spec说:

The returned name shall be null-terminated, except that if namelen is an insufficient length to hold the host name, then the returned name shall be truncated and it is unspecified whether the returned name is null-terminated.

Host names are limited to {HOST_NAME_MAX} bytes.

在您的系统上,我假设 MAXHOSTNAMELEN 对应于规范所称的 HOST_NAME_MAX。因此,将缓冲区设置为 MAXHOSTNAMELEN+1 字节并将该大小传递给 gethostname() 应该可以保证您不必进行零初始化.

如果您没有进行零初始化,并且您没有额外的 +1 字节,您可能会遇到失败,因为它“未指定是否当缓冲区不够长时,返回的名称以 null 结尾。

也就是说,如果您的平台不严格符合标准,则零填充可能有用或必要。告诉你这样做的程序员有一个理由——这个理由是特定于你的平台的一个怪癖吗?

编辑 spec还说 nameLen 参数是“name 参数指向的数组的大小”。由于它是数组的大小,而不是要存储在该数组中的主机名的大小,因此在数组中为\0 终止符是一个很好的做法。从历史上看,大多数域名标签都不是 64 字节,因此没有 +1 的代码在过去可能工作得很好。不过,使用 +1 更安全,而不必假设或猜测。

编辑2 我认为“长度不足以容纳主机名”可以说是不明确的。但是,规范并不打算让 gethostname() 注销所提供数组的末尾。因此,我将“长度不足以容纳主机名”表示“长度不足以容纳主机名加上空终止符字节。”这是我个人的解释,但与我的经验一致.

关于c - gethostname 的主机名数组是否应该声明为 MAXHOSTNAMELEN+1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40218878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com