Date: Wed, 11 Jul 2007 12:22:17 +1000 From: Peter Jeremy <peterjeremy@optushome.com.au> To: Andrey Chernov <ache@nagual.pp.ru>, freebsd-current@freebsd.org Subject: Re: HEADS UP: getenv() and family API change Message-ID: <20070711022217.GA19840@turion.vk2pj.dyndns.org> In-Reply-To: <20070710224619.GA31654@nagual.pp.ru> References: <20070703182400.Q1449@baba.farley.org> <Xuu8UV3Bay@dmeyer.dinoex.sub.org> <20070709145418.T52164@thor.farley.org> <20070710154148.GA22873@nagual.pp.ru> <20070710213602.GX3434@turion.vk2pj.dyndns.org> <20070710224619.GA31654@nagual.pp.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
--jRHKVT23PllUwdXP
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
On 2007-Jul-11 02:46:19 +0400, Andrey Chernov <ache@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@nagual.pp.ru> wrote:
>> >To say strictly, copying somewhere is not neccessary since this way wor=
ks=20
>> >too:
>> >
>> >static char *s =3D "PATH=3D/bin";
>> >
>> >putenv(s);
>>=20
>> 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.
>>=20
>> Wouldn't the following be clearer (s is forced to be writable):
>>=20
>> static char s[] =3D "PATH=3D/bin";
>>=20
>> putenv(s);
>
>This two are the same, since there is no "const", so compiler can't put=20
>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 =3D "PATH=3D/bin";
static char *t =3D "PATH=3D/bin";
static char u[] =3D "PATH=3D/bin";
if (s =3D=3D t)
printf("s & t are common\n");
s =3D "PATH=3D/sbin";
printf("%s\n", s);
u[4] =3D ':';
printf("u=3D\"%s\"\n", u);
t[4] =3D ':';
printf("t=3D\"%s\"\n", t);
s[4] =3D ':';
printf("s=3D\"%s\"\n", s);
return 0;
}
----8<------
gives the following results (-current shown, 6-stable is the same):
cc -O2 -fno-strict-aliasing -pipe -march=3Dathlon-xp x.c -o x
server% ./x
s & t are common
PATH=3D/sbin
u=3D"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%=20
--=20
Peter Jeremy
--jRHKVT23PllUwdXP
Content-Type: application/pgp-signature
Content-Disposition: inline
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (FreeBSD)
iD8DBQFGlD7Z/opHv/APuIcRAoo/AJ93bYmcX1mkNEkrRnwiRWydKzSnRQCcDT5A
tXQa5LhMIo/kKrjAGsDD5Rg=
=4D42
-----END PGP SIGNATURE-----
--jRHKVT23PllUwdXP--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070711022217.GA19840>
