strerror_r缓冲区始终为null终止

时间:2014-12-31 12:38:04

标签: c posix glibc

这段代码是否安全:

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 未终止。

2 个答案:

答案 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版本,一切似乎都没问题。除非有人改变了改变。