Merge "Suppress false positive memory leak warnings."

This commit is contained in:
Chih-hung Hsieh 2016-02-05 01:21:14 +00:00 committed by Gerrit Code Review
commit cfd44ee74f

View file

@ -31,6 +31,20 @@
#define UNUSED __attribute__((unused)) #define UNUSED __attribute__((unused))
/* When an object is allocated but not freed in a function,
* because its ownership is released to other object like a hashmap,
* call RELEASE_OWNERSHIP to tell the clang analyzer and avoid
* false warnings about potential memory leak.
* For now, a "temporary" assignment to global variables
* is enough to confuse the clang static analyzer.
*/
#ifdef __clang_analyzer__
static void *released_pointer;
#define RELEASE_OWNERSHIP(x) { released_pointer = x; released_pointer = 0; }
#else
#define RELEASE_OWNERSHIP(x)
#endif
struct str_parms { struct str_parms {
Hashmap *map; Hashmap *map;
}; };
@ -170,9 +184,12 @@ struct str_parms *str_parms_create_str(const char *_string)
/* if we replaced a value, free it */ /* if we replaced a value, free it */
old_val = hashmapPut(str_parms->map, key, value); old_val = hashmapPut(str_parms->map, key, value);
RELEASE_OWNERSHIP(value);
if (old_val) { if (old_val) {
free(old_val); free(old_val);
free(key); free(key);
} else {
RELEASE_OWNERSHIP(key);
} }
items++; items++;
@ -222,10 +239,13 @@ int str_parms_add_str(struct str_parms *str_parms, const char *key,
goto clean_up; goto clean_up;
} }
// For new keys, hashmap takes ownership of tmp_key and tmp_val. // For new keys, hashmap takes ownership of tmp_key and tmp_val.
RELEASE_OWNERSHIP(tmp_key);
RELEASE_OWNERSHIP(tmp_val);
tmp_key = tmp_val = NULL; tmp_key = tmp_val = NULL;
} else { } else {
// For existing keys, hashmap takes ownership of tmp_val. // For existing keys, hashmap takes ownership of tmp_val.
// (It also gives up ownership of old_val.) // (It also gives up ownership of old_val.)
RELEASE_OWNERSHIP(tmp_val);
tmp_val = NULL; tmp_val = NULL;
} }