At Tue, 25 Nov 2003 23:45:48 +1100, Ken Foskey wrote: > I am getting this error: > > process.c:1018: warning: passing arg 1 of `putenv' discards qualifiers > from pointer target type > > It turns out that I am sending a "const" string to putenv which is > defined: > > ./stdlib.h:extern int putenv (char *__string) __THROW; > > This discards the "constness" of the string. > > Then I find this: > > http://sources.redhat.com/ml/libc-hacker/1999-08/msg00008.html > > which implies that it was const ages ago. > > Should I raise this as a bug?
quoting from putenv(3) (from manpages-dev.deb 1.60-3): NOTES The putenv() function is not required to be reentrant, and the one in libc4, libc5 and glibc2.0 is not, but the glibc2.1 version is. Description for libc4, libc5, glibc: If the argument string is of the form name, and does not contain an `=' character, then the variable name is removed from the environment. If putenv() has to allocate a new array environ, and the previous array was also allocated by putenv(), then it will be freed. In no case will the old storage asso- ciated to the environment variable itself be freed. The libc4 and libc5 and glibc 2.1.2 versions conform to SUSv2: the pointer string given to putenv() is used. In particular, this string becomes part of the environment; changing it later will change the environment. (Thus, it is an error is to call putenv() with an auto- matic variable as the argument, then return from the calling function while string is still part of the environment.) However, glibc 2.0-2.1.1 differs: a copy of the string is used. On the one hand this causes a memory leak, and on the other hand it violates SUSv2. This has been fixed in glibc2.1.2. The BSD4.4 version, like glibc 2.0, uses a copy. SUSv2 removes the `const' from the prototype, and so does glibc 2.1.3. -- - Gus -- SLUG - Sydney Linux User's Group - http://slug.org.au/ More Info: http://lists.slug.org.au/listinfo/slug