[GRASS-dev] Re: About the vector changes
Glynn Clements
glynn at gclements.plus.com
Sat Aug 8 20:06:01 EDT 2009
Markus Metz wrote:
> >>> Ah, ok, you use the grass57 dataset. I have now changed the version
> >>> number and compatibility info, you should now get reasonable
> >>> warnings/errors with the spearfish57 dataset.
> >>>
> >> Okay, I'll check it.
> >>
> >
> > Nope. As of r38644, the error message is unchanged.
>
> I got the order of the checks wrong. First check must be version check,
> only after that comes the check for file size. That LFS check is there
> to check if sizeof(off_t) = 8 is needed to read the sidx file. Fixed in
> r36845.
Yep; it now says:
ERROR: Spatial index format version 5.0 is not supported by this release.
Please rebuild topology.
However, as a result of the LFS changes, the code has some type
mismatches on 32-bit systems with LFS enabled.
Most of these are due to passing off_t's to G_debug() with %ld as the
format (it needs to be %lld for a 64-bit off_t on a 32-bit platform;
we really need a macro for this). There's also one G_fatal_error()
call which has "%d".
These shouldn't actually cause any problems beyond reporting bogus
offsets in debug/error messages. On little-endian platforms, the
offset will be truncated to 32 bits (so it has no effect for offsets
<2GiB). It's more of an issue on big-endian platforms, as you get the
high word, so offsets will be divided by 4GiB (i.e.they'll normally be
zero).
In lib/vector/diglib/port_init.c,
#define OFF_T_TEST 0x0102030405060708
should have an LL suffix (it's too large for an "int"), and this
should ideally be conditionalised (although I don't know if we have a
macro for "off_t is 64-bits"; _FILE_OFFSET_BITS may not be defined on
64-bit platforms, and you can't use sizeof in #if tests). I believe
that the compiler is free to truncate the above to an int, regardless
of what it's assigned to. If that happens, the vector code will fail
entirely.
Finally:
spindex_rw.c:657: warning: cast from pointer to integer of different size
spindex_rw.c:715: warning: cast to pointer from integer of different size
spindex_rw.c:746: warning: cast to pointer from integer of different size
The first one is less of an issue; a platform with 64-bit pointers
will probably have a 64-bit off_t. The converse isn't true; on a
32-bit system with LFS, storing a 64-bit off_t in a 32-bit pointer
isn't going to work.
The lines in question are:
656: if (s[top].sn->level == 0) /* leaf node */
657: s[top].pos[j] = (off_t) s[top].sn->branch[j].child;
714: s[top].sn.branch[j].child =
715: (struct Node *)s[top].childpos[j];
745: s[top].sn.branch[j].child =
746: (struct Node *)s[top].childpos[j];
ISTR that it should only cast childpos[j] to a pointer if that is what
was stored there in the first place. But I would strongly suggest
using a union rather than casting; we shouldn't expect people to
simply ignore compiler warnings, and it's unreasonable to expect
anyone to analyse the code to the extent that they can determine that
the warnings are harmless.
--
Glynn Clements <glynn at gclements.plus.com>
More information about the grass-dev
mailing list