SCSI tape data loss

Kern Sibbald kern at sibbald.com
Tue Jun 3 13:05:35 PDT 2003


I cannot argue with what you write other than to
say that I generally use uint32_t for variables that
are positive integers, so I have them everywhere and
to change wlen to signed would lead to a flood of
changes of other variables. If I remember right one
thing that pushed me in this direction is the fact
that sizeof() is unsigned.

By the way, I've just completed a much simpler test
that I ask Dan to try to see if we can reproduce the
problem in a simpler case.

Best regards,

Kern

On Tue, 2003-06-03 at 21:13, Justin T. Gibbs wrote:
> >> > By the way, the funny casting is mandatory in C++,
> >> > because ssize_t as returned by the write is not the 
> >> > same as size_t (what is written).
> > 
> > If I remove the (uint32_t) cast, I get an error message:
> > 
> > c++   -c   -I. -I..  -g -O2 -Wall  block.c
> > block.c: In function `int write_block_to_dev (JCR *, DEVICE *, 
> > DEV_BLOCK *)':
> > block.c:381: warning: comparison between signed and unsigned integer 
> > expressions
> > 
> > Line 381 reads:
> > 
> >    if ((stat=write(dev->fd, block->buf, (size_t)wlen)) != wlen) {
> > 
> > so I will stick with my funny casting.
> > 
> 
> This has nothing to do with type size or the fact that you are
> using C++.  The same warning would occur when your code is
> compiled as C.  wlen should be a signed type.  Since wlen
> by definition cannot be larger than the largest positive integer
> reportable by the signed return value of write, using an unsigned
> type buys you nothing.  Conversion from ssize_t to size_t will
> occur without error if you happen to chose to make wlen an ssize_t.
> 
> I guess it matters little.  My own philosophy is that casts should
> be used as a last resort rather than deployed indiscriminantly to
> cover up compile warnings.  The above casts are easily avoidable
> which is why I mentioned them at all.
> 
> --
> Justin



More information about the freebsd-scsi mailing list