viralloc: Adjust definition of VIR_FREE() for Coverity

The Coverity static analyzer was generating many false positives for the
unary operation inside the VIR_FREE() definition as it was trying to evaluate
the else portion of the "?:" even though the if portion was (1).

Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
John Ferlan 2013-01-22 09:15:37 -05:00 committed by Eric Blake
parent 23b9502bfc
commit c9a85af319

View File

@ -1,7 +1,7 @@
/* /*
* viralloc.h: safer memory allocation * viralloc.h: safer memory allocation
* *
* Copyright (C) 2010-2012 Red Hat, Inc. * Copyright (C) 2010-2013 Red Hat, Inc.
* Copyright (C) 2008 Daniel P. Berrange * Copyright (C) 2008 Daniel P. Berrange
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@ -361,11 +361,21 @@ void virFree(void *ptrptr) ATTRIBUTE_NONNULL(1);
* Free the memory stored in 'ptr' and update to point * Free the memory stored in 'ptr' and update to point
* to NULL. * to NULL.
*/ */
# if !STATIC_ANALYSIS
/* The ternary ensures that ptr is a pointer and not an integer type, /* The ternary ensures that ptr is a pointer and not an integer type,
* while evaluating ptr only once. For now, we intentionally cast * while evaluating ptr only once. This gives us extra compiler
* safety when compiling under gcc. For now, we intentionally cast
* away const, since a number of callers safely pass const char *. * away const, since a number of callers safely pass const char *.
*/ */
# define VIR_FREE(ptr) virFree((void *) (1 ? (const void *) &(ptr) : (ptr))) # define VIR_FREE(ptr) virFree((void *) (1 ? (const void *) &(ptr) : (ptr)))
# else
/* The Coverity static analyzer considers the else path of the "?:" and
* flags the VIR_FREE() of the address of the address of memory as a
* RESOURCE_LEAK resulting in numerous false positives (eg, VIR_FREE(&ptr))
*/
# define VIR_FREE(ptr) virFree((void *) &(ptr))
# endif
# if TEST_OOM # if TEST_OOM