这段代码是否安全:
strerror_r(errcode,buffer,length);
printf("Error: %s",buffer);
也就是说,如果缓冲区很小,我可以信任缓冲区为空终止吗?从手册页:
符合XSI标准的strerror_r()是便携式应用程序的首选。它返回用户提供的长度为buflen的缓冲区buf中的错误字符串。
GNU特定的 strerror_r()返回指向包含错误消息的字符串的指针。这可以是指向函数存储在buf中的字符串的指针,也可以是指向某个(不可变的)静态字符串的指针(在这种情况下,buf未使用)。如果函数在buf中存储一个字符串,则最多存储buflen字节(如果buflen太小且errnum未知,则字符串可能被截断)。 字符串始终包含终止空字节(' \ 0')。
我是对的,如果我使用符合XSI的版本,可能会发生 buffer 未终止。
答案 0 :(得分:1)
如果您正在使用POSIX strerror_r
并且它返回非零,我不确定您是否可以假设任何内容都在buffer
中。您可以检查man 3p strerror
是否有POSIX功能描述,但它没有说明如果buffer
不够大,length
会发生什么。
也许POSIX标准的其他部分说明在这种情况下会发生什么,但我怀疑它没有指定。我会检查strerror_r
的返回值,如果它不为零则不使用buffer
,只是为了安全。
在我尝试过的两个系统上,编译器将错误消息复制到缓冲区并用NUL字节截断它。在RHEL 5.4上,strerror_r
如果其大小太小,则不会修改buffer
。在这种情况下,buffer
可以是任何内容,如果您在加注sterror_r
之前未对其进行初始化。
答案 1 :(得分:0)
Here is the changelog for xpg-strerror.c:
2011-05-21 Ulrich Drepper Always fill output buffer in XPG strerror function blob | commitdiff | diff to current
2010-12-25 Ulrich Drepper Change XPG-compliant strerror_r function to return... blob | commitdiff | diff to current
因此,如果我假设一个体面的glibc版本,一切似乎都没问题。除非有人改变了改变。