[libvirt] [PATCH] qemu: Resolve Coverity DEADCODE
John Ferlan
jferlan at redhat.com
Mon Apr 27 15:46:48 UTC 2015
On 04/27/2015 11:22 AM, Michal Privoznik wrote:
> On 27.04.2015 14:22, John Ferlan wrote:
>>
>>
>> On 04/27/2015 07:51 AM, Michal Privoznik wrote:
>>> On 27.04.2015 13:33, John Ferlan wrote:
>>>> Coverity notes taht the switch() used to check 'connected' values has
>>>
>>> s/taht/that/
>>>
>>>> two DEADCODE paths (_DEFAULT & _LAST). Since 'connected' is a boolean
>>>> it can only be one or the other (CONNECTED or DISCONNECTED), so it just
>>>> seems pointless to use a switch to get "all" values. Convert to if-else
>>>>
>>>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>>>> ---
>>>> src/qemu/qemu_driver.c | 14 +++-----------
>>>> 1 file changed, 3 insertions(+), 11 deletions(-)
>>>>
>>>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>>>> index 31cbccb..1c72844 100644
>>>> --- a/src/qemu/qemu_driver.c
>>>> +++ b/src/qemu/qemu_driver.c
>>>> @@ -4497,8 +4497,7 @@ processSerialChangedEvent(virQEMUDriverPtr driver,
>>>> goto endjob;
>>>>
>>>> if (STREQ_NULLABLE(dev.data.chr->target.name, "org.qemu.guest_agent.0")) {
>>>> - switch (newstate) {
>>>> - case VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED:
>>>> + if (newstate == VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED) {
>>>> if (!priv->agent) {
>>>> if ((rc = qemuConnectAgent(driver, vm)) == -2)
>>>> goto endjob;
>>>> @@ -4506,20 +4505,13 @@ processSerialChangedEvent(virQEMUDriverPtr driver,
>>>> if (rc < 0)
>>>> priv->agentError = true;
>>>> }
>>>> - break;
>>>> -
>>>> - case VIR_DOMAIN_CHR_DEVICE_STATE_DISCONNECTED:
>>>> + } else {
>>>> if (priv->agent) {
>>>> qemuAgentClose(priv->agent);
>>>> priv->agent = NULL;
>>>> priv->agentError = false;
>>>> }
>>>> - break;
>>>> -
>>>> - case VIR_DOMAIN_CHR_DEVICE_STATE_DEFAULT:
>>>> - case VIR_DOMAIN_CHR_DEVICE_STATE_LAST:
>>>> - break;
>>>
>>> Can't we just put coverity[dead_error_begin] or something similar here?
>>>
>>
>> We could... That would avoid the message. Of course there are those
>> that dislike the coverity markers... I did consider that, but with
>> 'newstate' being a bool I felt how could anything be more than one or
>> the other. If one looks at how this is generated one ends up in
>> qemuMonitorJSONHandleSerialChange where virJSONValueObjectGetBoolean
>> fills in the 'connected' boolean which is eventually sent to
>> 'domainSerialChange' which fills in the processEvent->action value.
>>
>> While I understand the "goal" of using the switch() to ensure no new
>> virDomainChrDeviceState options cause some sort of issue - for this
>> particular value - a *lot* would have to change (including the qemu API)
>> in order for this particular one to need a switch.
>>
>> Considering other approaches - using the coverity marker, one would have
>> to adjust the code as follows because it's multiple conditions:
>>
>> /* coverity[dead_error_begin] */
>> case VIR_DOMAIN_CHR_DEVICE_STATE_DEFAULT:
>> break;
>>
>> /* coverity[dead_error_begin] */
>> case VIR_DOMAIN_CHR_DEVICE_STATE_LAST:
>> break;
>> };
>>
>> Alternatively, see virDomainDefCheckABIStability for a slightly
>> different approach using "#if !STATIC_ANALYSIS" where multiple "dead"
>> cases are combined into one break.
>>
>> Doesn't matter to me which way to go on this. Pick a preferred
>> mechanism. To me the if-else was least ugly.
>
> Okay. Let's go that way then.
I assume you meant the if-else method...
>
> BTW: as Coverity evolves, do we revisit all the false positives we have
> in our code? I mean, some of them may be no longer needed. Or maybe the
> surrounding code changes so coverity would not report any false
> positive. Just asking whether you (or somebody else) considered that. I
> can imagine how terribly boring can that be.
>
I haven't done that recently, although false positives generally don't
become "OK" at some point, unless it's a Coverity bug. We did have one
of those (for which I reported) with the VIR_FREE() mechanism... I did
get a report that it was fixed in "some" release, but I cannot recall if
I was able to successfully test that in our environment.
John
More information about the libvir-list
mailing list