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;)

Reply via email to