看板 FB_hackers 關於我們 聯絡資訊
On Wed, 23 Apr 2008, Garrett Cooper wrote: >> But strdup uses malloc, which is a system call (from the strdup manual: If >> insufficient memory is available, NULL is returned and errno is set to >> ENOMEM.) FYI, malloc(3) is actually a library call, and while it obviously does invoke system calls (mmap(2) on modern systems), it has some fairly complex logic for managing and caching memory provided by the kernel. > I was more concerned about the fact that there wasn't any documentation that > said something -- either implicitly or explicitly -- that strdup(NULL) > causes a segfault. > > Of course I did some more research after you guys gave me some replies and > realized I'm not the first person to bumble across this fact, but I haven't > found FreeBSD or Linux documentation supporting that errata. It was harmless > in my tiny program, but I would hate to be someone adding that assumption to > a larger project with multiple threads and a fair number of lines... Consider the following counter-arguments: - In C, a string is a sequence of non-nul characters followed by a nul character terminating the string. NULL is therefore not a valid string. - Currently, strdup(3) has an unambiguous error model: if it returns a non-NULL string has succeeded, and if it has failed, it returns NULL and sets errno. If NULL becomes a successful return from strdup(3), then this is no longer the case, breaking the assumptions of currently correct consumers. Robert N M Watson Computer Laboratory University of Cambridge _______________________________________________ freebsd-hackers@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"