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>