delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

25 Dec 2006

龌龊的dirname(3)定义

在POSIX中提到,这个API不仅可以修改输入参数,而且可以返回一个静态存储的指针,说白了,你不能指望某个平台上它是线程安全的,也不能指望它不会修改你发给它的数据……


Archived: 3 Comments

antijp | December 25, 2006 8:57 AM

果然是相当的龌龊,FreeBSD上面给的是const char *做参数,而其他的平台居然是char *,这样直接给字符串常量有可能就崩了……

不过,是不是返回值也加上const比较好?防止某些粗心大意的人直接就改了返回值?

Xin LI | December 25, 2006 9:58 AM

不,不好。

POSIX规定的原型是char * dirname(char *),参数改为const char *并不会break现有的程序,但返回值改为const char *就会把现有的代码break掉了,考虑下列代码:

char *mydir;
char *filename = strdup("/usr/local/foo");

dir = dirname(filename);

上述代码完全符合POSIX,并且,对于参数为const char *的dirname(3),它仍然可以使用(增加限制无需修改);但如果返回值为const char *,则dir =这一步相当于放松限制,因此会出问题。

antijp | December 25, 2006 12:12 PM

哦,对,兼容性是个问题,一开始我没考虑到。

看来这个地方需要特别当心,不要一不小心把dirname的buf写掉了。