[libvirt] [PATCH] snapashot: Improve logic of virDomainMomentMoveChildren
Ján Tomko
jtomko at redhat.com
Thu Mar 28 15:18:59 UTC 2019
s/snapashot/snapshot/
On Thu, Mar 28, 2019 at 09:05:31AM -0500, Eric Blake wrote:
>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.
>
The build works for me so I cannot judge that part
>Fixes: ced0898f86bf
>Reported-by: Bjoern Walk <bwalk at linux.ibm.com>
>Signed-off-by: Eric Blake <eblake at 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;
From the code-change point-of view, by removing this condition,
>- 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;
this possibly erases 'to->first_child' if 'from' does not have any.
But the callers are reasonable and only call this if (from->nchildren)
> from->nchildren = 0;
> from->first_child = NULL;
Reviewed-by: Ján Tomko <jtomko at redhat.com>
Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20190328/b7f21b1b/attachment-0001.sig>
More information about the libvir-list
mailing list