sha1_file.c: avoid gcc signed overflow warnings

With the recent gcc, we get:

sha1_file.c: In check_packed_git_:
sha1_file.c:527: warning: assuming signed overflow does not
occur when assuming that (X + c) < X is always false
sha1_file.c:527: warning: assuming signed overflow does not
occur when assuming that (X + c) < X is always false

for a piece of code that tries to make sure that off_t is large
enough to hold more than 2^32 offset.  The test tried to make
sure these do not wrap-around:

    /* make sure we can deal with large pack offsets */
    off_t x = 0x7fffffffUL, y = 0xffffffffUL;
    if (x > (x + 1) || y > (y + 1)) {

but gcc assumes it can do whatever optimization it wants for a
signed overflow (undefined behaviour) and warns about this
construct.

Follow Linus's suggestion to check sizeof(off_t) instead to work
around the problem.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2007-10-29 11:53:55 -07:00
parent 399f0a8eed
commit 7109c889f1

View File

@ -521,13 +521,15 @@ static int check_packed_git_idx(const char *path, struct packed_git *p)
munmap(idx_map, idx_size); munmap(idx_map, idx_size);
return error("wrong index v2 file size in %s", path); return error("wrong index v2 file size in %s", path);
} }
if (idx_size != min_size) { if (idx_size != min_size &&
/* make sure we can deal with large pack offsets */ /*
off_t x = 0x7fffffffUL, y = 0xffffffffUL; * make sure we can deal with large pack offsets.
if (x > (x + 1) || y > (y + 1)) { * 31-bit signed offset won't be enough, neither
munmap(idx_map, idx_size); * 32-bit unsigned one will be.
return error("pack too large for current definition of off_t in %s", path); */
} (sizeof(off_t) <= 4)) {
munmap(idx_map, idx_size);
return error("pack too large for current definition of off_t in %s", path);
} }
} }