diff options
author | Junio C Hamano <gitster@pobox.com> | 2007-10-29 11:53:55 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2007-10-29 11:56:57 -0700 |
commit | 7109c889f11b39a2c5a5122e3726be7ffce09faf (patch) | |
tree | 0d9ac8b963f90d3138e5bbc43a5fb7d47d8f865d | |
parent | 399f0a8eedeec209c2eb97be6285331087234644 (diff) | |
download | git-7109c889f11b39a2c5a5122e3726be7ffce09faf.tar.gz git-7109c889f11b39a2c5a5122e3726be7ffce09faf.tar.xz |
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>
-rw-r--r-- | sha1_file.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/sha1_file.c b/sha1_file.c index 9978a58da..95b5a403d 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -521,13 +521,15 @@ static int check_packed_git_idx(const char *path, struct packed_git *p) munmap(idx_map, idx_size); return error("wrong index v2 file size in %s", path); } - if (idx_size != min_size) { - /* make sure we can deal with large pack offsets */ - off_t x = 0x7fffffffUL, y = 0xffffffffUL; - if (x > (x + 1) || y > (y + 1)) { - munmap(idx_map, idx_size); - return error("pack too large for current definition of off_t in %s", path); - } + if (idx_size != min_size && + /* + * make sure we can deal with large pack offsets. + * 31-bit signed offset won't be enough, neither + * 32-bit unsigned one will be. + */ + (sizeof(off_t) <= 4)) { + munmap(idx_map, idx_size); + return error("pack too large for current definition of off_t in %s", path); } } |