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
(5) warning: variable may be used before set: ptr1
]
regards,
Fedor.