summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2007-10-29 18:53:55 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-10-29 18:56:57 (GMT)
commit7109c889f11b39a2c5a5122e3726be7ffce09faf (patch)
tree0d9ac8b963f90d3138e5bbc43a5fb7d47d8f865d /sha1_file.c
parent399f0a8eedeec209c2eb97be6285331087234644 (diff)
downloadgit-7109c889f11b39a2c5a5122e3726be7ffce09faf.zip
git-7109c889f11b39a2c5a5122e3726be7ffce09faf.tar.gz
git-7109c889f11b39a2c5a5122e3726be7ffce09faf.tar.bz2
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>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 9978a58..95b5a40 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);
}
}