Jim Meyering wrote: > Jim Meyering wrote: >> Eric Blake wrote: >>> On 05/17/2010 11:22 AM, Jim Meyering wrote: >>>> This addresses another coverity-spotted "flaw". >>>> However, since "cgroup" is never NULL after that initial "if" stmt, >>>> the only penalty is that the useless cleanup test would make a reviewer >>>> try to figure out how cgroup could be NULL there. >>> >>> ACK. >> >> Thanks. >> >>>> cleanup: >>>> - if (cgroup) >>>> - virCgroupFree(&cgroup); >>>> + virCgroupFree(&cgroup); >>> >>> Is this something that the useless-if-before-free test could have >>> caught, rather than waiting for coverity? >> >> Very good idea. >> Here's a patch to do that. >> With this, "make sc_avoid_if_before_free" (part of make syntax-check) >> will now prevent any new useless checks. >> The above was the sole offender. > > Actually, this is just the tip of the iceberg. > A couple minutes work have shown that there are many more: > > Running this shows there are potentially at least 100 > candidate functions: > > aid free|grep '^vi' > > Looking at the first few on the list, I've found that most are > indeed free-like: > > N virBufferFreeAndReset > y virCPUDefFree > Y virCapabilitiesFree > y virCapabilitiesFreeGuest > y virCapabilitiesFreeGuestDomain > y virCapabilitiesFreeGuestFeature > y virCapabilitiesFreeGuestMachine > y virCapabilitiesFreeHostNUMACell > y virCapabilitiesFreeMachines > N virCapabilitiesFreeNUMAInfo (should probably fix) > y virCgroupFree > N virConfFree (diagnoses the "error") > y virConfFreeList > y virConfFreeValue > > So far, most of the exceptions can be "fixed" > to also be free-like. > > Using those few additions uncovered these: > > src/conf/storage_conf.c: if (pool->newDef) > virStoragePoolDefFree(pool->newDef) > src/security/virt-aa-helper.c: if (ctl->caps) > virCapabilitiesFree(ctl->caps) > src/util/conf.c: if (cur->value) { > virConfFreeValue(cur->value); > } Here's a complete patch: >From 59d7134bc925de86b807262896a76256b889c96a Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyering@xxxxxxxxxx> Date: Mon, 17 May 2010 22:38:59 +0200 Subject: [PATCH] maint: add more free-like functions to the list and deal with fallout * cfg.mk (useless_free_options): Add many vir*Free* function names, and then remove the useless if-before-free tests exposed by running make syntax-check. * src/conf/interface_conf.c (virInterfaceDefFree): Remove useless "if". (virInterfaceAssignDef): Likewise. * src/conf/network_conf.c (virNetworkAssignDef): Likewise. * src/conf/storage_conf.c (virStoragePoolObjAssignDef): Likewise. * src/node_device/node_device_hal.c (dev_create): Likewise. * src/security/virt-aa-helper.c (vahDeinit): Likewise. * src/test/test_driver.c (testNodeDeviceCreateXML): Likewise. * src/util/conf.c (virConfSetValue): Likewise. --- cfg.mk | 163 +++++++++++++++++++++++++++++++++++-- src/conf/interface_conf.c | 13 +-- src/conf/network_conf.c | 3 +- src/conf/storage_conf.c | 3 +- src/node_device/node_device_hal.c | 3 +- src/security/virt-aa-helper.c | 3 +- src/test/test_driver.c | 3 +- src/util/conf.c | 4 +- 8 files changed, 167 insertions(+), 28 deletions(-) diff --git a/cfg.mk b/cfg.mk index 0b281a5..96d6953 100644 --- a/cfg.mk +++ b/cfg.mk @@ -64,15 +64,164 @@ local-checks-to-skip = \ sc_makefile_check \ sc_useless_cpp_parens -useless_free_options = \ - --name=sexpr_free \ - --name=virCgroupFree \ - --name=VIR_FREE \ - --name=xmlFree \ - --name=xmlXPathFreeContext \ - --name=virDomainDefFree \ +useless_free_options = \ + --name=VIR_FREE \ + --name=sexpr_free \ + --name=virCPUDefFree \ + --name=virCapabilitiesFree \ + --name=virCapabilitiesFreeGuest \ + --name=virCapabilitiesFreeGuestDomain \ + --name=virCapabilitiesFreeGuestFeature \ + --name=virCapabilitiesFreeGuestMachine \ + --name=virCapabilitiesFreeHostNUMACell \ + --name=virCapabilitiesFreeMachines \ + --name=virCgroupFree \ + --name=virConfFreeList \ + --name=virConfFreeValue \ + --name=virDomainChrDefFree \ + --name=virDomainControllerDefFree \ + --name=virDomainDefFree \ + --name=virDomainDeviceDefFree \ + --name=virDomainDiskDefFree \ + --name=virDomainEventCallbackListFree \ + --name=virDomainEventFree \ + --name=virDomainEventQueueFree \ + --name=virDomainFSDefFree \ + --name=virDomainGraphicsDefFree \ + --name=virDomainHostdevDefFree \ + --name=virDomainInputDefFree \ + --name=virDomainNetDefFree \ + --name=virDomainObjFree \ + --name=virDomainSnapshotDefFree \ + --name=virDomainSnapshotObjFree \ + --name=virDomainSoundDefFree \ + --name=virDomainVideoDefFree \ + --name=virDomainWatchdogDefFree \ + --name=virInterfaceDefFree \ + --name=virInterfaceIpDefFree \ + --name=virInterfaceObjFree \ + --name=virInterfaceProtocolDefFree \ + --name=virJSONValueFree \ + --name=virLastErrFreeData \ + --name=virNWFilterDefFree \ + --name=virNWFilterEntryFree \ + --name=virNWFilterHashTableFree \ + --name=virNWFilterIPAddrLearnReqFree \ + --name=virNWFilterIncludeDefFree \ + --name=virNWFilterPoolObjFree \ + --name=virNWFilterRuleDefFree \ + --name=virNWFilterRuleInstFree \ + --name=virNetworkDefFree \ + --name=virNetworkObjFree \ + --name=virNodeDeviceDefFree \ + --name=virNodeDeviceObjFree \ + --name=virSecretDefFree \ + --name=virStorageEncryptionFree \ + --name=virStorageEncryptionSecretFree \ + --name=virStoragePoolDefFree \ + --name=virStoragePoolObjFree \ + --name=virStoragePoolSourceFree \ + --name=virStorageVolDefFree \ + --name=xmlFree \ + --name=xmlXPathFreeContext \ --name=xmlXPathFreeObject +# The following template was generated by this command: +# make ID && aid free|grep '^vi'|sed 's/ .*//;s/^/# /' +# N virBufferFreeAndReset +# y virCPUDefFree +# y virCapabilitiesFree +# y virCapabilitiesFreeGuest +# y virCapabilitiesFreeGuestDomain +# y virCapabilitiesFreeGuestFeature +# y virCapabilitiesFreeGuestMachine +# y virCapabilitiesFreeHostNUMACell +# y virCapabilitiesFreeMachines +# N virCapabilitiesFreeNUMAInfo FIXME +# y virCgroupFree +# N virConfFree (diagnoses the "error") +# y virConfFreeList +# y virConfFreeValue +# y virDomainChrDefFree +# y virDomainControllerDefFree +# y virDomainDefFree +# y virDomainDeviceDefFree +# y virDomainDiskDefFree +# y virDomainEventCallbackListFree +# y virDomainEventFree +# y virDomainEventQueueFree +# y virDomainFSDefFree +# n virDomainFree +# n virDomainFreeName (can't fix -- returns int) +# y virDomainGraphicsDefFree +# y virDomainHostdevDefFree +# y virDomainInputDefFree +# y virDomainNetDefFree +# y virDomainObjFree +# y virDomainSnapshotDefFree +# n virDomainSnapshotFree (returns int) +# n virDomainSnapshotFreeName (returns int) +# y virDomainSnapshotObjFree +# y virDomainSoundDefFree +# y virDomainVideoDefFree +# y virDomainWatchdogDefFree +# n virDrvNodeGetCellsFreeMemory (returns int) +# n virDrvNodeGetFreeMemory (returns long long) +# n virFree (dereferences param) +# n virFreeError +# n virHashFree (takes 2 args) +# y virInterfaceDefFree +# n virInterfaceFree (returns int) +# n virInterfaceFreeName +# y virInterfaceIpDefFree +# y virInterfaceObjFree +# n virInterfaceObjListFree +# y virInterfaceProtocolDefFree +# y virJSONValueFree +# y virLastErrFreeData +# y virNWFilterDefFree +# y virNWFilterEntryFree +# n virNWFilterFree (returns int) +# y virNWFilterHashTableFree +# y virNWFilterIPAddrLearnReqFree +# y virNWFilterIncludeDefFree +# n virNWFilterPoolFreeName (returns int) +# y virNWFilterPoolObjFree +# n virNWFilterPoolObjListFree FIXME +# y virNWFilterRuleDefFree +# n virNWFilterRuleFreeInstanceData (typedef) +# y virNWFilterRuleInstFree +# y virNetworkDefFree +# n virNetworkFree (returns int) +# n virNetworkFreeName (returns int) +# y virNetworkObjFree +# n virNetworkObjListFree FIXME +# n virNodeDevCapsDefFree FIXME +# y virNodeDeviceDefFree +# n virNodeDeviceFree (returns int) +# y virNodeDeviceObjFree +# n virNodeDeviceObjListFree FIXME +# n virNodeGetCellsFreeMemory (returns int) +# n virNodeGetFreeMemory (returns non-void) +# y virSecretDefFree +# n virSecretFree (returns non-void) +# n virSecretFreeName (2 args) +# n virSecurityLabelDefFree FIXME +# n virStorageBackendDiskMakeFreeExtent (returns non-void) +# y virStorageEncryptionFree +# y virStorageEncryptionSecretFree +# n virStorageFreeType (enum) +# y virStoragePoolDefFree +# n virStoragePoolFree (returns non-void) +# n virStoragePoolFreeName (returns non-void) +# y virStoragePoolObjFree +# n virStoragePoolObjListFree FIXME +# y virStoragePoolSourceFree +# y virStorageVolDefFree +# n virStorageVolFree (returns non-void) +# n virStorageVolFreeName (returns non-void) +# n virStreamFree + # Avoid uses of write(2). Either switch to streams (fwrite), or use # the safewrite wrapper. sc_avoid_write: diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c index 920b090..6430f7a 100644 --- a/src/conf/interface_conf.c +++ b/src/conf/interface_conf.c @@ -85,20 +85,18 @@ void virInterfaceDefFree(virInterfaceDefPtr def) switch (def->type) { case VIR_INTERFACE_TYPE_BRIDGE: for (i = 0;i < def->data.bridge.nbItf;i++) { - if (def->data.bridge.itf[i] != NULL) - virInterfaceDefFree(def->data.bridge.itf[i]); - else + if (def->data.bridge.itf[i] == NULL) break; /* to cope with half parsed data on errors */ + virInterfaceDefFree(def->data.bridge.itf[i]); } VIR_FREE(def->data.bridge.itf); break; case VIR_INTERFACE_TYPE_BOND: VIR_FREE(def->data.bond.target); for (i = 0;i < def->data.bond.nbItf;i++) { - if (def->data.bond.itf[i] != NULL) - virInterfaceDefFree(def->data.bond.itf[i]); - else + if (def->data.bond.itf[i] == NULL) break; /* to cope with half parsed data on errors */ + virInterfaceDefFree(def->data.bond.itf[i]); } VIR_FREE(def->data.bond.itf); break; @@ -1227,8 +1225,7 @@ virInterfaceObjPtr virInterfaceAssignDef(virInterfaceObjListPtr interfaces, virInterfaceObjPtr iface; if ((iface = virInterfaceFindByName(interfaces, def->name))) { - if (iface->def) - virInterfaceDefFree(iface->def); + virInterfaceDefFree(iface->def); iface->def = def; return iface; diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 1f3a44c..06537d1 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -157,8 +157,7 @@ virNetworkObjPtr virNetworkAssignDef(virNetworkObjListPtr nets, virNetworkDefFree(network->def); network->def = def; } else { - if (network->newDef) - virNetworkDefFree(network->newDef); + virNetworkDefFree(network->newDef); network->newDef = def; } diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index 6218e02..778b909 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -1332,8 +1332,7 @@ virStoragePoolObjAssignDef(virStoragePoolObjListPtr pools, virStoragePoolDefFree(pool->def); pool->def = def; } else { - if (pool->newDef) - virStoragePoolDefFree(pool->newDef); + virStoragePoolDefFree(pool->newDef); pool->newDef = def; } return pool; diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c index 0174794..8113c55 100644 --- a/src/node_device/node_device_hal.c +++ b/src/node_device/node_device_hal.c @@ -486,8 +486,7 @@ static void dev_create(const char *udi) DEBUG("FAILED TO ADD dev %s", name); cleanup: VIR_FREE(privData); - if (def) - virNodeDeviceDefFree(def); + virNodeDeviceDefFree(def); nodeDeviceUnlock(driverState); } diff --git a/src/security/virt-aa-helper.c b/src/security/virt-aa-helper.c index ae923e8..88cdc9d 100644 --- a/src/security/virt-aa-helper.c +++ b/src/security/virt-aa-helper.c @@ -63,8 +63,7 @@ vahDeinit(vahControl * ctl) return -1; VIR_FREE(ctl->def); - if (ctl->caps) - virCapabilitiesFree(ctl->caps); + virCapabilitiesFree(ctl->caps); VIR_FREE(ctl->files); VIR_FREE(ctl->hvm); VIR_FREE(ctl->arch); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 6706cba..395c8c9 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -4983,8 +4983,7 @@ testNodeDeviceCreateXML(virConnectPtr conn, def = NULL; cleanup: testDriverUnlock(driver); - if (def) - virNodeDeviceDefFree(def); + virNodeDeviceDefFree(def); VIR_FREE(wwnn); VIR_FREE(wwpn); return dev; diff --git a/src/util/conf.c b/src/util/conf.c index 38eb163..8682f7b 100644 --- a/src/util/conf.c +++ b/src/util/conf.c @@ -902,9 +902,7 @@ virConfSetValue (virConfPtr conf, conf->entries = cur; } } else { - if (cur->value) { - virConfFreeValue(cur->value); - } + virConfFreeValue(cur->value); cur->value = value; } return (0); -- 1.7.1.250.g7d1e8 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list