Even though Coverity can prove that 'last' is always set if the prior
loop executed, gcc 8.0.1 cannot:
CC conf/libvirt_conf_la-virdomainmomentobjlist.lo
../../src/conf/virdomainmomentobjlist.c: In function
'virDomainMomentMoveChildren':
../../src/conf/virdomainmomentobjlist.c:178:19: error: 'last' may be used
uninitialized in this function [-Werror=maybe-uninitialized]
last->sibling = to->first_child;
~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
Rewrite the loop to a form that should be easier for static analysis
to work with.
Fixes: ced0898f86bf
Reported-by: Bjoern Walk <bwalk(a)linux.ibm.com>
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
Qualifies as a build-breaker fix, but I'd like a review before pushing.
src/conf/virdomainmomentobjlist.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/src/conf/virdomainmomentobjlist.c b/src/conf/virdomainmomentobjlist.c
index b9ca5b1318..5a217056d1 100644
--- a/src/conf/virdomainmomentobjlist.c
+++ b/src/conf/virdomainmomentobjlist.c
@@ -164,18 +164,17 @@ void
virDomainMomentMoveChildren(virDomainMomentObjPtr from,
virDomainMomentObjPtr to)
{
- virDomainMomentObjPtr child;
- virDomainMomentObjPtr last;
+ virDomainMomentObjPtr child = from->first_child;
- if (!from->first_child)
- return;
- for (child = from->first_child; child; child = child->sibling) {
+ while (child) {
child->parent = to;
- if (!child->sibling)
- last = child;
+ if (!child->sibling) {
+ child->sibling = to->first_child;
+ break;
+ }
+ child = child->sibling;
}
to->nchildren += from->nchildren;
- last->sibling = to->first_child;
to->first_child = from->first_child;
from->nchildren = 0;
from->first_child = NULL;
--
2.20.1