From 0b2c4061878bc5b437b1a9e9b5f43c357283980e Mon Sep 17 00:00:00 2001 From: "Kirill A. Shutemov" Date: Tue, 30 Aug 2011 23:06:04 +0300 Subject: [PATCH] CMakefile: add -Wstrict-aliasing=2 and fix warnings Signed-off-by: Kirill A. Shutemov --- CMakeLists.txt | 2 +- src/cache.c | 12 ++++++------ src/tree.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e149cd27f..e73f98256 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ IF (MSVC) SET(CMAKE_C_FLAGS_DEBUG "/Od /DEBUG /MTd") SET(CMAKE_C_FLAGS_RELEASE "/MT /O2") ELSE () - SET(CMAKE_C_FLAGS "-O2 -g -Wall -Wextra") + SET(CMAKE_C_FLAGS "-O2 -g -Wall -Wextra -Wstrict-aliasing=2") IF (NOT MINGW) # MinGW always does PIC and complains if we tell it to SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") ENDIF () diff --git a/src/cache.c b/src/cache.c index 433fc3d9c..fca7e1236 100644 --- a/src/cache.c +++ b/src/cache.c @@ -76,12 +76,12 @@ void git_cache_free(git_cache *cache) void *git_cache_get(git_cache *cache, const git_oid *oid) { - const uint32_t *hash; + uint32_t hash; cache_node *node = NULL; void *result = NULL; - hash = (const uint32_t *)oid->id; - node = &cache->nodes[hash[0] & cache->size_mask]; + memcpy(&hash, oid->id, sizeof(hash)); + node = &cache->nodes[hash & cache->size_mask]; git_mutex_lock(&node->lock); { @@ -97,13 +97,13 @@ void *git_cache_get(git_cache *cache, const git_oid *oid) void *git_cache_try_store(git_cache *cache, void *entry) { - const uint32_t *hash; + uint32_t hash; const git_oid *oid; cache_node *node = NULL; oid = &((git_cached_obj*)entry)->oid; - hash = (const uint32_t *)oid->id; - node = &cache->nodes[hash[0] & cache->size_mask]; + memcpy(&hash, oid->id, sizeof(hash)); + node = &cache->nodes[hash & cache->size_mask]; /* increase the refcount on this object, because * the cache now owns it */ diff --git a/src/tree.c b/src/tree.c index d993d549a..ea2a47b59 100644 --- a/src/tree.c +++ b/src/tree.c @@ -175,6 +175,7 @@ static int tree_parse_buffer(git_tree *tree, const char *buffer, const char *buf while (buffer < buffer_end) { git_tree_entry *entry; + long tmp; entry = git__calloc(1, sizeof(git_tree_entry)); if (entry == NULL) { @@ -185,8 +186,10 @@ static int tree_parse_buffer(git_tree *tree, const char *buffer, const char *buf if (git_vector_insert(&tree->entries, entry) < GIT_SUCCESS) return GIT_ENOMEM; - if (git__strtol32((long *)&entry->attr, buffer, &buffer, 8) < GIT_SUCCESS) + if (git__strtol32(&tmp, buffer, &buffer, 8) < GIT_SUCCESS || + !buffer || tmp > UINT_MAX || tmp < 0) return git__throw(GIT_EOBJCORRUPTED, "Failed to parse tree. Can't parse attributes"); + entry->attr = tmp; if (*buffer++ != ' ') { error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse tree. Object it corrupted");