HEADS UP: getenv() and family API change
Peter Jeremy
peterjeremy at optushome.com.au
Wed Jul 11 02:22:19 UTC 2007
On 2007-Jul-11 02:46:19 +0400, Andrey Chernov <ache at nagual.pp.ru> wrote:
>On Wed, Jul 11, 2007 at 07:36:02AM +1000, Peter Jeremy wrote:
>> On 2007-Jul-10 19:41:48 +0400, Andrey Chernov <ache at nagual.pp.ru> wrote:
>> >To say strictly, copying somewhere is not neccessary since this way works
>> >too:
>> >
>> >static char *s = "PATH=/bin";
>> >
>> >putenv(s);
>>
>> I thought the C compiler was still free to place the string into RO
>> memory and/or coalesce it with other strings in that case.
>>
>> Wouldn't the following be clearer (s is forced to be writable):
>>
>> static char s[] = "PATH=/bin";
>>
>> putenv(s);
>
>This two are the same, since there is no "const", so compiler can't put
>static char *s
>into RO memory.
Maybe that's the theory but neither gcc 4.2.0 (as in -current) or
gcc 3.4.6 (as in 6-stable) work that way. The following program
shows that both 's' and 't' are initialised to point to the same
read-only string.
----8<------
#include <stdio.h>
int main () {
static char *s = "PATH=/bin";
static char *t = "PATH=/bin";
static char u[] = "PATH=/bin";
if (s == t)
printf("s & t are common\n");
s = "PATH=/sbin";
printf("%s\n", s);
u[4] = ':';
printf("u=\"%s\"\n", u);
t[4] = ':';
printf("t=\"%s\"\n", t);
s[4] = ':';
printf("s=\"%s\"\n", s);
return 0;
}
----8<------
gives the following results (-current shown, 6-stable is the same):
cc -O2 -fno-strict-aliasing -pipe -march=athlon-xp x.c -o x
server% ./x
s & t are common
PATH=/sbin
u="PATH:/bin"
zsh: segmentation fault (core dumped) ./x
server% gcc -v
Using built-in specs.
Target: i386-undermydesk-freebsd
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 4.2.0 20070514 [FreeBSD]
server%
--
Peter Jeremy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-current/attachments/20070711/0c01c646/attachment.pgp
More information about the freebsd-current
mailing list