Fedor Sergeev wrote: > On Fri, Apr 24, 2009 at 08:43:55PM +0200, Roland Mainz wrote: > > Chris Quenelle wrote: > > > Roland Mainz wrote: > > > > Does Sun Studio 12 have a warning for statements like... > > > > -- snip -- > > > > int pd; > > > > char *ptr1, > > > > *ptr2; > > > > /* ... */ > > > > pd = ptr2-ptr1; > > > > -- snip -- > > > > ... on 64bit targets ? > > > > > > > > I've spend today some hours to dig-out this kind of bug where a pointer > > > > difference (32bit on 32bit SPARC and 64bit on 64bit SPARC, e.g. a > > > > |ptrdiff_t|) is stored in an |int| (32bit integer) the loss of bits > > > > trigged a malfunction... > > > > ... somehow I was wondering why Sun Studio didn't warn about this. > > > > > > There's a chapter in the C user's guide about porting programs > > > from 32-bits to 64-bits. It mentions a lint flag > > > > > > -errchk=longptr64 flag checks assignments of pointer > > > expressions and long integer expressions to plain > > > integers, even when explicit casts are used. > > > > > > http://docs.sun.com/app/docs/doc/819-5265/bjami?a=view > > > > After some hacking with "lint vs. libshell" it seems that "lint" doesn't > > complain about the issue even when -errchk=%all is enabled... ;-( > > That does not agree with my experience: > > ] cat ptrdiff.c > int pd; > char *ptr1, > *ptr2; > pd = ptr2-ptr1; > > return pd; > } > ] lint -V ptrdiff.c -errchk=%all -c > lint: Sun C 5.9 SunOS_i386 Patch 124868-08 2008/11/25 > lint: Sun C 5.9 SunOS_i386 Patch 124868-08 2008/11/25 > (5) warning: assignment of 64-bit integer to 32-bit integer > (5) warning: variable may be used before set: ptr2 > (5) warning: possible ptrdiff_t overflow
What is the name of the "error tag" for this warning ? > (5) warning: variable may be used before set: ptr1 > ] Can you go to usr/src/lib/libshell/amd64/ and run $ make lintcheck # there, please ? I don't get this warning there but there are several statements (e.g. http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libshell/common/bltins/read.c#359 - "m = (end - var) + (c - (end - cur));") which are currently causing problems with string data >= 2GB because the calculations use |int| instead of |ptrdiff_t| (this is going to be fixed with the next ksh93-integration update but I'd like to be sure that we caught all incarnations of this kind of bug). "lint" and "cc" versions are: -- snip -- $ cc -V cc: Sun C 5.9 SunOS_i386 Patch 124868-07 2008/10/07 usage: cc [ options] files. Use 'cc -flags' for details $ lint -V lint: Sun C 5.9 SunOS_i386 Patch 124868-07 2008/10/07 usage: lint [ options] files. Use 'lint -flags' for details -- snip -- ---- Bye, Roland -- __ . . __ (o.\ \/ /.o) roland.mainz at nrubsig.org \__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer /O /==\ O\ TEL +49 641 3992797 (;O/ \/ \O;)