Commit 0b2c4061878bc5b437b1a9e9b5f43c357283980e

Kirill A. Shutemov 2011-08-30T23:06:04

CMakefile: add -Wstrict-aliasing=2 and fix warnings Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name>

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e149cd2..e73f982 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 433fc3d..fca7e12 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 d993d54..ea2a47b 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");