[libvirt] [PATCH v2 00/42] Fix build with gcc8 and switch() robustness

This started off as a simple fix to deal with gcc8. After shearing a few hundred yaks, it is a now a 42 patch series :-) The crux of the issue is/was that gcc8 reports various problems wrt fallthrough for some switch statements. These were indeed bugs in libvirt which the first patch fixes. What this highlighted, however, was that relying on only listing valid enum constant names in switch case statements is unsafe. Nothing at all prevents you from assigning an invalid integer value to a variable that is treated as an enum. Thus to be safe we should have a default: for every switch. Adding this causes us to loose the warnings about missing enum constants though, so we must turn on -Wswitch-enum. To turn that on though, we need to fix up various switch() statements that missed enum values but had a default. After going to all that trouble it then adds the default: to all remaining switches. In doing this I found a reasonable number of bugs, where we would call virXXXXXToString() methods with a _LAST constant - this is not right as the _LAST constant can't be converted to a string as it is a sentinal value only. So these were all fixed along the way. At the same time various switches were improved such that the value being switched on was cast to an enum type, to let the compiler report missing enum cases. A big cleanup but the code should be more robust against future mistakes like the one fixed in patch 01. There's a lot of patches here, but they're mostly independant of each other so we can push them incrementally as they're reviewed, so don't feel a need to review everything in one go ! Daniel P. Berrangé (42): conf: add enum constants for default controller models util: handle missing switch enum cases conf: handle missing switch enum cases esx: handle missing switch enum cases hyperv: handle missing switch enum cases libxl: handle missing switch enum cases lxc: handle missing switch enum cases nwfilter: handle missing switch enum cases qemu: handle missing switch enum cases rpc: handle missing switch enum cases security: handle missing switch enum cases xen: handle missing switch enum cases tools: handle missing switch enum cases m4: enforce that all enum cases are listed in switch statements m4: disable gcc8 -Wcast-function-type warnings from -Wextra util: add default: case to all switch statements conf: add default: case to all switch statements cpu: add default: case to all switch statements secret: add default: case to all switch statements xen: add default: case to all switch statements locking: add default: case to all switch statements test: add default: case to all switch statements remote: add default: case to all switch statements openvz: add default: case to all switch statements security: add default: case to all switch statements rpc: add default: case to all switch statements vbox: add default: case to all switch statements libxl: add default: case to all switch statements qemu: add default: case to all switch statements lxc: add default: case to all switch statements uml: add default: case to all switch statements bhyve: add default: case to all switch statements network: add default: case to all switch statements interface: add default: case to all switch statements storage: add default: case to all switch statements nodedev: add default: case to all switch statements nwfilter: add default: case to all switch statements daemon: add default: case to all switch statements tests: add default: case to all switch statements tools: add default: case to all switch statements examples: add default: case to all switch statements m4: enable the -Wswitch-default warning flag daemon/libvirtd.c | 4 +- daemon/remote.c | 4 + examples/object-events/event-test.c | 24 ++ m4/virt-compile-warnings.m4 | 11 +- po/POTFILES.in | 1 + src/bhyve/bhyve_command.c | 12 +- src/conf/device_conf.c | 4 +- src/conf/domain_addr.c | 15 +- src/conf/domain_audit.c | 5 + src/conf/domain_conf.c | 514 ++++++++++++++++++++++++------ src/conf/domain_conf.h | 4 + src/conf/domain_event.c | 1 + src/conf/interface_conf.c | 21 +- src/conf/netdev_bandwidth_conf.h | 4 +- src/conf/network_conf.c | 8 +- src/conf/network_event.c | 1 + src/conf/node_device_conf.c | 27 +- src/conf/node_device_event.c | 1 + src/conf/nwfilter_conf.c | 33 +- src/conf/nwfilter_params.c | 14 + src/conf/secret_event.c | 1 + src/conf/storage_event.c | 1 + src/conf/virnodedeviceobj.c | 1 + src/conf/virstorageobj.c | 1 + src/cpu/cpu.c | 6 +- src/cpu/cpu_ppc64.c | 16 +- src/cpu/cpu_x86.c | 13 +- src/esx/esx_driver.c | 1 + src/esx/esx_vi.c | 11 +- src/esx/esx_vi_types.c | 9 +- src/hyperv/hyperv_driver.c | 18 +- src/interface/interface_backend_udev.c | 12 +- src/libvirt.c | 3 + src/libvirt_private.syms | 6 + src/libxl/libxl_conf.c | 57 +++- src/libxl/libxl_domain.c | 23 +- src/libxl/libxl_driver.c | 16 +- src/libxl/libxl_logger.c | 2 + src/locking/lock_driver_sanlock.c | 6 +- src/locking/lock_manager.c | 2 + src/locking/sanlock_helper.c | 5 +- src/lxc/lxc_container.c | 7 +- src/lxc/lxc_controller.c | 11 +- src/lxc/lxc_driver.c | 42 ++- src/lxc/lxc_process.c | 10 +- src/network/bridge_driver.c | 46 ++- src/network/leaseshelper.c | 11 +- src/node_device/node_device_udev.c | 7 +- src/nwfilter/nwfilter_ebiptables_driver.c | 18 +- src/nwfilter/nwfilter_gentech_driver.c | 23 +- src/nwfilter/nwfilter_learnipaddr.c | 19 +- src/openvz/openvz_driver.c | 3 + src/qemu/qemu_alias.c | 3 + src/qemu/qemu_block.c | 22 +- src/qemu/qemu_blockjob.c | 1 + src/qemu/qemu_capabilities.c | 23 +- src/qemu/qemu_cgroup.c | 9 +- src/qemu/qemu_command.c | 440 ++++++++++++++++++++----- src/qemu/qemu_domain.c | 228 ++++++++++--- src/qemu/qemu_domain_address.c | 68 +++- src/qemu/qemu_driver.c | 136 ++++++-- src/qemu/qemu_hostdev.c | 5 +- src/qemu/qemu_hotplug.c | 94 +++++- src/qemu/qemu_interface.c | 12 +- src/qemu/qemu_migration.c | 35 +- src/qemu/qemu_migration_cookie.c | 6 +- src/qemu/qemu_monitor.c | 13 +- src/qemu/qemu_monitor_json.c | 67 +++- src/qemu/qemu_monitor_text.c | 3 + src/qemu/qemu_parse_command.c | 12 +- src/qemu/qemu_process.c | 110 ++++++- src/remote/remote_driver.c | 19 +- src/rpc/virnetclient.c | 2 + src/rpc/virnetclientprogram.c | 1 + src/rpc/virnetlibsshsession.c | 4 + src/rpc/virnetservermdns.c | 5 +- src/rpc/virnetserverprogram.c | 4 + src/rpc/virnetsshsession.c | 8 + src/secret/secret_util.c | 11 +- src/security/security_apparmor.c | 12 +- src/security/security_dac.c | 59 +++- src/security/security_driver.c | 1 + src/security/security_selinux.c | 69 +++- src/storage/storage_backend_gluster.c | 12 +- src/storage/storage_backend_rbd.c | 6 +- src/storage/storage_driver.c | 1 + src/storage/storage_util.c | 18 +- src/test/test_driver.c | 2 + src/uml/uml_conf.c | 5 +- src/util/vircgroup.c | 1 + src/util/virconf.c | 13 +- src/util/vircrypto.c | 2 + src/util/virerror.c | 6 +- src/util/virfdstream.c | 4 + src/util/virfirewall.c | 8 +- src/util/virhook.c | 12 +- src/util/virhostdev.c | 8 +- src/util/virhostmem.c | 5 + src/util/virjson.c | 5 + src/util/virlog.c | 17 +- src/util/virnetdev.c | 1 + src/util/virnetdevmacvlan.c | 3 + src/util/virnetdevvportprofile.c | 54 +++- src/util/virnuma.c | 5 +- src/util/virprocess.c | 1 + src/util/virqemu.c | 5 + src/util/virsexpr.c | 2 + src/util/virsocketaddr.c | 13 +- src/util/virstoragefile.c | 15 +- src/vbox/vbox_common.c | 42 ++- src/vmx/vmx.c | 27 +- src/xen/xen_driver.c | 17 +- src/xenconfig/xen_common.c | 23 +- src/xenconfig/xen_sxpr.c | 47 ++- src/xenconfig/xen_xl.c | 28 +- tests/cputest.c | 31 +- tests/domaincapstest.c | 1 + tests/qemuhotplugtest.c | 4 + tests/storagevolxml2argvtest.c | 2 + tests/virusbtest.c | 6 + tools/virsh-domain-monitor.c | 4 + tools/virsh-domain.c | 14 +- tools/virsh-nodedev.c | 1 + tools/virsh-pool.c | 1 + tools/virsh.c | 1 + tools/virt-admin.c | 1 + tools/virt-host-validate-qemu.c | 3 +- tools/vsh.c | 5 + 128 files changed, 2567 insertions(+), 512 deletions(-) -- 2.14.3

The controller model is slightly unusual in that the default value is -1, not 0. As a result the default value is not covered by any of the existing enum cases. This in turn means that any switch() statements that think they have covered all cases, will in fact not match the default value at all. In the qemuDomainDeviceCalculatePCIConnectFlags() method this has caused a serious mistake where we fallthough from the SCSI controller case, to the VirtioSerial controller case, and from the USB controller case to the IDE controller case. By adding explicit enum constant starting at -1, we can ensure switches remember to handle the default case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/domain_addr.c | 5 +++++ src/conf/domain_conf.c | 1 + src/conf/domain_conf.h | 4 ++++ src/qemu/qemu_command.c | 17 ++++++++++++++--- src/qemu/qemu_domain.c | 10 +++++++++- src/qemu/qemu_domain_address.c | 22 ++++++++++++++++++++++ src/vbox/vbox_common.c | 13 +++++++++---- 7 files changed, 64 insertions(+), 8 deletions(-) diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 6422682391..df19c6be1a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -39,6 +39,7 @@ virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model) * the equivalent VIR_PCI_CONNECT_TYPE_*. */ switch (model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: @@ -344,6 +345,9 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("PCI controller model was not set correctly")); @@ -1746,6 +1750,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont) return cont->opts.usbopts.ports; return 8; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: break; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index fb732a0c2a..abc3332377 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -10196,6 +10196,7 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: /* Other controller models don't require extra checks */ break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 6cd81ef2de..78b57aa6d4 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -685,6 +685,7 @@ typedef enum { typedef enum { + VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT = -1, VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT, VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT, VIR_DOMAIN_CONTROLLER_MODEL_PCI_BRIDGE, @@ -714,6 +715,7 @@ typedef enum { } virDomainControllerPCIModelName; typedef enum { + VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT = -1, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC, @@ -727,6 +729,7 @@ typedef enum { } virDomainControllerModelSCSI; typedef enum { + VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT = -1, VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI, VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX4_UHCI, VIR_DOMAIN_CONTROLLER_MODEL_USB_EHCI, @@ -746,6 +749,7 @@ typedef enum { } virDomainControllerModelUSB; typedef enum { + VIR_DOMAIN_CONTROLLER_MODEL_IDE_DEFAULT = -1, VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX3, VIR_DOMAIN_CONTROLLER_MODEL_IDE_PIIX4, VIR_DOMAIN_CONTROLLER_MODEL_IDE_ICH6, diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6c73cd7bfe..2a75a169c2 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2671,10 +2671,16 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported controller model: %s"), virDomainControllerModelSCSITypeToString(def->model)); + goto error; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SCSI controller model %d"), + def->model); + goto error; } virBufferAsprintf(&buf, ",id=%s", def->info.alias); break; @@ -2771,9 +2777,14 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, virBufferAsprintf(&buf, ",numa_node=%d", pciopts->numaNode); break; case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Unsupported PCI-E root controller")); + goto error; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("wrong function called")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected PCI controller model %d"), + def->model); goto error; } break; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 178ec24ae7..e114f5dfcf 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4098,11 +4098,16 @@ qemuDomainCheckSCSIControllerModel(virQEMUCapsPtr qemuCaps, case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported controller model: %s"), virDomainControllerModelSCSITypeToString(model)); return false; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SCSI controller model %d"), + model); + return false; } return true; @@ -4189,6 +4194,7 @@ qemuDomainDeviceDefValidateControllerSCSI(const virDomainControllerDef *controll case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1078: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: break; } @@ -4236,6 +4242,7 @@ qemuDomainDeviceDefValidateControllerPCI(const virDomainControllerDef *controlle case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: break; } @@ -4468,6 +4475,7 @@ qemuDomainDeviceDefValidateControllerPCI(const virDomainControllerDef *controlle case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: break; } diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e28119e4b1..de565dbf74 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -513,6 +513,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_CONTROLLER_TYPE_USB: switch ((virDomainControllerModelUSB) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */ + return pciFlags; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: return pcieFlags; @@ -540,6 +550,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: switch ((virDomainControllerModelSCSI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */ + return pciFlags; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: return virtioFlags; @@ -2165,6 +2185,7 @@ qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont, *modelName = VIR_DOMAIN_CONTROLLER_PCI_MODEL_NAME_SPAPR_PCI_HOST_BRIDGE; break; case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: break; } @@ -2552,6 +2573,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, case VIR_DOMAIN_CONTROLLER_MODEL_DMI_TO_PCI_BRIDGE: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: break; } diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index aed14f02d7..07f4308784 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -410,12 +410,17 @@ vboxSetStorageController(virDomainControllerDefPtr controller, case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1078: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("The vbox driver does not support %s SCSI " "controller model"), virDomainControllerModelSCSITypeToString(controller->model)); goto cleanup; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SCSI controller model %d"), + controller->model); + goto cleanup; } /* libvirt ide model => vbox ide model */ } else if (controller->type == VIR_DOMAIN_CONTROLLER_TYPE_IDE) { @@ -433,10 +438,10 @@ vboxSetStorageController(virDomainControllerDefPtr controller, break; case VIR_DOMAIN_CONTROLLER_MODEL_IDE_LAST: + case VIR_DOMAIN_CONTROLLER_MODEL_IDE_DEFAULT: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The vbox driver does not support %s IDE " - "controller model"), - virDomainControllerModelIDETypeToString(controller->model)); + _("Unexpected IDE controller model %d"), + controller->model); goto cleanup; } } -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
The controller model is slightly unusual in that the default value is -1, not 0. As a result the default value is not covered by any of the existing enum cases. This in turn means that any switch() statements that think they have covered all cases, will in fact not match the default value at all. In the qemuDomainDeviceCalculatePCIConnectFlags() method this has caused a serious mistake where we fallthough from the SCSI controller case, to the VirtioSerial controller case, and from the USB controller case to the IDE controller case.
By adding explicit enum constant starting at -1, we can ensure switches remember to handle the default case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/domain_addr.c | 5 +++++ src/conf/domain_conf.c | 1 + src/conf/domain_conf.h | 4 ++++ src/qemu/qemu_command.c | 17 ++++++++++++++--- src/qemu/qemu_domain.c | 10 +++++++++- src/qemu/qemu_domain_address.c | 22 ++++++++++++++++++++++ src/vbox/vbox_common.c | 13 +++++++++---- 7 files changed, 64 insertions(+), 8 deletions(-)
There's a few places where in the code where model is compared against -1 that could perhaps use the VIR_DOMAIN_CONTROLLER_MODEL_*_DEFAULT (I used 'model.*=.*-1' in the Find this egrep pattern in cscope). At least one of them (below) caused a Coverity complaint. So should any of those be altered or should we just live with the fact that using/knowing -1 is the 'default' model?
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 6422682391..df19c6be1a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c
[...]
@@ -1746,6 +1750,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont) return cont->opts.usbopts.ports; return 8;
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT:
Coverity points out that because at the top of this function, we have: if (model == -1) model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI; this particular condition cannot be met - IOW: DEADCODE Since the code isn't changing cont->model - we could just remove the @model local and move the DEFAULT into the return 2 leaving some sort of comment (perhaps) that DEFAULT == PIIX3_UHCI?
case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: break;
[...]
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6c73cd7bfe..2a75a169c2 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c
[...]
@@ -2771,9 +2777,14 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, virBufferAsprintf(&buf, ",numa_node=%d", pciopts->numaNode); break; case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Unsupported PCI-E root controller"));
PCI-Express
+ goto error; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("wrong function called")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected PCI controller model %d"), + def->model); goto error; } break;
[...]
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e28119e4b1..de565dbf74 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -513,6 +513,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_USB: switch ((virDomainControllerModelUSB) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */ + return pciFlags; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: return pcieFlags; @@ -540,6 +550,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: switch ((virDomainControllerModelSCSI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */ + return pciFlags; +
I think it was Laine that asked at one time about re-ordering things - /me taking a brief look caused my head to spin ;-) and I think this is a fine alternative (at least for now) until someone gets the gumption to attempt to fix it.
case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: return virtioFlags;
[...] For what's here w/ the issue Coverity noted handled... Adding setting the model to *_DEFAULT is an add on if it's done... Reviewed-by: John Ferlan <jferlan@redhat.com> John

On Mon, Feb 19, 2018 at 01:33:23PM -0500, John Ferlan wrote:
On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
The controller model is slightly unusual in that the default value is -1, not 0. As a result the default value is not covered by any of the existing enum cases. This in turn means that any switch() statements that think they have covered all cases, will in fact not match the default value at all. In the qemuDomainDeviceCalculatePCIConnectFlags() method this has caused a serious mistake where we fallthough from the SCSI controller case, to the VirtioSerial controller case, and from the USB controller case to the IDE controller case.
By adding explicit enum constant starting at -1, we can ensure switches remember to handle the default case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/domain_addr.c | 5 +++++ src/conf/domain_conf.c | 1 + src/conf/domain_conf.h | 4 ++++ src/qemu/qemu_command.c | 17 ++++++++++++++--- src/qemu/qemu_domain.c | 10 +++++++++- src/qemu/qemu_domain_address.c | 22 ++++++++++++++++++++++ src/vbox/vbox_common.c | 13 +++++++++---- 7 files changed, 64 insertions(+), 8 deletions(-)
There's a few places where in the code where model is compared against -1 that could perhaps use the VIR_DOMAIN_CONTROLLER_MODEL_*_DEFAULT (I used 'model.*=.*-1' in the Find this egrep pattern in cscope).
At least one of them (below) caused a Coverity complaint.
So should any of those be altered or should we just live with the fact that using/knowing -1 is the 'default' model?
Probably best to use the constant rather than literal -1.
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 6422682391..df19c6be1a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c
[...]
@@ -1746,6 +1750,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont) return cont->opts.usbopts.ports; return 8;
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT:
Coverity points out that because at the top of this function, we have:
if (model == -1) model = VIR_DOMAIN_CONTROLLER_MODEL_USB_PIIX3_UHCI;
this particular condition cannot be met - IOW: DEADCODE
Since the code isn't changing cont->model - we could just remove the @model local and move the DEFAULT into the return 2 leaving some sort of comment (perhaps) that DEFAULT == PIIX3_UHCI?
I'll just move the DEFAULT: case to be a fallthrough to the PIIX3_UHCI case instead, and delete that if (...).
@@ -540,6 +550,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: switch ((virDomainControllerModelSCSI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */ + return pciFlags; +
I think it was Laine that asked at one time about re-ordering things - /me taking a brief look caused my head to spin ;-) and I think this is a fine alternative (at least for now) until someone gets the gumption to attempt to fix it.
Laine suggested changing code so that it assigned USB addresses before assigning PCI addresses, but that does not work. We unfortunately don't assign default controller models until much later.
case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: return virtioFlags;
[...]
For what's here w/ the issue Coverity noted handled... Adding setting the model to *_DEFAULT is an add on if it's done...
Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Thu, Feb 15, 2018 at 04:43:06PM +0000, Daniel P. Berrangé wrote:
The controller model is slightly unusual in that the default value is -1, not 0. As a result the default value is not covered by any of the existing enum cases. This in turn means that any switch() statements that think they have covered all cases, will in fact not match the default value at all. In the qemuDomainDeviceCalculatePCIConnectFlags() method this has caused a serious mistake where we fallthough from the
s/fallthough/fallthrough/
SCSI controller case, to the VirtioSerial controller case, and from the USB controller case to the IDE controller case.
By adding explicit enum constant starting at -1, we can ensure switches remember to handle the default case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/domain_addr.c | 5 +++++ src/conf/domain_conf.c | 1 + src/conf/domain_conf.h | 4 ++++ src/qemu/qemu_command.c | 17 ++++++++++++++--- src/qemu/qemu_domain.c | 10 +++++++++- src/qemu/qemu_domain_address.c | 22 ++++++++++++++++++++++ src/vbox/vbox_common.c | 13 +++++++++---- 7 files changed, 64 insertions(+), 8 deletions(-)
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 6422682391..df19c6be1a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -39,6 +39,7 @@ virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model) * the equivalent VIR_PCI_CONNECT_TYPE_*. */ switch (model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: @@ -344,6 +345,9 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; break;
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + break; +
Unlike '-usb' for USB controllers, there is no -pci for pci controllers - we need to know the model at the time of building the command line. Not having one set here is either an error in the user input or the part of our code that should have filled the model in. If we want to be robust, this should be grouped with the next case.
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("PCI controller model was not set correctly")); @@ -1746,6 +1750,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont) return cont->opts.usbopts.ports; return 8;
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: break;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6c73cd7bfe..2a75a169c2 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2671,10 +2671,16 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported controller model: %s"), virDomainControllerModelSCSITypeToString(def->model)); + goto error; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SCSI controller model %d"), + def->model); + goto error; } virBufferAsprintf(&buf, ",id=%s", def->info.alias); break; @@ -2771,9 +2777,14 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, virBufferAsprintf(&buf, ",numa_node=%d", pciopts->numaNode); break; case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Unsupported PCI-E root controller")); + goto error; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("wrong function called")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected PCI controller model %d"), + def->model); goto error; } break; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 178ec24ae7..e114f5dfcf 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4098,11 +4098,16 @@ qemuDomainCheckSCSIControllerModel(virQEMUCapsPtr qemuCaps, case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported controller model: %s"), virDomainControllerModelSCSITypeToString(model)); return false; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SCSI controller model %d"), + model); + return false; }
return true;
[...]
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e28119e4b1..de565dbf74 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -513,6 +513,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_USB: switch ((virDomainControllerModelUSB) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */
qemuDomainControllerDefPostParse should have filled this one in for most QEMU machine/capabilities combinations. If it's still at default at this point, we're going to use "-usb", which should be a PCI device.
+ return pciFlags; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: return pcieFlags; @@ -540,6 +550,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: switch ((virDomainControllerModelSCSI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */ + return pciFlags; +
Slightly different: a default SCSI controller cannot be formatted unless we turn it into a model. qemuDomainSetSCSIControllerModel in qemuDomainControllerDefPostParse errors out if we have no QEMU capabilities, (which probably should be relaxed as it might break loading of existing domains if the QEMU binary is not present). But the test suite passes even with return 0, so the comment is misleading. Jan
case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: return virtioFlags;

On Tue, Feb 20, 2018 at 10:38:41AM +0100, Ján Tomko wrote:
On Thu, Feb 15, 2018 at 04:43:06PM +0000, Daniel P. Berrangé wrote:
The controller model is slightly unusual in that the default value is -1, not 0. As a result the default value is not covered by any of the existing enum cases. This in turn means that any switch() statements that think they have covered all cases, will in fact not match the default value at all. In the qemuDomainDeviceCalculatePCIConnectFlags() method this has caused a serious mistake where we fallthough from the
s/fallthough/fallthrough/
SCSI controller case, to the VirtioSerial controller case, and from the USB controller case to the IDE controller case.
By adding explicit enum constant starting at -1, we can ensure switches remember to handle the default case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/domain_addr.c | 5 +++++ src/conf/domain_conf.c | 1 + src/conf/domain_conf.h | 4 ++++ src/qemu/qemu_command.c | 17 ++++++++++++++--- src/qemu/qemu_domain.c | 10 +++++++++- src/qemu/qemu_domain_address.c | 22 ++++++++++++++++++++++ src/vbox/vbox_common.c | 13 +++++++++---- 7 files changed, 64 insertions(+), 8 deletions(-)
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index 6422682391..df19c6be1a 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -39,6 +39,7 @@ virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model) * the equivalent VIR_PCI_CONNECT_TYPE_*. */ switch (model) { + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: @@ -344,6 +345,9 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, bus->maxSlot = VIR_PCI_ADDRESS_SLOT_LAST; break;
+ case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + break; +
Unlike '-usb' for USB controllers, there is no -pci for pci controllers - we need to know the model at the time of building the command line.
Not having one set here is either an error in the user input or the part of our code that should have filled the model in. If we want to be robust, this should be grouped with the next case.
Yes, I've checked test and latter it fallthrough to _LAST works too
case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("PCI controller model was not set correctly")); @@ -1746,6 +1750,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont) return cont->opts.usbopts.ports; return 8;
+ case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: break;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 6c73cd7bfe..2a75a169c2 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 178ec24ae7..e114f5dfcf 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -4098,11 +4098,16 @@ qemuDomainCheckSCSIControllerModel(virQEMUCapsPtr qemuCaps, case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_AUTO: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VMPVSCSI: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported controller model: %s"), virDomainControllerModelSCSITypeToString(model)); return false; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SCSI controller model %d"), + model); + return false; }
return true;
[...]
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index e28119e4b1..de565dbf74 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -513,6 +513,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_USB: switch ((virDomainControllerModelUSB) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */
qemuDomainControllerDefPostParse should have filled this one in for most QEMU machine/capabilities combinations. If it's still at default at this point, we're going to use "-usb", which should be a PCI device.
Ok, that's a useful explanation. I'll use that as the comment.
+ return pciFlags; + case VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI: case VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI: return pcieFlags; @@ -540,6 +550,16 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: switch ((virDomainControllerModelSCSI) cont->model) { + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: + /* XXX it isn't clear that this is the right + * thing to do here. We probably ought to + * return 0, but that breaks test suite right + * now because we call this method before we + * have turned the _DEFAULT case into a + * specific choice + */ + return pciFlags; +
Slightly different: a default SCSI controller cannot be formatted unless we turn it into a model. qemuDomainSetSCSIControllerModel in qemuDomainControllerDefPostParse errors out if we have no QEMU capabilities, (which probably should be relaxed as it might break loading of existing domains if the QEMU binary is not present). But the test suite passes even with return 0, so the comment is misleading.
Yes, my bad I'll remove that. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

Ensure all enum cases are listed in switch statements. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/util/virconf.c | 13 ++++++++++++- src/util/virfirewall.c | 7 +++++-- src/util/virlog.c | 10 +++++++++- src/util/virnetdevvportprofile.c | 11 ++++++++++- 4 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/util/virconf.c b/src/util/virconf.c index a82a509ca3..af806dd735 100644 --- a/src/util/virconf.c +++ b/src/util/virconf.c @@ -296,7 +296,10 @@ virConfSaveValue(virBufferPtr buf, virConfValuePtr val) virBufferAddLit(buf, " ]"); break; } + case VIR_CONF_LAST: default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected conf value type %d"), val->type); return -1; } return 0; @@ -986,13 +989,21 @@ int virConfGetValueStringList(virConfPtr conf, } ATTRIBUTE_FALLTHROUGH; - default: + case VIR_CONF_LLONG: + case VIR_CONF_ULLONG: + case VIR_CONF_NONE: virReportError(VIR_ERR_INTERNAL_ERROR, compatString ? _("%s: expected a string or string list for '%s' parameter") : _("%s: expected a string list for '%s' parameter"), conf->filename, setting); return -1; + + case VIR_CONF_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected value type %d"), cval->type); + return -1; } return 1; diff --git a/src/util/virfirewall.c b/src/util/virfirewall.c index ff1bb83073..e7da482640 100644 --- a/src/util/virfirewall.c +++ b/src/util/virfirewall.c @@ -827,9 +827,12 @@ virFirewallApplyRule(virFirewallPtr firewall, if (virFirewallApplyRuleFirewallD(rule, ignoreErrors, &output) < 0) return -1; break; + + case VIR_FIREWALL_BACKEND_AUTOMATIC: + case VIR_FIREWALL_BACKEND_LAST: default: - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Unexpected firewall engine backend")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected firewall engine backend %d"), currentBackend); return -1; } diff --git a/src/util/virlog.c b/src/util/virlog.c index 4f66cc5e5c..ecbee71cfb 100644 --- a/src/util/virlog.c +++ b/src/util/virlog.c @@ -1206,10 +1206,18 @@ virLogGetOutputs(void) virLogDestinationTypeToString(dest), virLogOutputs[i]->name); break; - default: + case VIR_LOG_TO_STDERR: + case VIR_LOG_TO_JOURNALD: virBufferAsprintf(&outputbuf, "%d:%s", virLogOutputs[i]->priority, virLogDestinationTypeToString(dest)); + break; + case VIR_LOG_TO_OUTPUT_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected log output type %d"), dest); + virLogUnlock(); + return NULL; } } virLogUnlock(); diff --git a/src/util/virnetdevvportprofile.c b/src/util/virnetdevvportprofile.c index db495a7549..4c0a64e439 100644 --- a/src/util/virnetdevvportprofile.c +++ b/src/util/virnetdevvportprofile.c @@ -1071,6 +1071,9 @@ virNetDevVPortProfileOp8021Qbg(const char *ifname, case VIR_NETDEV_VPORT_PROFILE_LINK_OP_PREASSOCIATE: op = PORT_REQUEST_PREASSOCIATE; break; + case VIR_NETDEV_VPORT_PROFILE_LINK_OP_PREASSOCIATE_RR: + op = PORT_REQUEST_PREASSOCIATE_RR; + break; case VIR_NETDEV_VPORT_PROFILE_LINK_OP_ASSOCIATE: op = PORT_REQUEST_ASSOCIATE; break; @@ -1191,10 +1194,16 @@ virNetDevVPortProfileOp8021Qbh(const char *ifname, false); break; - default: + case VIR_NETDEV_VPORT_PROFILE_LINK_OP_PREASSOCIATE: virReportError(VIR_ERR_INTERNAL_ERROR, _("operation type %d not supported"), virtPortOp); rc = -1; + break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected operation type %d"), virtPortOp); + rc = -1; + break; } cleanup: -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements.
and in some cases force an error if something unexpected is found. [not necessary to add, especially since it's repeatable throughout the series so far, but figured I'd note it at least B-)]
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/util/virconf.c | 13 ++++++++++++- src/util/virfirewall.c | 7 +++++-- src/util/virlog.c | 10 +++++++++- src/util/virnetdevvportprofile.c | 11 ++++++++++- 4 files changed, 36 insertions(+), 5 deletions(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

On Thu, Feb 15, 2018 at 04:43:07PM +0000, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/util/virconf.c | 13 ++++++++++++- src/util/virfirewall.c | 7 +++++-- src/util/virlog.c | 10 +++++++++- src/util/virnetdevvportprofile.c | 11 ++++++++++- 4 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/src/util/virconf.c b/src/util/virconf.c index a82a509ca3..af806dd735 100644 --- a/src/util/virconf.c +++ b/src/util/virconf.c @@ -296,7 +296,10 @@ virConfSaveValue(virBufferPtr buf, virConfValuePtr val) virBufferAddLit(buf, " ]"); break; } + case VIR_CONF_LAST: default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected conf value type %d"), val->type); return -1;
All these errors are presumably dead code that we only keep around in case we broke something in other parts of the code. Do we need specific user-friendly translated errors? Since we log the function name as well, something like: "unhandled enum value %d" would do. Jan
} return 0;

On Tue, Feb 20, 2018 at 10:49:29AM +0100, Ján Tomko wrote:
On Thu, Feb 15, 2018 at 04:43:07PM +0000, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/util/virconf.c | 13 ++++++++++++- src/util/virfirewall.c | 7 +++++-- src/util/virlog.c | 10 +++++++++- src/util/virnetdevvportprofile.c | 11 ++++++++++- 4 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/src/util/virconf.c b/src/util/virconf.c index a82a509ca3..af806dd735 100644 --- a/src/util/virconf.c +++ b/src/util/virconf.c @@ -296,7 +296,10 @@ virConfSaveValue(virBufferPtr buf, virConfValuePtr val) virBufferAddLit(buf, " ]"); break; } + case VIR_CONF_LAST: default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected conf value type %d"), val->type); return -1;
All these errors are presumably dead code that we only keep around in case we broke something in other parts of the code.
Do we need specific user-friendly translated errors? Since we log the function name as well, something like: "unhandled enum value %d" would do.
The function name only gets into the logs - not the error reporting, so if someone does get an error raised, I don't want it to be a totally generic message that could come from literally anywhere in the codebase. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Tue, 2018-02-20 at 09:54 +0000, Daniel P. Berrangé wrote:
+ case VIR_CONF_LAST: default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected conf value type %d"), val->type); return -1;
All these errors are presumably dead code that we only keep around in case we broke something in other parts of the code.
Do we need specific user-friendly translated errors? Since we log the function name as well, something like: "unhandled enum value %d" would do.
The function name only gets into the logs - not the error reporting, so if someone does get an error raised, I don't want it to be a totally generic message that could come from literally anywhere in the codebase.
Yesterday I argued in a different thread that it would be better to include the enum name in the error message, since that's useful information for developers whereas users 1) should never see this kind of error to begin with and 2) when they do, their only course of action is reporting the issue anyway. -- Andrea Bolognani / Red Hat / Virtualization

On Tue, Feb 20, 2018 at 12:19:15PM +0100, Andrea Bolognani wrote:
On Tue, 2018-02-20 at 09:54 +0000, Daniel P. Berrangé wrote:
+ case VIR_CONF_LAST: default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected conf value type %d"), val->type); return -1;
All these errors are presumably dead code that we only keep around in case we broke something in other parts of the code.
Do we need specific user-friendly translated errors? Since we log the function name as well, something like: "unhandled enum value %d" would do.
The function name only gets into the logs - not the error reporting, so if someone does get an error raised, I don't want it to be a totally generic message that could come from literally anywhere in the codebase.
Yesterday I argued in a different thread that it would be better to include the enum name in the error message, since that's useful information for developers whereas users 1) should never see this kind of error to begin with and 2) when they do, their only course of action is reporting the issue anyway.
How about we standard it via a special API virReportErrorEnumRange(virDomainControllerModelUSB, val->type); and map this through to a VIR_ERR_ENUM_RANGE error code, with a fixed string format. "Value '%d' out of range for enum %s" Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On 02/20/2018 06:25 AM, Daniel P. Berrangé wrote:
On Tue, Feb 20, 2018 at 12:19:15PM +0100, Andrea Bolognani wrote:
On Tue, 2018-02-20 at 09:54 +0000, Daniel P. Berrangé wrote:
+ case VIR_CONF_LAST: default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected conf value type %d"), val->type); return -1;
All these errors are presumably dead code that we only keep around in case we broke something in other parts of the code.
Do we need specific user-friendly translated errors? Since we log the function name as well, something like: "unhandled enum value %d" would do.
The function name only gets into the logs - not the error reporting, so if someone does get an error raised, I don't want it to be a totally generic message that could come from literally anywhere in the codebase.
Yesterday I argued in a different thread that it would be better to include the enum name in the error message, since that's useful information for developers whereas users 1) should never see this kind of error to begin with and 2) when they do, their only course of action is reporting the issue anyway.
How about we standard it via a special API
virReportErrorEnumRange(virDomainControllerModelUSB, val->type);
and map this through to a VIR_ERR_ENUM_RANGE error code, with a fixed string format.
"Value '%d' out of range for enum %s"
Regards, Daniel
This works, but is it really necessary? Essentially for developers only? It's essentially a can't get there and val->type is either _LAST or some value outside the range of all possible values. The error messages I've seen for this throughout this series are generally the same "Unexpected XXX %d" as opposed to perhaps "Unsupported XXX ..." when values are within the range, but essentially wrong. The errors also used the INTERNAL_ERR code rather than UNSUPPORTED or XML_ERR, so I would believe it's really easy for even a semi-conscious developer to figure out. Whether the "Unexpected..." is provided has been on a function by function basis based on the knowledge of the code path and that for certain paths (such as Free functions) it makes no sense to print anything. Personally I find the consistency of using "Unexpected" better than value out of range. If the using some sort of an inline helper to ensure to record the line number of the calling function is more desired, then let's also create a new error code to really single it out. John (hopefully this all makes sense - only 1/2 cup of coffee in ;-))

On Tue, 2018-02-20 at 11:25 +0000, Daniel P. Berrangé wrote:
Yesterday I argued in a different thread that it would be better to include the enum name in the error message, since that's useful information for developers whereas users 1) should never see this kind of error to begin with and 2) when they do, their only course of action is reporting the issue anyway.
How about we standard it via a special API
virReportErrorEnumRange(virDomainControllerModelUSB, val->type);
and map this through to a VIR_ERR_ENUM_RANGE error code, with a fixed string format.
"Value '%d' out of range for enum %s"
Sounds like a good idea! We could even add something like This is a bug in libvirt, please report it. or similar to make it clear that the user is not at fault. Not sure about using a separate error code rather than the existing INTERNAL_ERROR, though: it seems like it would not really buy us anything. -- Andrea Bolognani / Red Hat / Virtualization

On Tue, Feb 20, 2018 at 01:05:23PM +0100, Andrea Bolognani wrote:
On Tue, 2018-02-20 at 11:25 +0000, Daniel P. Berrangé wrote:
Yesterday I argued in a different thread that it would be better to include the enum name in the error message, since that's useful information for developers whereas users 1) should never see this kind of error to begin with and 2) when they do, their only course of action is reporting the issue anyway.
How about we standard it via a special API
virReportErrorEnumRange(virDomainControllerModelUSB, val->type);
and map this through to a VIR_ERR_ENUM_RANGE error code, with a fixed string format.
"Value '%d' out of range for enum %s"
Sounds like a good idea! We could even add something like
This is a bug in libvirt, please report it.
or similar to make it clear that the user is not at fault.
I don't think we should go down that road - most errors are not the user's fault - they the fault of some component somewhere in the stack.
Not sure about using a separate error code rather than the existing INTERNAL_ERROR, though: it seems like it would not really buy us anything.
-- Andrea Bolognani / Red Hat / Virtualization
Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

Ensure all enum cases are listed in switch statements. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/domain_audit.c | 1 + src/conf/domain_conf.c | 47 +++++++++++++++++++++++++++++++++++++++++------ src/conf/nwfilter_conf.c | 32 +++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index 723c737363..82868bca76 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -586,6 +586,7 @@ virDomainAuditTPM(virDomainObjPtr vm, virDomainTPMDefPtr tpm, "virt=%s resrc=dev reason=%s %s uuid=%s %s", virt, reason, vmname, uuidstr, device); break; + case VIR_DOMAIN_TPM_TYPE_LAST: default: break; } diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index abc3332377..538dfc84bd 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -11565,8 +11565,21 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, def->filterparams = filterparams; filterparams = NULL; break; - default: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network type %d"), def->type); + goto error; } } @@ -14646,6 +14659,12 @@ virDomainVideoDefaultRAM(const virDomainDef *def, /* QEMU use 64M as the minimal video memory for qxl device */ return 64 * 1024; + case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: + case VIR_DOMAIN_VIDEO_TYPE_VBOX: + case VIR_DOMAIN_VIDEO_TYPE_PARALLELS: + case VIR_DOMAIN_VIDEO_TYPE_VIRTIO: + case VIR_DOMAIN_VIDEO_TYPE_GOP: + case VIR_DOMAIN_VIDEO_TYPE_LAST: default: return 0; } @@ -14680,6 +14699,16 @@ virDomainVideoDefaultType(const virDomainDef *def) return VIR_DOMAIN_VIDEO_TYPE_PARALLELS; case VIR_DOMAIN_VIRT_BHYVE: return VIR_DOMAIN_VIDEO_TYPE_GOP; + case VIR_DOMAIN_VIRT_QEMU: + case VIR_DOMAIN_VIRT_KQEMU: + case VIR_DOMAIN_VIRT_KVM: + case VIR_DOMAIN_VIRT_LXC: + case VIR_DOMAIN_VIRT_UML: + case VIR_DOMAIN_VIRT_OPENVZ: + case VIR_DOMAIN_VIRT_HYPERV: + case VIR_DOMAIN_VIRT_PHYP: + case VIR_DOMAIN_VIRT_NONE: + case VIR_DOMAIN_VIRT_LAST: default: return VIR_DOMAIN_VIDEO_TYPE_DEFAULT; } @@ -27780,7 +27809,7 @@ virDomainObjGetState(virDomainObjPtr dom, int *reason) void virDomainObjSetState(virDomainObjPtr dom, virDomainState state, int reason) { - int last = -1; + int last; switch (state) { case VIR_DOMAIN_NOSTATE: @@ -27807,11 +27836,8 @@ virDomainObjSetState(virDomainObjPtr dom, virDomainState state, int reason) case VIR_DOMAIN_PMSUSPENDED: last = VIR_DOMAIN_PMSUSPENDED_LAST; break; + case VIR_DOMAIN_LAST: default: - last = -1; - } - - if (last < 0) { VIR_ERROR(_("invalid domain state: %d"), state); return; } @@ -27975,6 +28001,15 @@ virDomainNetGetActualVirtPortProfile(virDomainNetDefPtr iface) default: return NULL; } + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_ETHERNET: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_LAST: default: return NULL; } diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c index 5d6423e060..9e8c725f9f 100644 --- a/src/conf/nwfilter_conf.c +++ b/src/conf/nwfilter_conf.c @@ -2153,8 +2153,35 @@ virNWFilterRuleValidate(virNWFilterRuleDefPtr rule) } } break; - default: + case VIR_NWFILTER_RULE_PROTOCOL_NONE: + case VIR_NWFILTER_RULE_PROTOCOL_MAC: + case VIR_NWFILTER_RULE_PROTOCOL_VLAN: + case VIR_NWFILTER_RULE_PROTOCOL_STP: + case VIR_NWFILTER_RULE_PROTOCOL_ARP: + case VIR_NWFILTER_RULE_PROTOCOL_RARP: + case VIR_NWFILTER_RULE_PROTOCOL_TCP: + case VIR_NWFILTER_RULE_PROTOCOL_ICMP: + case VIR_NWFILTER_RULE_PROTOCOL_IGMP: + case VIR_NWFILTER_RULE_PROTOCOL_UDP: + case VIR_NWFILTER_RULE_PROTOCOL_UDPLITE: + case VIR_NWFILTER_RULE_PROTOCOL_ESP: + case VIR_NWFILTER_RULE_PROTOCOL_AH: + case VIR_NWFILTER_RULE_PROTOCOL_SCTP: + case VIR_NWFILTER_RULE_PROTOCOL_ALL: + case VIR_NWFILTER_RULE_PROTOCOL_TCPoIPV6: + case VIR_NWFILTER_RULE_PROTOCOL_ICMPV6: + case VIR_NWFILTER_RULE_PROTOCOL_UDPoIPV6: + case VIR_NWFILTER_RULE_PROTOCOL_UDPLITEoIPV6: + case VIR_NWFILTER_RULE_PROTOCOL_ESPoIPV6: + case VIR_NWFILTER_RULE_PROTOCOL_AHoIPV6: + case VIR_NWFILTER_RULE_PROTOCOL_SCTPoIPV6: + case VIR_NWFILTER_RULE_PROTOCOL_ALLoIPV6: break; + case VIR_NWFILTER_RULE_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected nwfilter protocol %d"), rule->prtclType); + return -1; } return ret; @@ -3064,7 +3091,10 @@ virNWFilterRuleDefDetailsFormat(virBufferPtr buf, virBufferAddLit(buf, "false"); break; + case DATATYPE_IPSETNAME: + case DATATYPE_IPSETFLAGS: case DATATYPE_STRING: + case DATATYPE_LAST: default: virBufferAsprintf(buf, "UNSUPPORTED DATATYPE 0x%02x\n", -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/domain_audit.c | 1 + src/conf/domain_conf.c | 47 +++++++++++++++++++++++++++++++++++++++++------ src/conf/nwfilter_conf.c | 32 +++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 7 deletions(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements, or explicitly cast away enum type where we don't want to list all cases. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/esx/esx_driver.c | 1 + src/esx/esx_vi.c | 11 +++++++---- src/esx/esx_vi_types.c | 9 +++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index f575362059..c5f04efa81 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3603,6 +3603,7 @@ esxDomainGetSchedulerParametersFlags(virDomainPtr domain, params[i].value.i = -3; break; + case esxVI_SharesLevel_Undefined: default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Shares level has unknown value %d"), diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index edf52ff828..103f726069 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -483,7 +483,7 @@ esxVI_SharedCURL_Lock(CURL *handle ATTRIBUTE_UNUSED, curl_lock_data data, size_t i; esxVI_SharedCURL *shared = userptr; - switch (data) { + switch ((int)data) { case CURL_LOCK_DATA_SHARE: i = 0; break; @@ -511,7 +511,7 @@ esxVI_SharedCURL_Unlock(CURL *handle ATTRIBUTE_UNUSED, curl_lock_data data, size_t i; esxVI_SharedCURL *shared = userptr; - switch (data) { + switch ((int)data) { case CURL_LOCK_DATA_SHARE: i = 0; break; @@ -1563,6 +1563,7 @@ esxVI_Context_Execute(esxVI_Context *ctx, const char *methodName, break; + case esxVI_Occurrence_Undefined: default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument (occurrence)")); @@ -2280,9 +2281,11 @@ esxVI_LookupObjectContentByType(esxVI_Context *ctx, type, root->type); break; + case esxVI_Occurrence_None: + case esxVI_Occurrence_Undefined: default: - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Invalid occurrence value")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Invalid occurrence value %d"), occurrence); break; } diff --git a/src/esx/esx_vi_types.c b/src/esx/esx_vi_types.c index be35af861c..74183f8307 100644 --- a/src/esx/esx_vi_types.c +++ b/src/esx/esx_vi_types.c @@ -544,7 +544,7 @@ VIR_LOG_INIT("esx.esx_vi_types"); #define ESX_VI__TEMPLATE__DISPATCH(_actual_type, _actual_type_name, __type, \ _dispatch, _error_return) \ - switch (_actual_type) { \ + switch ((int)_actual_type) { \ _dispatch \ \ case esxVI_Type_##__type: \ @@ -690,7 +690,7 @@ VIR_LOG_INIT("esx.esx_vi_types"); return -1; \ } \ \ - switch (type) { \ + switch ((int)type) { \ _dispatch \ \ case esxVI_Type_##__type: \ @@ -967,7 +967,7 @@ esxVI_AnyType_DeepCopy(esxVI_AnyType **dest, esxVI_AnyType *src) goto failure; } - switch (src->type) { + switch ((int)src->type) { case esxVI_Type_Boolean: (*dest)->boolean = src->boolean; break; @@ -1071,7 +1071,7 @@ esxVI_AnyType_Deserialize(xmlNodePtr node, esxVI_AnyType **anyType) (*anyType)->_name = number; \ } while (0) - switch ((*anyType)->type) { + switch ((int)(*anyType)->type) { case esxVI_Type_Boolean: if (STREQ((*anyType)->value, "true")) { (*anyType)->boolean = esxVI_Boolean_True; @@ -1876,6 +1876,7 @@ esxVI_VirtualMachinePowerState_ConvertToLibvirt case esxVI_VirtualMachinePowerState_Suspended: return VIR_DOMAIN_PAUSED; + case esxVI_VirtualMachinePowerState_Undefined: default: return VIR_DOMAIN_NOSTATE; } -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements, or explicitly cast away enum type where we don't want to list all cases.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/esx/esx_driver.c | 1 + src/esx/esx_vi.c | 11 +++++++---- src/esx/esx_vi_types.c | 9 +++++---- 3 files changed, 13 insertions(+), 8 deletions(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements. This improves debug logging integration with openwsman. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/hyperv/hyperv_driver.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/hyperv/hyperv_driver.c b/src/hyperv/hyperv_driver.c index ee94fd3511..e512b626ea 100644 --- a/src/hyperv/hyperv_driver.c +++ b/src/hyperv/hyperv_driver.c @@ -1656,13 +1656,27 @@ hypervDebugHandler(const char *message, debug_level_e level, switch (level) { case DEBUG_LEVEL_ERROR: case DEBUG_LEVEL_CRITICAL: - VIR_ERROR(_("openwsman error: %s"), message); + case DEBUG_LEVEL_ALWAYS: + VIR_ERROR(_("openwsman: %s"), message); break; case DEBUG_LEVEL_WARNING: - VIR_WARN("openwsman warning: %s", message); + VIR_WARN("openwsman: %s", message); break; + case DEBUG_LEVEL_MESSAGE: + VIR_INFO("openwsman: %s", message); + break; + + case DEBUG_LEVEL_INFO: + VIR_INFO("openwsman: %s", message); + break; + + case DEBUG_LEVEL_DEBUG: + VIR_DEBUG("openwsman: %s", message); + break; + + case DEBUG_LEVEL_NONE: default: /* Ignore the rest */ break; -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements. This improves debug logging integration with openwsman.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/hyperv/hyperv_driver.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Cast away enum type for libxl schedular constants since we don't want to cover all of them and don't want build to break when new ones are added. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libxl/libxl_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index be11134fb2..4b52de36f5 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -4497,7 +4497,7 @@ libxlDomainGetSchedulerType(virDomainPtr dom, int *nparams) if (nparams) *nparams = 0; - switch (sched_id) { + switch ((int)sched_id) { case LIBXL_SCHEDULER_SEDF: name = "sedf"; break; -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Cast away enum type for libxl schedular constants since we don't want to cover all of them and don't want build to break when new ones are added.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libxl/libxl_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements, or cast away enum type in places where we don't wish to cover all cases. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/lxc/lxc_container.c | 7 ++++--- src/lxc/lxc_controller.c | 10 +++++++++- src/lxc/lxc_driver.c | 40 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c index 96fceaf1b8..ec641c3cab 100644 --- a/src/lxc/lxc_container.c +++ b/src/lxc/lxc_container.c @@ -2035,7 +2035,7 @@ static int lxcContainerDropCapabilities(virDomainDefPtr def, break; case VIR_DOMAIN_CAPABILITIES_POLICY_DEFAULT: - switch ((virDomainCapsFeature) i) { + switch (i) { case VIR_DOMAIN_CAPS_FEATURE_SYS_BOOT: /* No use of reboot */ toDrop = !keepReboot && (state != VIR_TRISTATE_SWITCH_ON); break; @@ -2066,10 +2066,11 @@ static int lxcContainerDropCapabilities(virDomainDefPtr def, } break; + case VIR_DOMAIN_CAPABILITIES_POLICY_LAST: default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("Unsupported capabilities policy: %s"), - virDomainCapabilitiesPolicyTypeToString(policy)); + _("Unsupported capabilities policy: %d"), + policy); } } diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index c5e67df938..f9f26570cd 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -395,8 +395,16 @@ static int virLXCControllerGetNICIndexes(virLXCControllerPtr ctrl) case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported net type %s"), + virDomainNetTypeToString(ctrl->def->nets[i]->type)); + goto cleanup; + case VIR_DOMAIN_NET_TYPE_LAST: default: - break; + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unexpected net type %d"), + ctrl->def->nets[i]->type); + goto cleanup; } } diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 961baa344c..7d6568cdf8 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3968,10 +3968,22 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn, if (!(veth = virLXCProcessSetupInterfaceDirect(conn, vm->def, net))) goto cleanup; } break; - default: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Network device type is not supported")); goto cleanup; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } /* Set bandwidth or warn if requested and not supported. */ actualBandwidth = virDomainNetGetActualBandwidth(net); @@ -4011,6 +4023,15 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn, ignore_value(virNetDevMacVLanDelete(veth)); break; + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_LAST: default: /* no-op */ break; @@ -4446,13 +4467,24 @@ lxcDomainDetachDeviceNetLive(virDomainObjPtr vm, * the host side. Further the container can change * the mac address of NIC name, so we can't easily * find out which guest NIC it maps to + */ case VIR_DOMAIN_NET_TYPE_DIRECT: - */ - - default: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Only bridged veth devices can be detached")); goto cleanup; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } virDomainAuditNet(vm, detach, NULL, "detach", true); -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements, or cast away enum type in places where we don't wish to cover all cases.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/lxc/lxc_container.c | 7 ++++--- src/lxc/lxc_controller.c | 10 +++++++++- src/lxc/lxc_driver.c | 40 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 49 insertions(+), 8 deletions(-)
[...]
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 961baa344c..7d6568cdf8 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -3968,10 +3968,22 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn, if (!(veth = virLXCProcessSetupInterfaceDirect(conn, vm->def, net))) goto cleanup; } break; - default: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Network device type is not supported")); goto cleanup; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } /* Set bandwidth or warn if requested and not supported. */ actualBandwidth = virDomainNetGetActualBandwidth(net); @@ -4011,6 +4023,15 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn, ignore_value(virNetDevMacVLanDelete(veth)); break;
+ case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_LAST: default: /* no-op */ break;
Something Coverity noted long ago, but I've just held onto the patch... At this point (e.g. when ret != 0 in cleanup:), @veth can only defined if DIRECT, BRIDGE, NETWORK, or ETHERNET, so it's not happy with the switch and cases. The way I worked around this in Coverity was: if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) ignore_value(virNetDevMacVLanDelete(veth)); else /* BRIDGE, NETWORK, ETHERNET */ ignore_value(virNetDevVethDelete(veth)); I don't think that's perfect either, but it sufficed. IDC if you keep the code as is, but figured I'd note it.
@@ -4446,13 +4467,24 @@ lxcDomainDetachDeviceNetLive(virDomainObjPtr vm,
Since they'd all be included here - if you adjust the comment to indicate "It'd be nice to support DIRECT" instead of just "this" (or somehow indicate that DIRECT is possible, but the others really aren't).
* the host side. Further the container can change * the mac address of NIC name, so we can't easily * find out which guest NIC it maps to + */ case VIR_DOMAIN_NET_TYPE_DIRECT: - */ - - default: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Only bridged veth devices can be detached")); goto cleanup;
[...] I'll leave it up to you for deciding on the comment above... Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements, or cast away enum type in places where we don't wish to cover all cases. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/nwfilter/nwfilter_ebiptables_driver.c | 16 +++++++++++----- src/nwfilter/nwfilter_learnipaddr.c | 6 +++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/nwfilter/nwfilter_ebiptables_driver.c b/src/nwfilter/nwfilter_ebiptables_driver.c index b8682a1130..c624337f4d 100644 --- a/src/nwfilter/nwfilter_ebiptables_driver.c +++ b/src/nwfilter/nwfilter_ebiptables_driver.c @@ -320,11 +320,17 @@ _printDataType(virNWFilterVarCombIterPtr vars, VIR_FREE(flags); break; + case DATATYPE_STRING: + case DATATYPE_STRINGCOPY: + case DATATYPE_BOOLEAN: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Cannot print data type %x"), item->datatype); + return -1; + case DATATYPE_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unhandled datatype %x"), item->datatype); + _("Unexpected datatype %x"), item->datatype); return -1; - break; } return 0; @@ -1183,7 +1189,7 @@ _iptablesCreateRuleInstance(virFirewallPtr fw, PRINT_IPT_ROOT_CHAIN(chain, chainPrefix, ifname); - switch (rule->prtclType) { + switch ((int)rule->prtclType) { case VIR_NWFILTER_RULE_PROTOCOL_TCP: case VIR_NWFILTER_RULE_PROTOCOL_TCPoIPV6: fwrule = virFirewallAddRule(fw, layer, @@ -1873,7 +1879,7 @@ ebtablesCreateRuleInstance(virFirewallPtr fw, #define INST_ITEM_MASK(S, I, MASK, C) \ INST_ITEM_2PARMS(S, I, MASK, C, "/") - switch (rule->prtclType) { + switch ((int)rule->prtclType) { case VIR_NWFILTER_RULE_PROTOCOL_MAC: fwrule = virFirewallAddRule(fw, VIR_FIREWALL_LAYER_ETHERNET, "-t", "nat", @@ -2677,7 +2683,7 @@ ebtablesCreateTmpSubChainFW(virFirewallPtr fw, fwrule = virFirewallAddRule(fw, VIR_FIREWALL_LAYER_ETHERNET, "-t", "nat", "-A", rootchain, NULL); - switch (protoidx) { + switch ((int)protoidx) { case L2_PROTO_MAC_IDX: break; case L2_PROTO_STP_IDX: diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c index 5b95f0e613..9ca0639576 100644 --- a/src/nwfilter/nwfilter_learnipaddr.c +++ b/src/nwfilter/nwfilter_learnipaddr.c @@ -430,7 +430,7 @@ learnIPAddressThread(void *arg) } virBufferAddLit(&buf, "src port 67 and dst port 68"); break; - default: + case DETECT_STATIC: if (techdriver->applyBasicRules(req->ifname, &req->macaddr) < 0) { req->status = EINVAL; @@ -438,6 +438,10 @@ learnIPAddressThread(void *arg) } virBufferAsprintf(&buf, "ether host %s or ether dst ff:ff:ff:ff:ff:ff", macaddr); + break; + default: + req->status = EINVAL; + goto done; } if (virBufferError(&buf)) { -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements, or cast away enum type in places where we don't wish to cover all cases.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/nwfilter/nwfilter_ebiptables_driver.c | 16 +++++++++++----- src/nwfilter/nwfilter_learnipaddr.c | 6 +++++- 2 files changed, 16 insertions(+), 6 deletions(-)
[...]
diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c index 5b95f0e613..9ca0639576 100644 --- a/src/nwfilter/nwfilter_learnipaddr.c +++ b/src/nwfilter/nwfilter_learnipaddr.c @@ -430,7 +430,7 @@ learnIPAddressThread(void *arg) } virBufferAddLit(&buf, "src port 67 and dst port 68"); break; - default: + case DETECT_STATIC: if (techdriver->applyBasicRules(req->ifname, &req->macaddr) < 0) { req->status = EINVAL; @@ -438,6 +438,10 @@ learnIPAddressThread(void *arg) } virBufferAsprintf(&buf, "ether host %s or ether dst ff:ff:ff:ff:ff:ff", macaddr); + break; + default: + req->status = EINVAL; + goto done;
Could add a VIR_DEBUG() in this just to "track" the reason it was EINVAL since there's so many ways it could be EINVAL, not that important...
}
if (virBufferError(&buf)) {
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements, or cast away enum type in places where we don't wish to cover all cases. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/qemu/qemu_command.c | 28 ++++++++++++++++++++-------- src/qemu/qemu_domain.c | 21 +++++++++++++++++++++ src/qemu/qemu_driver.c | 27 +++++++++++++++++++-------- src/qemu/qemu_hotplug.c | 36 +++++++++++++++++++++++++++++++----- src/qemu/qemu_migration.c | 11 ++++++++++- src/qemu/qemu_process.c | 2 ++ 6 files changed, 103 insertions(+), 22 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 2a75a169c2..33ca1e0960 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2634,7 +2634,7 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: switch ((virDomainControllerModelSCSI) def->model) { case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI: - switch ((virDomainDeviceAddressType) address_type) { + switch (address_type) { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: virBufferAddLit(&buf, "virtio-scsi-ccw"); break; @@ -2686,7 +2686,7 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, break; case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: - switch ((virDomainDeviceAddressType) address_type) { + switch (address_type) { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI: virBufferAddLit(&buf, "virtio-serial-pci"); break; @@ -3400,12 +3400,18 @@ qemuBuildNicDevStr(virDomainDefPtr def, case VIR_DOMAIN_NET_VIRTIO_TX_MODE_TIMER: virBufferAddLit(&buf, "timer"); break; + + case VIR_DOMAIN_NET_VIRTIO_TX_MODE_DEFAULT: + break; + + case VIR_DOMAIN_NET_VIRTIO_TX_MODE_LAST: default: /* this should never happen, if it does, we need * to add another case to this switch. */ - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("unrecognized virtio-net-pci 'tx' option")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected NIC tx mode %d"), + net->driver.virtio.txmode); goto error; } } else { @@ -6540,7 +6546,7 @@ qemuBuildGlobalControllerCommandLine(virCommandPtr cmd, bool cap = false; bool machine = false; - switch ((virDomainControllerModelPCI) cont->model) { + switch (cont->model) { case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: hoststr = "i440FX-pcihost"; cap = virQEMUCapsGet(qemuCaps, QEMU_CAPS_I440FX_PCI_HOLE64_SIZE); @@ -6883,7 +6889,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd, if (cpu_flags && !cpu) { const char *default_model; - switch (def->os.arch) { + switch ((int)def->os.arch) { case VIR_ARCH_I686: default_model = "qemu32"; break; @@ -6929,7 +6935,7 @@ qemuBuildObsoleteAccelArg(virCommandPtr cmd, bool disableKVM = false; bool enableKVM = false; - switch (def->virtType) { + switch ((int)def->virtType) { case VIR_DOMAIN_VIRT_QEMU: if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) disableKVM = true; @@ -7903,8 +7909,14 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg, case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_CLIENT: virBufferAddLit(&opt, "agent-mouse=on,"); break; - default: + case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_DEFAULT: break; + case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected mouse mode %d"), + graphics->data.spice.mousemode); + goto error; } } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e114f5dfcf..7697de69e4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2806,6 +2806,27 @@ qemuDomainDefAddDefaultDevices(virDomainDefPtr def, addPCIRoot = true; break; + case VIR_ARCH_ARMV6L: + case VIR_ARCH_ARMV7B: + case VIR_ARCH_CRIS: + case VIR_ARCH_ITANIUM: + case VIR_ARCH_LM32: + case VIR_ARCH_M68K: + case VIR_ARCH_MICROBLAZE: + case VIR_ARCH_MICROBLAZEEL: + case VIR_ARCH_MIPS: + case VIR_ARCH_MIPSEL: + case VIR_ARCH_MIPS64: + case VIR_ARCH_MIPS64EL: + case VIR_ARCH_OR32: + case VIR_ARCH_PARISC: + case VIR_ARCH_PARISC64: + case VIR_ARCH_PPCLE: + case VIR_ARCH_UNICORE32: + case VIR_ARCH_XTENSA: + case VIR_ARCH_XTENSAEB: + case VIR_ARCH_NONE: + case VIR_ARCH_LAST: default: break; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index bbce5bd81b..0b8976010f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3041,13 +3041,8 @@ qemuCompressGetCommand(virQEMUSaveFormat compression) ret = virCommandNew(prog); virCommandAddArg(ret, "-dc"); - switch (compression) { - case QEMU_SAVE_FORMAT_LZOP: + if (compression == QEMU_SAVE_FORMAT_LZOP) virCommandAddArg(ret, "--ignore-warn"); - break; - default: - break; - } return ret; } @@ -17820,11 +17815,19 @@ qemuDomainOpenGraphics(virDomainPtr dom, case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: protocol = "spice"; break; - default: + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Can only open VNC or SPICE graphics backends, not %s"), virDomainGraphicsTypeToString(vm->def->graphics[idx]->type)); goto endjob; + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), + vm->def->graphics[idx]->type); + goto endjob; } if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) < 0) @@ -17884,11 +17887,19 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom, case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: protocol = "spice"; break; - default: + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Can only open VNC or SPICE graphics backends, not %s"), virDomainGraphicsTypeToString(vm->def->graphics[idx]->type)); goto cleanup; + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), + vm->def->graphics[idx]->type); + goto cleanup; } if (qemuSecuritySetSocketLabel(driver->securityManager, vm->def) < 0) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index c9868de778..0d7d02c25b 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2992,11 +2992,25 @@ qemuDomainChangeNetFilter(virDomainObjPtr vm, case VIR_DOMAIN_NET_TYPE_BRIDGE: case VIR_DOMAIN_NET_TYPE_NETWORK: break; - default: + case VIR_DOMAIN_NET_TYPE_USER: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("filters not supported on interfaces of type %s"), virDomainNetTypeToString(virDomainNetGetActualType(newdev))); return -1; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), + virDomainNetGetActualType(newdev)); + return -1; } virDomainConfNWFilterTeardown(olddev); @@ -3291,12 +3305,17 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, /* all handled in common code directly below this switch */ break; - default: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("unable to change config on '%s' network type"), virDomainNetTypeToString(newdev->type)); - break; - + goto cleanup; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), newdev->type); + goto cleanup; } } else { /* interface type has changed. There are a few special cases @@ -3675,10 +3694,17 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, } break; - default: + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: virReportError(VIR_ERR_INTERNAL_ERROR, _("unable to change config on '%s' graphics type"), type); break; + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), dev->type); + break; } cleanup: diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3641b801f6..fe3342b38d 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1437,11 +1437,20 @@ qemuMigrationJobName(virDomainObjPtr vm) switch (priv->job.asyncJob) { case QEMU_ASYNC_JOB_MIGRATION_OUT: - return _("migration job"); + return _("migration out job"); case QEMU_ASYNC_JOB_SAVE: return _("domain save job"); case QEMU_ASYNC_JOB_DUMP: return _("domain core dump job"); + case QEMU_ASYNC_JOB_NONE: + return _("no job"); + case QEMU_ASYNC_JOB_MIGRATION_IN: + return _("migration in job"); + case QEMU_ASYNC_JOB_SNAPSHOT: + return _("snapshot job"); + case QEMU_ASYNC_JOB_START: + return _("start job"); + case QEMU_ASYNC_JOB_LAST: default: return _("job"); } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 10211de871..b86ecda93f 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -690,6 +690,8 @@ qemuProcessHandleShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED, detail = VIR_DOMAIN_EVENT_SHUTDOWN_HOST; break; + case VIR_TRISTATE_BOOL_ABSENT: + case VIR_TRISTATE_BOOL_LAST: default: detail = VIR_DOMAIN_EVENT_SHUTDOWN_FINISHED; break; -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements, or cast away enum type in places where we don't wish to cover all cases.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/qemu/qemu_command.c | 28 ++++++++++++++++++++-------- src/qemu/qemu_domain.c | 21 +++++++++++++++++++++ src/qemu/qemu_driver.c | 27 +++++++++++++++++++-------- src/qemu/qemu_hotplug.c | 36 +++++++++++++++++++++++++++++++----- src/qemu/qemu_migration.c | 11 ++++++++++- src/qemu/qemu_process.c | 2 ++ 6 files changed, 103 insertions(+), 22 deletions(-)
[...]
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3641b801f6..fe3342b38d 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1437,11 +1437,20 @@ qemuMigrationJobName(virDomainObjPtr vm)
switch (priv->job.asyncJob) { case QEMU_ASYNC_JOB_MIGRATION_OUT: - return _("migration job"); + return _("migration out job"); case QEMU_ASYNC_JOB_SAVE: return _("domain save job"); case QEMU_ASYNC_JOB_DUMP: return _("domain core dump job"); + case QEMU_ASYNC_JOB_NONE: + return _("no job");
Can this be "undefined" instead of "no"? Looking at the caller you could get output such as "operation failed: no job: %s" where %s could be "is not active", "unexpectedly failed", "canceled by client", or "failed due to I/O error" Could also jus lump it in with LAST and default.
+ case QEMU_ASYNC_JOB_MIGRATION_IN: + return _("migration in job"); + case QEMU_ASYNC_JOB_SNAPSHOT: + return _("snapshot job"); + case QEMU_ASYNC_JOB_START: + return _("start job"); + case QEMU_ASYNC_JOB_LAST: default: return _("job"); }
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/rpc/virnetclient.c | 2 ++ src/rpc/virnetclientprogram.c | 1 + src/rpc/virnetserverprogram.c | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index 8aeacf8774..0c8d58c32c 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -1287,6 +1287,8 @@ virNetClientCallDispatch(virNetClientPtr client) case VIR_NET_STREAM_HOLE: /* Sparse stream protocol*/ return virNetClientCallDispatchStream(client); + case VIR_NET_CALL: + case VIR_NET_CALL_WITH_FDS: default: virReportError(VIR_ERR_RPC, _("got unexpected RPC call prog %d vers %d proc %d type %d"), diff --git a/src/rpc/virnetclientprogram.c b/src/rpc/virnetclientprogram.c index d81a055424..505b40fc4b 100644 --- a/src/rpc/virnetclientprogram.c +++ b/src/rpc/virnetclientprogram.c @@ -384,6 +384,7 @@ int virNetClientProgramCall(virNetClientProgramPtr prog, virNetClientProgramDispatchError(prog, msg); goto error; + case VIR_NET_CONTINUE: default: virReportError(VIR_ERR_RPC, _("Unexpected message status %d"), msg->header.status); diff --git a/src/rpc/virnetserverprogram.c b/src/rpc/virnetserverprogram.c index 557651ffbd..75b0052cdb 100644 --- a/src/rpc/virnetserverprogram.c +++ b/src/rpc/virnetserverprogram.c @@ -324,6 +324,10 @@ int virNetServerProgramDispatch(virNetServerProgramPtr prog, ret = 0; break; + case VIR_NET_REPLY: + case VIR_NET_REPLY_WITH_FDS: + case VIR_NET_MESSAGE: + case VIR_NET_STREAM_HOLE: default: virReportError(VIR_ERR_RPC, _("Unexpected message type %u"), -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/rpc/virnetclient.c | 2 ++ src/rpc/virnetclientprogram.c | 1 + src/rpc/virnetserverprogram.c | 4 ++++ 3 files changed, 7 insertions(+)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/security/security_driver.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/security/security_driver.c b/src/security/security_driver.c index 4800d5255a..a845dc7995 100644 --- a/src/security/security_driver.c +++ b/src/security/security_driver.c @@ -82,6 +82,7 @@ virSecurityDriverPtr virSecurityDriverLookup(const char *name, } break; + case SECURITY_DRIVER_ERROR: default: return NULL; } -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/security/security_driver.c | 1 + 1 file changed, 1 insertion(+)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Ensure all enum cases are listed in switch statements. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/vmx/vmx.c | 27 +++++++++++++++++++++++++-- src/xenconfig/xen_common.c | 17 +++++++++++++++-- src/xenconfig/xen_xl.c | 8 +++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 7a749f93ab..5855a11c88 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -3283,11 +3283,19 @@ virVMXFormatConfig(virVMXContext *ctx, virDomainXMLOptionPtr xmlopt, virDomainDe break; - default: + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported graphics type '%s'"), virDomainGraphicsTypeToString(def->graphics[i]->type)); goto cleanup; + + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), def->graphics[i]->type); } } @@ -3782,10 +3790,25 @@ virVMXFormatEthernet(virDomainNetDefPtr def, int controller, controller); break; - default: + case VIR_DOMAIN_NET_TYPE_ETHERNET: + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_NETWORK: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type '%s'"), virDomainNetTypeToString(def->type)); return -1; + + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network type %d"), def->type); + return -1; } /* def:mac -> vmx:addressType, vmx:(generated)Address, vmx:checkMACAddress */ diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index ca3b4dee6a..c3fe5d39dc 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -1258,10 +1258,23 @@ xenFormatNet(virConnectPtr conn, } break; + case VIR_DOMAIN_NET_TYPE_VHOSTUSER: + case VIR_DOMAIN_NET_TYPE_SERVER: + case VIR_DOMAIN_NET_TYPE_CLIENT: + case VIR_DOMAIN_NET_TYPE_MCAST: + case VIR_DOMAIN_NET_TYPE_INTERNAL: + case VIR_DOMAIN_NET_TYPE_DIRECT: + case VIR_DOMAIN_NET_TYPE_HOSTDEV: + case VIR_DOMAIN_NET_TYPE_UDP: + case VIR_DOMAIN_NET_TYPE_USER: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported net type '%s'"), + virDomainNetTypeToString(net->type)); + goto cleanup; + + case VIR_DOMAIN_NET_TYPE_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("unsupported network type %d"), - net->type); + _("Unexpected network type %d"), net->type); goto cleanup; } diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index 2ef80eb83a..e61784aff2 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -1641,8 +1641,14 @@ xenFormatXLSpice(virConfPtr conf, virDomainDefPtr def) if (xenConfigSetInt(conf, "spicevdagent", 1) < 0) return -1; break; - default: + case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_DEFAULT: break; + case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected mouse mode %d"), + graphics->data.spice.mousemode); + return -1; } } -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Ensure all enum cases are listed in switch statements.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/vmx/vmx.c | 27 +++++++++++++++++++++++++-- src/xenconfig/xen_common.c | 17 +++++++++++++++-- src/xenconfig/xen_xl.c | 8 +++++++- 3 files changed, 47 insertions(+), 5 deletions(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

Cast away enum type in places where we don't wish to cover all cases. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- tools/virt-host-validate-qemu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/virt-host-validate-qemu.c b/tools/virt-host-validate-qemu.c index 2aa396e3ab..d7573ea8b3 100644 --- a/tools/virt-host-validate-qemu.c +++ b/tools/virt-host-validate-qemu.c @@ -33,13 +33,14 @@ int virHostValidateQEMU(void) int ret = 0; bool hasHwVirt = false; bool hasVirtFlag = false; + virArch arch = virArchFromHost(); const char *kvmhint = _("Check that CPU and firmware supports virtualization " "and kvm module is loaded"); if (!(flags = virHostValidateGetCPUFlags())) return -1; - switch (virArchFromHost()) { + switch ((int)arch) { case VIR_ARCH_I686: case VIR_ARCH_X86_64: hasVirtFlag = true; -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Cast away enum type in places where we don't wish to cover all cases.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- tools/virt-host-validate-qemu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

As a general rule any time we switch() on something that is an enum, we want to have a case for every enum constant. The -Wswitch warning will report any switch where we've violated this rule, except if that switch has a default case. Unfortunately it is reasonable to want to list all enum constants *and* also have a default case. To get a warning in that scenario requires that we turn on -Wswitch-enum. In a few cases where we explicitly don't want to list all enum cases, we can discard the enum type checking by casting the value to a plain int. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- m4/virt-compile-warnings.m4 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4 index b9c9748420..918764d362 100644 --- a/m4/virt-compile-warnings.m4 +++ b/m4/virt-compile-warnings.m4 @@ -47,8 +47,6 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ dontwarn="$dontwarn -Wlong-long" # We allow manual list of all enum cases without default: dontwarn="$dontwarn -Wswitch-default" - # We allow optional default: instead of listing all enum values - dontwarn="$dontwarn -Wswitch-enum" # Not a problem since we don't use -fstrict-overflow dontwarn="$dontwarn -Wstrict-overflow" # Not a problem since we don't use -funsafe-loop-optimizations @@ -182,6 +180,11 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ # that one off, so we need to manually enable this again wantwarn="$wantwarn -Wjump-misses-init" + # GNULIB explicitly filters it out, preferring -Wswitch + # but that doesn't report missing enums if a default: + # is present. + wantwarn="$wantwarn -Wswitch-enum" + # GNULIB turns on -Wformat=2 which implies -Wformat-nonliteral, # so we need to manually re-exclude it. Also, older gcc 4.2 # added an implied ATTRIBUTE_NONNULL on any parameter marked -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
As a general rule any time we switch() on something that is an enum, we want to have a case for every enum constant. The -Wswitch warning will report any switch where we've violated this rule, except if that switch has a default case.
Unfortunately it is reasonable to want to list all enum constants *and* also have a default case. To get a warning in that scenario requires that we turn on -Wswitch-enum.
In a few cases where we explicitly don't want to list all enum cases, we can discard the enum type checking by casting the value to a plain int.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- m4/virt-compile-warnings.m4 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
Reviewed-by: John Ferlan <jferlan@redhat.com> John

The -Wextra flag bundle gained a new warning -Wcast-function-type. This complains if you cast between two function prototypes where the number of parameters or their data types are not compatible. Unfortunately we need such "bad" function casts for our event callbacks. It is possible to silence the warning by first casting to the generic "void (*)(void)" function prototype, but that is rather ugly to add throughout libvirt code. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- m4/virt-compile-warnings.m4 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4 index 918764d362..fc185aef38 100644 --- a/m4/virt-compile-warnings.m4 +++ b/m4/virt-compile-warnings.m4 @@ -175,6 +175,8 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ # with gl_MANYWARN_COMPLEMENT # So we have -W enabled, and then have to explicitly turn off... wantwarn="$wantwarn -Wno-sign-compare" + # We do "bad" function casts all the time for event callbacks + wantwarn="$wantwarn -Wno-cast-function-type" # GNULIB expects this to be part of -Wc++-compat, but we turn # that one off, so we need to manually enable this again -- 2.14.3

On Thu, Feb 15, 2018 at 04:43:20PM +0000, Daniel P. Berrangé wrote:
The -Wextra flag bundle gained a new warning -Wcast-function-type. This complains if you cast between two function prototypes where the number of parameters or their data types are not compatible. Unfortunately we need such "bad" function casts for our event callbacks. It is possible to silence the warning by first casting to the generic "void (*)(void)" function prototype, but that is rather ugly to add throughout libvirt code.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- m4/virt-compile-warnings.m4 | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4 index 918764d362..fc185aef38 100644 --- a/m4/virt-compile-warnings.m4 +++ b/m4/virt-compile-warnings.m4 @@ -175,6 +175,8 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ # with gl_MANYWARN_COMPLEMENT # So we have -W enabled, and then have to explicitly turn off... wantwarn="$wantwarn -Wno-sign-compare" + # We do "bad" function casts all the time for event callbacks + wantwarn="$wantwarn -Wno-cast-function-type"
# GNULIB expects this to be part of -Wc++-compat, but we turn # that one off, so we need to manually enable this again
FYI, I'm going to push just this patch as a build-fixer, since in retrospect is it not really related to the rest of the changes in this huge series. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libvirt.c | 3 +++ src/util/vircgroup.c | 1 + src/util/vircrypto.c | 2 ++ src/util/virerror.c | 6 +++++- src/util/virfdstream.c | 4 ++++ src/util/virfirewall.c | 1 + src/util/virhook.c | 12 +++++------ src/util/virhostdev.c | 8 +++++++- src/util/virhostmem.c | 5 +++++ src/util/virjson.c | 5 +++++ src/util/virlog.c | 7 +++++-- src/util/virnetdev.c | 1 + src/util/virnetdevmacvlan.c | 3 +++ src/util/virnetdevvportprofile.c | 43 ++++++++++++++++++++++++++++++++++------ src/util/virnuma.c | 5 ++++- src/util/virprocess.c | 1 + src/util/virqemu.c | 5 +++++ src/util/virsexpr.c | 2 ++ src/util/virsocketaddr.c | 13 +++++++----- src/util/virstoragefile.c | 15 ++++++++++++-- 20 files changed, 118 insertions(+), 24 deletions(-) diff --git a/src/libvirt.c b/src/libvirt.c index 536d56f0a5..6eb265c2d7 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -503,6 +503,9 @@ DllMain(HINSTANCE instance ATTRIBUTE_UNUSED, since (hopefully) windows cleans up everything on process exit */ break; + + default: + break; } return TRUE; diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c index 0a31947b0d..1b256af92f 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -1495,6 +1495,7 @@ virCgroupNewThread(virCgroupPtr domain, goto cleanup; break; case VIR_CGROUP_THREAD_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected name value %d"), nameval); goto cleanup; diff --git a/src/util/vircrypto.c b/src/util/vircrypto.c index 48b04fc8ce..dbbe2f7fd5 100644 --- a/src/util/vircrypto.c +++ b/src/util/vircrypto.c @@ -112,6 +112,7 @@ virCryptoHaveCipher(virCryptoCipher algorithm) case VIR_CRYPTO_CIPHER_NONE: case VIR_CRYPTO_CIPHER_LAST: + default: break; }; @@ -263,6 +264,7 @@ virCryptoEncryptData(virCryptoCipher algorithm, case VIR_CRYPTO_CIPHER_NONE: case VIR_CRYPTO_CIPHER_LAST: + default: break; } diff --git a/src/util/virerror.c b/src/util/virerror.c index c000b00436..35f819e4e4 100644 --- a/src/util/virerror.c +++ b/src/util/virerror.c @@ -51,9 +51,9 @@ static virLogPriority virErrorLevelPriority(virErrorLevel level) case VIR_ERR_WARNING: return VIR_LOG_WARN; case VIR_ERR_ERROR: + default: return VIR_LOG_ERROR; } - return VIR_LOG_ERROR; } @@ -616,6 +616,7 @@ virDefaultErrorFunc(virErrorPtr err) lvl = _("warning"); break; case VIR_ERR_ERROR: + default: lvl = _("error"); break; } @@ -1459,6 +1460,9 @@ virErrorMsg(virErrorNumber error, const char *info) else errmsg = _("device not found: %s"); break; + default: + errmsg = _("unexpected error code"); + break; } return errmsg; } diff --git a/src/util/virfdstream.c b/src/util/virfdstream.c index be40379a92..d877e874e8 100644 --- a/src/util/virfdstream.c +++ b/src/util/virfdstream.c @@ -204,6 +204,7 @@ virFDStreamMsgFree(virFDStreamMsgPtr msg) VIR_FREE(msg->stream.data.buf); break; case VIR_FDSTREAM_MSG_TYPE_HOLE: + default: /* nada */ break; } @@ -560,6 +561,9 @@ virFDStreamThreadDoWrite(virFDStreamDataPtr fdst, pop = true; break; + + default: + break; } if (pop) { diff --git a/src/util/virfirewall.c b/src/util/virfirewall.c index e7da482640..b50890cef6 100644 --- a/src/util/virfirewall.c +++ b/src/util/virfirewall.c @@ -378,6 +378,7 @@ virFirewallAddRuleFullV(virFirewallPtr firewall, ADD_ARG(rule, "-w"); break; case VIR_FIREWALL_LAYER_LAST: + default: break; } diff --git a/src/util/virhook.c b/src/util/virhook.c index facd74aeff..cf104d0234 100644 --- a/src/util/virhook.c +++ b/src/util/virhook.c @@ -277,12 +277,12 @@ virHookCall(int driver, break; case VIR_HOOK_DRIVER_NETWORK: opstr = virHookNetworkOpTypeToString(op); - } - if (opstr == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Hook for %s, failed to find operation #%d"), - drvstr, op); - return 1; + break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Hook for %s, failed to find operation #%d"), + drvstr, op); + return 1; } subopstr = virHookSubopTypeToString(sub_op); if (subopstr == NULL) diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c index a12224c58f..889391d45b 100644 --- a/src/util/virhostdev.c +++ b/src/util/virhostdev.c @@ -391,7 +391,6 @@ virHostdevNetConfigVirtPortProfile(const char *linkdev, int vf, case VIR_NETDEV_VPORT_PROFILE_NONE: case VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH: case VIR_NETDEV_VPORT_PROFILE_8021QBG: - case VIR_NETDEV_VPORT_PROFILE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("virtualport type %s is " "currently not supported on interfaces of type " @@ -409,6 +408,13 @@ virHostdevNetConfigVirtPortProfile(const char *linkdev, int vf, macaddr, linkdev, vf, VIR_NETDEV_VPORT_PROFILE_OP_DESTROY); break; + + case VIR_NETDEV_VPORT_PROFILE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected port profile %d"), + virtPort->virtPortType); + break; } return ret; diff --git a/src/util/virhostmem.c b/src/util/virhostmem.c index 11efe8c502..26576a73cc 100644 --- a/src/util/virhostmem.c +++ b/src/util/virhostmem.c @@ -608,6 +608,11 @@ virHostMemGetParameters(virTypedParameterPtr params ATTRIBUTE_UNUSED, return -1; break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected parameter number %zu"), i); + return -1; } } diff --git a/src/util/virjson.c b/src/util/virjson.c index 14b68b8c93..586feac89f 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -369,6 +369,7 @@ virJSONValueFree(virJSONValuePtr value) break; case VIR_JSON_TYPE_BOOLEAN: case VIR_JSON_TYPE_NULL: + default: break; } @@ -1439,6 +1440,10 @@ virJSONValueCopy(const virJSONValue *in) case VIR_JSON_TYPE_NULL: out = virJSONValueNewNull(); break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected JSON type %d"), in->type); + break; } return out; diff --git a/src/util/virlog.c b/src/util/virlog.c index ecbee71cfb..d36aad3de5 100644 --- a/src/util/virlog.c +++ b/src/util/virlog.c @@ -253,8 +253,9 @@ virLogPriorityString(virLogPriority lvl) return "warning"; case VIR_LOG_ERROR: return "error"; + default: + return "unknown"; } - return "unknown"; } @@ -1122,8 +1123,9 @@ int virLogPriorityFromSyslog(int priority) return VIR_LOG_INFO; case LOG_DEBUG: return VIR_LOG_DEBUG; + default: + return VIR_LOG_ERROR; } - return VIR_LOG_ERROR; } #else /* HAVE_SYSLOG_H */ @@ -1640,6 +1642,7 @@ virLogParseOutput(const char *src) #endif break; case VIR_LOG_TO_OUTPUT_LAST: + default: break; } diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index b250af9e2c..b185900bd6 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -2802,6 +2802,7 @@ static int virNetDevParseMcast(char *buf, virNetDevMcastEntryPtr mcast) /* coverity[dead_error_begin] */ case VIR_MCAST_TYPE_LAST: + default: break; } } diff --git a/src/util/virnetdevmacvlan.c b/src/util/virnetdevmacvlan.c index fb41bf934c..efd505c062 100644 --- a/src/util/virnetdevmacvlan.c +++ b/src/util/virnetdevmacvlan.c @@ -694,6 +694,9 @@ virNetDevMacVLanVPortProfileCallback(struct nlmsghdr *hdr, ((struct ifinfomsg *)data)->ifi_flags); VIR_DEBUG(" ifi_change = 0x%04x", ((struct ifinfomsg *)data)->ifi_change); + break; + default: + break; } /* DEBUG end */ diff --git a/src/util/virnetdevvportprofile.c b/src/util/virnetdevvportprofile.c index 4c0a64e439..1e2a293e8a 100644 --- a/src/util/virnetdevvportprofile.c +++ b/src/util/virnetdevvportprofile.c @@ -147,7 +147,7 @@ virNetDevVPortProfileCheckComplete(virNetDevVPortProfilePtr virtport, if (!virtport || virtport->virtPortType == VIR_NETDEV_VPORT_PROFILE_NONE) return 0; - switch (virtport->virtPortType) { + switch ((enum virNetDevVPortProfile)virtport->virtPortType) { case VIR_NETDEV_VPORT_PROFILE_8021QBG: if (!virtport->managerID_specified) { missing = "managerid"; @@ -194,6 +194,15 @@ virNetDevVPortProfileCheckComplete(virNetDevVPortProfilePtr virtport, if (!virtport->interfaceID_specified) missing = "interfaceid"; break; + + case VIR_NETDEV_VPORT_PROFILE_NONE: + break; + + case VIR_NETDEV_VPORT_PROFILE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected port profile type %d"), virtport->virtPortType); + return -1; } if (missing) { @@ -220,7 +229,7 @@ virNetDevVPortProfileCheckNoExtras(virNetDevVPortProfilePtr virtport) if (!virtport || virtport->virtPortType == VIR_NETDEV_VPORT_PROFILE_NONE) return 0; - switch (virtport->virtPortType) { + switch ((enum virNetDevVPortProfile)virtport->virtPortType) { case VIR_NETDEV_VPORT_PROFILE_8021QBG: if (virtport->profileID[0]) extra = "profileid"; @@ -251,6 +260,16 @@ virNetDevVPortProfileCheckNoExtras(virNetDevVPortProfilePtr virtport) else if (virtport->instanceID_specified) extra = "instanceid"; break; + + case VIR_NETDEV_VPORT_PROFILE_MIDONET: + case VIR_NETDEV_VPORT_PROFILE_NONE: + break; + + case VIR_NETDEV_VPORT_PROFILE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected port profile type %d"), virtport->virtPortType); + return -1; } if (extra) { @@ -1254,10 +1273,10 @@ virNetDevVPortProfileAssociate(const char *macvtap_ifname, if (!virtPort || vmOp == VIR_NETDEV_VPORT_PROFILE_OP_NO_OP) return 0; - switch (virtPort->virtPortType) { + switch ((enum virNetDevVPortProfile)virtPort->virtPortType) { case VIR_NETDEV_VPORT_PROFILE_NONE: + case VIR_NETDEV_VPORT_PROFILE_MIDONET: case VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH: - case VIR_NETDEV_VPORT_PROFILE_LAST: break; case VIR_NETDEV_VPORT_PROFILE_8021QBG: @@ -1281,6 +1300,12 @@ virNetDevVPortProfileAssociate(const char *macvtap_ifname, } break; + + case VIR_NETDEV_VPORT_PROFILE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected port profile type %d"), virtPort->virtPortType); + break; } return rc; @@ -1319,10 +1344,10 @@ virNetDevVPortProfileDisassociate(const char *macvtap_ifname, if (!virtPort) return 0; - switch (virtPort->virtPortType) { + switch ((enum virNetDevVPortProfile)virtPort->virtPortType) { case VIR_NETDEV_VPORT_PROFILE_NONE: + case VIR_NETDEV_VPORT_PROFILE_MIDONET: case VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH: - case VIR_NETDEV_VPORT_PROFILE_LAST: break; case VIR_NETDEV_VPORT_PROFILE_8021QBG: @@ -1341,6 +1366,12 @@ virNetDevVPortProfileDisassociate(const char *macvtap_ifname, virtPort, NULL, VIR_NETDEV_VPORT_PROFILE_LINK_OP_DISASSOCIATE); break; + + case VIR_NETDEV_VPORT_PROFILE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected port profile type %d"), virtPort->virtPortType); + break; } return rc; diff --git a/src/util/virnuma.c b/src/util/virnuma.c index bebe301f8d..bf7db7256a 100644 --- a/src/util/virnuma.c +++ b/src/util/virnuma.c @@ -152,7 +152,10 @@ virNumaSetupMemoryPolicy(virDomainNumatuneMemMode mode, break; case VIR_DOMAIN_NUMATUNE_MEM_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected NUMA tune mode %d"), mode); + goto cleanup; } ret = 0; diff --git a/src/util/virprocess.c b/src/util/virprocess.c index 1fbbbb3a27..a4801c7f04 100644 --- a/src/util/virprocess.c +++ b/src/util/virprocess.c @@ -1343,6 +1343,7 @@ virProcessSchedTranslatePolicy(virProcessSchedPolicy policy) return SCHED_RR; case VIR_PROC_POLICY_LAST: + default: /* nada */ break; } diff --git a/src/util/virqemu.c b/src/util/virqemu.c index 2e9e65f9ef..b2932255b2 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -207,6 +207,11 @@ virQEMUBuildCommandLineJSONRecurse(const char *key, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("NULL JSON type can't be converted to commandline")); return -1; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected JSON type %d"), value->type); + return -1; } return 0; diff --git a/src/util/virsexpr.c b/src/util/virsexpr.c index 885c382a5f..9ed371799e 100644 --- a/src/util/virsexpr.c +++ b/src/util/virsexpr.c @@ -78,6 +78,8 @@ sexpr_free(struct sexpr *sexpr) break; case SEXPR_NIL: break; + default: + break; } VIR_FREE(sexpr); diff --git a/src/util/virsocketaddr.c b/src/util/virsocketaddr.c index 95b5274368..078f99775b 100644 --- a/src/util/virsocketaddr.c +++ b/src/util/virsocketaddr.c @@ -281,8 +281,9 @@ virSocketAddrEqual(const virSocketAddr *s1, const virSocketAddr *s2) &s2->data.inet6.sin6_addr.s6_addr, sizeof(s1->data.inet6.sin6_addr.s6_addr)) == 0 && s1->data.inet6.sin6_port == s2->data.inet6.sin6_port); + default: + return false; } - return false; } /* @@ -314,8 +315,9 @@ virSocketAddrIsPrivate(const virSocketAddr *addr) return ((addr->data.inet6.sin6_addr.s6_addr[0] & 0xFE) == 0xFC || ((addr->data.inet6.sin6_addr.s6_addr[0] & 0xFF) == 0xFE && (addr->data.inet6.sin6_addr.s6_addr[1] & 0xC0) == 0xC0)); + default: + return false; } - return false; } /* @@ -334,8 +336,9 @@ virSocketAddrIsWildcard(const virSocketAddr *addr) sizeof(addr->data.inet4.sin_addr.s_addr)) == 0; case AF_INET6: return IN6_IS_ADDR_UNSPECIFIED(&addr->data.inet6.sin6_addr); + default: + return false; } - return false; } /* @@ -1136,9 +1139,9 @@ virSocketAddrIsNumericLocalhost(const char *addr) sizeof(res.data.inet4.sin_addr.s_addr)) == 0; case AF_INET6: return IN6_IS_ADDR_LOOPBACK(&res.data.inet6.sin6_addr); + default: + return false; } - - return false; } diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c index 7f878039ba..14d135b389 100644 --- a/src/util/virstoragefile.c +++ b/src/util/virstoragefile.c @@ -463,6 +463,10 @@ qcow2GetBackingStoreFormat(int *format, ((const char *)buf)+offset); if (*format <= VIR_STORAGE_FILE_NONE) return -1; + break; + + default: + break; } offset += len; @@ -2208,6 +2212,7 @@ virStorageSourceIsLocalStorage(const virStorageSource *src) case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_LAST: case VIR_STORAGE_TYPE_NONE: + default: return false; } @@ -2739,6 +2744,7 @@ virStorageSourceParseBackingColon(virStorageSourcePtr src, case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("backing store parser is not implemented for protocol %s"), protocol); @@ -3491,13 +3497,16 @@ virStorageSourceUpdatePhysicalSize(virStorageSourcePtr src, /* We shouldn't get VOLUME, but the switch requires all cases */ case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot retrieve physical for path '%s' type '%s'"), NULLSTR(src->path), virStorageTypeToString(actual_type)); return -1; - break; + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), actual_type); + return -1; } return 0; @@ -3980,6 +3989,7 @@ virStorageSourceIsRelative(virStorageSourcePtr src) case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: case VIR_STORAGE_TYPE_LAST: + default: return false; } @@ -4065,6 +4075,7 @@ virStorageSourceNetworkDefaultPort(virStorageNetProtocol protocol) case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: + default: return 0; } -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libvirt.c | 3 +++ src/util/vircgroup.c | 1 + src/util/vircrypto.c | 2 ++ src/util/virerror.c | 6 +++++- src/util/virfdstream.c | 4 ++++ src/util/virfirewall.c | 1 + src/util/virhook.c | 12 +++++------ src/util/virhostdev.c | 8 +++++++- src/util/virhostmem.c | 5 +++++ src/util/virjson.c | 5 +++++ src/util/virlog.c | 7 +++++-- src/util/virnetdev.c | 1 + src/util/virnetdevmacvlan.c | 3 +++ src/util/virnetdevvportprofile.c | 43 ++++++++++++++++++++++++++++++++++------ src/util/virnuma.c | 5 ++++- src/util/virprocess.c | 1 + src/util/virqemu.c | 5 +++++ src/util/virsexpr.c | 2 ++ src/util/virsocketaddr.c | 13 +++++++----- src/util/virstoragefile.c | 15 ++++++++++++-- 20 files changed, 118 insertions(+), 24 deletions(-)
[...]
diff --git a/src/util/virhook.c b/src/util/virhook.c index facd74aeff..cf104d0234 100644 --- a/src/util/virhook.c +++ b/src/util/virhook.c @@ -277,12 +277,12 @@ virHookCall(int driver,
Above here at the top of the function there is a : if ((driver < VIR_HOOK_DRIVER_DAEMON) || (driver >= VIR_HOOK_DRIVER_LAST)) return 1; thus the "default:" case added achieves DEAD_ERROR from Coverity.
break; case VIR_HOOK_DRIVER_NETWORK: opstr = virHookNetworkOpTypeToString(op); - } - if (opstr == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Hook for %s, failed to find operation #%d"), - drvstr, op); - return 1; + break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Hook for %s, failed to find operation #%d"), + drvstr, op);
Removing default: "works" because @driver is an int. BTW: @drvstr would be NULL here, right? If the initial condition is removed, then that makes Coverity happy.
+ return 1; } subopstr = virHookSubopTypeToString(sub_op); if (subopstr == NULL)
[...]
diff --git a/src/util/virhostmem.c b/src/util/virhostmem.c index 11efe8c502..26576a73cc 100644 --- a/src/util/virhostmem.c +++ b/src/util/virhostmem.c @@ -608,6 +608,11 @@ virHostMemGetParameters(virTypedParameterPtr params ATTRIBUTE_UNUSED, return -1;
break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected parameter number %zu"), i); + return -1;
Here we are in a for loop from 0 to NODE_MEMORY_PARAMETERS_NUM (or 8), so Coverity complains that default is DEAD... This one's a little trickier because removing default: leaves open the possibility of the constant changing and someone not adding the next number in the sequence. The "easier" path is remove default:, the other option to avoid Coverity notification is adding a "/* coverity[dead_error_begin] */" right above default:.
} }
[...]
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index b250af9e2c..b185900bd6 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -2802,6 +2802,7 @@ static int virNetDevParseMcast(char *buf, virNetDevMcastEntryPtr mcast)
/* coverity[dead_error_begin] */ case VIR_MCAST_TYPE_LAST: + default:
Similar to virhostmem, we're in a for loop where ifindex starts at VIR_MCAST_TYPE_INDEX_TOKEN and must be less than VIR_MCAST_TYPE_LAST, so we get a DEAD_ERROR for both of these. Removing the (virMCastType) and leaving as an int removes the error, but leaves open the possibility of a new type being missed. Modifying the code to be: /* coverity[dead_error_condition] */ case VIR_MCAST_TYPE_LAST: /* coverity[dead_error_begin] */ default: Fixes things, but IMO is butt-ugly. So maybe we just leave this one as is and I keep a local filter for it.
break; } }
[...] I think the first one could be easily adjusted - the last two - IDC, keep them as is and I'll filter them or adjust them later in my Coverity branch. Reviewed-by: John Ferlan <jferlan@redhat.com> John

On 02/19/2018 06:49 PM, John Ferlan wrote:
On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libvirt.c | 3 +++ src/util/vircgroup.c | 1 + src/util/vircrypto.c | 2 ++ src/util/virerror.c | 6 +++++- src/util/virfdstream.c | 4 ++++ src/util/virfirewall.c | 1 + src/util/virhook.c | 12 +++++------ src/util/virhostdev.c | 8 +++++++- src/util/virhostmem.c | 5 +++++ src/util/virjson.c | 5 +++++ src/util/virlog.c | 7 +++++-- src/util/virnetdev.c | 1 + src/util/virnetdevmacvlan.c | 3 +++ src/util/virnetdevvportprofile.c | 43 ++++++++++++++++++++++++++++++++++------ src/util/virnuma.c | 5 ++++- src/util/virprocess.c | 1 + src/util/virqemu.c | 5 +++++ src/util/virsexpr.c | 2 ++ src/util/virsocketaddr.c | 13 +++++++----- src/util/virstoragefile.c | 15 ++++++++++++-- 20 files changed, 118 insertions(+), 24 deletions(-)
[...]
diff --git a/src/util/virhook.c b/src/util/virhook.c index facd74aeff..cf104d0234 100644 --- a/src/util/virhook.c +++ b/src/util/virhook.c @@ -277,12 +277,12 @@ virHookCall(int driver,
Above here at the top of the function there is a :
if ((driver < VIR_HOOK_DRIVER_DAEMON) || (driver >= VIR_HOOK_DRIVER_LAST)) return 1;
thus the "default:" case added achieves DEAD_ERROR from Coverity.
break; case VIR_HOOK_DRIVER_NETWORK: opstr = virHookNetworkOpTypeToString(op); - } - if (opstr == NULL) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Hook for %s, failed to find operation #%d"), - drvstr, op); - return 1; + break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Hook for %s, failed to find operation #%d"), + drvstr, op);
Removing default: "works" because @driver is an int.
BTW: @drvstr would be NULL here, right?
If the initial condition is removed, then that makes Coverity happy.
+ return 1; } subopstr = virHookSubopTypeToString(sub_op); if (subopstr == NULL)
[...]
diff --git a/src/util/virhostmem.c b/src/util/virhostmem.c index 11efe8c502..26576a73cc 100644 --- a/src/util/virhostmem.c +++ b/src/util/virhostmem.c @@ -608,6 +608,11 @@ virHostMemGetParameters(virTypedParameterPtr params ATTRIBUTE_UNUSED, return -1;
break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected parameter number %zu"), i); + return -1;
Based on even more warnings like this in the subsequent patch, I'm just going to disable DEADCODE checking in my Coverity check scripts. It'll be easier that way. Maybe some day in the far future gcc8 will be used in/for Coverity and they'll fix the problem ;-) John I'll pick up in the morning on the next set of patches...
Here we are in a for loop from 0 to NODE_MEMORY_PARAMETERS_NUM (or 8), so Coverity complains that default is DEAD... This one's a little trickier because removing default: leaves open the possibility of the constant changing and someone not adding the next number in the sequence. The "easier" path is remove default:, the other option to avoid Coverity notification is adding a "/* coverity[dead_error_begin] */" right above default:.
} }
[...]
diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c index b250af9e2c..b185900bd6 100644 --- a/src/util/virnetdev.c +++ b/src/util/virnetdev.c @@ -2802,6 +2802,7 @@ static int virNetDevParseMcast(char *buf, virNetDevMcastEntryPtr mcast)
/* coverity[dead_error_begin] */ case VIR_MCAST_TYPE_LAST: + default:
Similar to virhostmem, we're in a for loop where ifindex starts at VIR_MCAST_TYPE_INDEX_TOKEN and must be less than VIR_MCAST_TYPE_LAST, so we get a DEAD_ERROR for both of these.
Removing the (virMCastType) and leaving as an int removes the error, but leaves open the possibility of a new type being missed.
Modifying the code to be:
/* coverity[dead_error_condition] */ case VIR_MCAST_TYPE_LAST: /* coverity[dead_error_begin] */ default:
Fixes things, but IMO is butt-ugly. So maybe we just leave this one as is and I keep a local filter for it.
break; } }
[...]
I think the first one could be easily adjusted - the last two - IDC, keep them as is and I'll filter them or adjust them later in my Coverity branch.
Reviewed-by: John Ferlan <jferlan@redhat.com>
John
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

On Thu, Feb 15, 2018 at 04:43:21PM +0000, Daniel P. Berrangé wrote:
Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and
s/existance/existence/ Jan
thus all switches should have a default: case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/device_conf.c | 4 +- src/conf/domain_addr.c | 10 +- src/conf/domain_audit.c | 4 + src/conf/domain_conf.c | 468 ++++++++++++++++++++++++++++++++------- src/conf/domain_event.c | 1 + src/conf/interface_conf.c | 21 +- src/conf/netdev_bandwidth_conf.h | 4 +- src/conf/network_conf.c | 8 +- src/conf/network_event.c | 1 + src/conf/node_device_conf.c | 27 ++- src/conf/node_device_event.c | 1 + src/conf/nwfilter_conf.c | 1 + src/conf/nwfilter_params.c | 14 ++ src/conf/secret_event.c | 1 + src/conf/storage_event.c | 1 + src/conf/virnodedeviceobj.c | 1 + src/conf/virstorageobj.c | 1 + 17 files changed, 468 insertions(+), 100 deletions(-) diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c index d69f94fadf..6037d290e9 100644 --- a/src/conf/device_conf.c +++ b/src/conf/device_conf.c @@ -83,7 +83,6 @@ virDomainDeviceInfoAddressIsEqual(const virDomainDeviceInfo *a, switch ((virDomainDeviceAddressType) a->type) { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: /* address types below don't have any specific data */ case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: @@ -140,6 +139,9 @@ virDomainDeviceInfoAddressIsEqual(const virDomainDeviceInfo *a, if (memcmp(&a->addr.dimm, &b->addr.dimm, sizeof(a->addr.dimm))) return false; break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: + default: + return false; } return true; diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index df19c6be1a..98230fc267 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c @@ -70,8 +70,10 @@ virDomainPCIControllerModelToConnectType(virDomainControllerModelPCI model) case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: return VIR_PCI_CONNECT_TYPE_PCIE_SWITCH_DOWNSTREAM_PORT; + + default: + return 0; } - return 0; } @@ -352,6 +354,11 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("PCI controller model was not set correctly")); return -1; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected PCI controller model %d"), model); + return -1; } bus->model = model; @@ -1753,6 +1760,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont) case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: + default: break; } return 0; diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c index 82868bca76..f0a7ad7a48 100644 --- a/src/conf/domain_audit.c +++ b/src/conf/domain_audit.c @@ -191,6 +191,7 @@ virDomainAuditSmartcard(virDomainObjPtr vm, break; case VIR_DOMAIN_SMARTCARD_TYPE_LAST: + default: break; } } @@ -236,6 +237,7 @@ virDomainAuditRNG(virDomainObjPtr vm, break; case VIR_DOMAIN_RNG_BACKEND_LAST: + default: break; } } @@ -251,6 +253,7 @@ virDomainAuditRNG(virDomainObjPtr vm, break; case VIR_DOMAIN_RNG_BACKEND_LAST: + default: break; } } @@ -1017,6 +1020,7 @@ virDomainAuditInput(virDomainObjPtr vm, break; case VIR_DOMAIN_INPUT_TYPE_LAST: + default: break; } diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 538dfc84bd..9cc6e87ccb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1038,7 +1038,10 @@ virDomainKeyWrapCipherDefParseXML(virDomainKeyWrapDefPtr keywrap, break; case VIR_DOMAIN_KEY_WRAP_CIPHER_NAME_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected key cipher %d"), name_type); + goto cleanup; } ret = 0; @@ -1411,6 +1414,7 @@ void virDomainGraphicsDefFree(virDomainGraphicsDefPtr def) break; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: break; } @@ -1429,12 +1433,13 @@ const char *virDomainInputDefGetPath(virDomainInputDefPtr input) case VIR_DOMAIN_INPUT_TYPE_KBD: case VIR_DOMAIN_INPUT_TYPE_LAST: return NULL; - break; case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: return input->source.evdev; + + default: + return NULL; } - return NULL; } void virDomainInputDefFree(virDomainInputDefPtr def) @@ -1919,6 +1924,7 @@ virDomainControllerDefNew(virDomainControllerType type) case VIR_DOMAIN_CONTROLLER_TYPE_SATA: case VIR_DOMAIN_CONTROLLER_TYPE_CCID: case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + default: break; } @@ -2075,6 +2081,7 @@ virDomainNetDefClear(virDomainNetDefPtr def) case VIR_DOMAIN_NET_TYPE_ETHERNET: case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_LAST: + default: break; } @@ -2137,6 +2144,7 @@ virDomainChrSourceDefGetPath(virDomainChrSourceDefPtr chr) case VIR_DOMAIN_CHR_TYPE_SPICEVMC: case VIR_DOMAIN_CHR_TYPE_SPICEPORT: case VIR_DOMAIN_CHR_TYPE_LAST: + default: return NULL; } @@ -2179,6 +2187,9 @@ virDomainChrSourceDefClear(virDomainChrSourceDefPtr def) case VIR_DOMAIN_CHR_TYPE_SPICEPORT: VIR_FREE(def->data.spiceport.channel); break; + + default: + break; } VIR_FREE(def->logfile); @@ -2249,6 +2260,11 @@ virDomainChrSourceDefCopy(virDomainChrSourceDefPtr dest, return -1; break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), src->type); + return -1; } dest->type = src->type; @@ -2338,6 +2354,9 @@ virDomainChrSourceDefIsEqual(const virDomainChrSourceDef *src, case VIR_DOMAIN_CHR_TYPE_STDIO: case VIR_DOMAIN_CHR_TYPE_LAST: break; + + default: + return false; } return true; @@ -2359,6 +2378,8 @@ void virDomainChrDefFree(virDomainChrDefPtr def) case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO: VIR_FREE(def->target.name); break; + default: + break; } break; @@ -2564,6 +2585,7 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def) virNetDevIPInfoClear(&def->source.caps.u.net.ip); break; case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST: + default: break; } break; @@ -2579,9 +2601,12 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def) case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: break; } break; + default: + break; } } @@ -2595,6 +2620,7 @@ void virDomainTPMDefFree(virDomainTPMDefPtr def) VIR_FREE(def->data.passthrough.source.data.file.path); break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: break; } @@ -2739,6 +2765,7 @@ void virDomainDeviceDefFree(virDomainDeviceDefPtr def) break; case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: + default: break; } @@ -3552,9 +3579,10 @@ int virDomainDeviceAddressIsValid(virDomainDeviceInfoPtr info, case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB: return 1; - } - return 0; + default: + return 0; + } } virDomainDeviceInfoPtr @@ -3608,6 +3636,7 @@ virDomainDeviceGetInfo(virDomainDeviceDefPtr device) case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: + default: break; } return NULL; @@ -3832,6 +3861,7 @@ virDomainDeviceInfoIterateInternal(virDomainDefPtr def, case VIR_DOMAIN_DEVICE_RNG: case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: + default: break; } #endif @@ -4111,9 +4141,15 @@ virDomainDefAddConsoleCompat(virDomainDefPtr def) case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: /* Nothing to do */ break; + + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev target type %d"), + def->serials[0]->targetType); + return -1; } } @@ -4468,8 +4504,14 @@ virDomainHostdevDefPostParse(virDomainHostdevDefPtr dev, case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsys type %d"), + dev->source.subsys.type); + return -1; } return 0; @@ -4893,6 +4935,7 @@ virDomainVcpuDefPostParse(virDomainDefPtr def) case VIR_TRISTATE_BOOL_YES: case VIR_TRISTATE_BOOL_LAST: + default: break; } } @@ -5171,12 +5214,12 @@ virDomainDiskAddressDiskBusCompatibility(virDomainDiskBus bus, case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_LAST: return true; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unexpected bus type '%d'"), + bus); + return false; } - - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("unexpected bus type '%d'"), - bus); - return true; } @@ -5336,6 +5379,11 @@ virDomainChrSourceDefValidate(const virDomainChrSourceDef *def, return -1; } break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), def->type); + return -1; } return 0; @@ -5480,8 +5528,13 @@ virDomainHostdevDefValidate(const virDomainHostdevDef *hostdev) } break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsys type %d"), + hostdev->source.subsys.type); + return -1; } } return 0; @@ -5547,8 +5600,12 @@ virDomainDeviceDefValidateInternal(const virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_NONE: - case VIR_DOMAIN_DEVICE_LAST: break; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } return 0; @@ -5854,16 +5911,24 @@ virDomainDefLifecycleActionAllowed(virDomainLifecycle type, case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART: case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME: case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE: - case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: return true; case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY: case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART: break; + case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected lifecycle action %d"), action); + return false; } break; case VIR_DOMAIN_LIFECYCLE_CRASH: - case VIR_DOMAIN_LIFECYCLE_LAST: return true; + case VIR_DOMAIN_LIFECYCLE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected lifecycle type %d"), type); + return false; } virReportError(VIR_ERR_CONFIG_UNSUPPORTED, @@ -6169,6 +6234,7 @@ virDomainDeviceInfoFormat(virBufferPtr buf, case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: + default: break; } @@ -6674,8 +6740,12 @@ virDomainDeviceAddressParseXML(xmlNodePtr address, break; case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), info->type); + goto cleanup; } ret = 0; @@ -7351,12 +7421,16 @@ virDomainHostdevSubsysSCSIVHostDefParseXML(xmlNodePtr sourcenode, wwpn = NULL; break; case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_NONE: - case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_LAST: virReportError(VIR_ERR_XML_ERROR, _("Invalid hostdev protocol '%s'"), virDomainHostdevSubsysSCSIHostProtocolTypeToString(hostsrc->protocol)); goto cleanup; - break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev SCSI protocol %d"), + hostsrc->protocol); + goto cleanup; } ret = 0; @@ -7560,10 +7634,11 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, goto error; break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("address type='%s' not supported in hostdev interfaces"), - virDomainHostdevSubsysTypeToString(def->source.subsys.type)); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev susbys type %d"), + def->source.subsys.type); goto error; } @@ -7827,10 +7902,11 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED, ctxt, &def->source.caps.u.net.ip) < 0) goto error; break; + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST: default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("address type='%s' not supported in hostdev interfaces"), - virDomainHostdevCapsTypeToString(def->source.caps.type)); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev caps type %d"), + def->source.caps.type); goto error; } ret = 0; @@ -7960,9 +8036,19 @@ virDomainDiskDefAssignAddress(virDomainXMLOptionPtr xmlopt, def->info.addr.drive.unit = idx % 2; break; - default: + case VIR_DOMAIN_DISK_BUS_VIRTIO: + case VIR_DOMAIN_DISK_BUS_XEN: + case VIR_DOMAIN_DISK_BUS_USB: + case VIR_DOMAIN_DISK_BUS_UML: + case VIR_DOMAIN_DISK_BUS_SD: /* Other disk bus's aren't controller based */ break; + case VIR_DOMAIN_DISK_BUS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected domain disk bus %d"), + def->bus); + return -1; } return 0; @@ -8644,9 +8730,9 @@ virDomainDiskSourceParse(xmlNodePtr node, break; case VIR_STORAGE_TYPE_NONE: case VIR_STORAGE_TYPE_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected disk type %s"), - virStorageTypeToString(src->type)); + _("Unexpected storage type %d"), src->type); goto cleanup; } @@ -10159,6 +10245,8 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, case VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_UHCI3: masterPort = 4; break; + default: + break; } if (masterPort != -1 && def->info.mastertype == VIR_DOMAIN_CONTROLLER_MASTER_NONE) { @@ -10196,10 +10284,14 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt, case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_DOWNSTREAM_PORT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_EXPANDER_BUS: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_EXPANDER_BUS: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: /* Other controller models don't require extra checks */ break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller model %d"), def->model); + goto error; } if (modelName && (def->opts.pciopts.modelName @@ -11298,8 +11390,12 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, case VIR_DOMAIN_NET_TYPE_ETHERNET: case VIR_DOMAIN_NET_TYPE_USER: - case VIR_DOMAIN_NET_TYPE_LAST: break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), def->type); + goto error; } if (virDomainNetIPInfoParseXML(_("guest interface"), @@ -11670,9 +11766,13 @@ virDomainChrDefaultTargetType(int devtype) return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE; case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: /* No target type yet*/ break; + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), devtype); + return -1; } return 0; @@ -11701,10 +11801,14 @@ virDomainChrTargetTypeFromString(int devtype, break; case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: /* No target type yet*/ ret = 0; break; + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), devtype); + break; } return ret; @@ -11727,10 +11831,14 @@ virDomainChrTargetModelFromString(int devtype, case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: /* Target model not supported yet */ ret = 0; break; + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), devtype); + break; } return ret; @@ -11777,9 +11885,9 @@ virDomainChrDefParseTargetXML(virDomainChrDefPtr def, goto error; } - switch (def->deviceType) { + switch ((virDomainChrDeviceType)def->deviceType) { case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: - switch (def->targetType) { + switch ((virDomainChrChannelTargetType)def->targetType) { case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD: addrStr = virXMLPropString(cur, "address"); portStr = virXMLPropString(cur, "port"); @@ -11840,10 +11948,22 @@ virDomainChrDefParseTargetXML(virDomainChrDefPtr def, def->state = tmp; } break; + + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_NONE: + break; + + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected channel target type %d"), + def->targetType); + goto error; } break; - default: + case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: + case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL: + case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: portStr = virXMLPropString(cur, "port"); if (portStr == NULL) { /* Set to negative value to indicate we should set it later */ @@ -11859,6 +11979,13 @@ virDomainChrDefParseTargetXML(virDomainChrDefPtr def, } def->target.port = port; break; + + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), + def->deviceType); + goto error; } @@ -12153,12 +12280,17 @@ virDomainChrSourceDefParseXML(virDomainChrSourceDefPtr def, def->data.nmdm.slave = virXMLPropString(cur, "slave"); break; - case VIR_DOMAIN_CHR_TYPE_LAST: case VIR_DOMAIN_CHR_TYPE_NULL: case VIR_DOMAIN_CHR_TYPE_VC: case VIR_DOMAIN_CHR_TYPE_STDIO: case VIR_DOMAIN_CHR_TYPE_SPICEVMC: break; + + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), def->type); + goto error; } /* Check for an optional seclabel override in <source/>. */ @@ -12594,6 +12726,9 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt, path = NULL; break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), def->type); goto error; } @@ -13117,8 +13252,13 @@ virDomainGraphicsListenDefParseXML(virDomainGraphicsListenDefPtr def, break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS: case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NETWORK: - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), + graphics->type); + goto error; } if (def->type == VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_ADDRESS) { @@ -13859,7 +13999,11 @@ virDomainGraphicsDefParseXML(xmlNodePtr node, goto error; break; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), + def->type); + goto error; } cleanup: @@ -14119,7 +14263,11 @@ virDomainRNGDefParseXML(virDomainXMLOptionPtr xmlopt, break; case VIR_DOMAIN_RNG_BACKEND_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend %d"), + def->backend); + goto error; } if (virDomainDeviceInfoParseXML(xmlopt, node, NULL, &def->info, flags) < 0) @@ -15004,8 +15152,13 @@ virDomainHostdevDefParseXML(virDomainXMLOptionPtr xmlopt, case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: - case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsystem type %d"), + def->source.subsys.type); + goto error; } } @@ -15421,8 +15574,13 @@ virDomainMemorySourceDefParseXML(xmlNodePtr node, break; case VIR_DOMAIN_MEMORY_MODEL_NONE: - case VIR_DOMAIN_MEMORY_MODEL_LAST: break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), + def->model); + goto cleanup; } ret = 0; @@ -15788,7 +15946,10 @@ virDomainDeviceDefParse(const char *xmlStr, break; case VIR_DOMAIN_DEVICE_NONE: case VIR_DOMAIN_DEVICE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + goto error; } /* callback to fill driver specific device aspects */ @@ -16006,9 +16167,9 @@ virDomainHostdevMatchSubsys(virDomainHostdevDefPtr a, case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: return virDomainHostdevMatchSubsysMediatedDev(a, b); case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: return 0; } - return 0; } @@ -16045,15 +16206,17 @@ virDomainHostdevMatchCaps(virDomainHostdevDefPtr a, if (a->source.caps.type != b->source.caps.type) return 0; - switch (a->source.caps.type) { + switch ((virDomainHostdevCapsType)a->source.caps.type) { case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_STORAGE: return virDomainHostdevMatchCapsStorage(a, b); case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_MISC: return virDomainHostdevMatchCapsMisc(a, b); case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET: return virDomainHostdevMatchCapsNet(a, b); + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST: + default: + return 0; } - return 0; } @@ -16064,13 +16227,15 @@ virDomainHostdevMatch(virDomainHostdevDefPtr a, if (a->mode != b->mode) return 0; - switch (a->mode) { + switch ((virDomainHostdevMode)a->mode) { case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: return virDomainHostdevMatchSubsys(a, b); case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES: return virDomainHostdevMatchCaps(a, b); + case VIR_DOMAIN_HOSTDEV_MODE_LAST: + default: + return 0; } - return 0; } /* Find an entry in hostdevs that matches the source spec in @@ -16695,11 +16860,14 @@ virDomainChrEquals(virDomainChrDefPtr src, break; case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_NONE: + return true; case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST: - /* shouldn't happen */ - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected channel target type %d"), + src->targetType); + return false; } - break; case VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL: if (src->targetType != tgt->targetType) @@ -16710,12 +16878,13 @@ virDomainChrEquals(virDomainChrDefPtr src, case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: return src->target.port == tgt->target.port; - break; + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: - /* shouldn't happen */ - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), src->deviceType); + return false; } - return false; } virDomainChrDefPtr @@ -16768,12 +16937,11 @@ virDomainChrGetDomainPtrsInternal(virDomainDefPtr vmdef, return 0; case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), type); + return -1; } - - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unknown char device type: %d"), type); - return -1; } @@ -16882,7 +17050,11 @@ virDomainRNGFind(virDomainDefPtr def, break; case VIR_DOMAIN_RNG_BACKEND_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend %d"), + rng->backend); + return -1; } if (rng->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && @@ -16958,8 +17130,12 @@ virDomainMemoryFindByDefInternal(virDomainDefPtr def, break; case VIR_DOMAIN_MEMORY_MODEL_NONE: - case VIR_DOMAIN_MEMORY_MODEL_LAST: break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), mem->model); + return -1; } break; @@ -19284,6 +19460,7 @@ virDomainDefParseXML(xmlDocPtr xml, /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: + default: break; } } @@ -19384,6 +19561,7 @@ virDomainDefParseXML(xmlDocPtr xml, /* coverity[dead_error_begin] */ case VIR_DOMAIN_HYPERV_LAST: + default: break; } } @@ -19430,6 +19608,7 @@ virDomainDefParseXML(xmlDocPtr xml, /* coverity[dead_error_begin] */ case VIR_DOMAIN_KVM_LAST: + default: break; } } @@ -19512,7 +19691,7 @@ virDomainDefParseXML(xmlDocPtr xml, } VIR_FREE(tmp); - switch (def->clock.offset) { + switch ((virDomainClockOffsetType)def->clock.offset) { case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME: case VIR_DOMAIN_CLOCK_OFFSET_UTC: tmp = virXPathString("string(./clock/@adjustment)", ctxt); @@ -19534,6 +19713,8 @@ virDomainDefParseXML(xmlDocPtr xml, case VIR_DOMAIN_CLOCK_OFFSET_UTC: def->clock.data.variable.basis = VIR_DOMAIN_CLOCK_BASIS_UTC; break; + default: + break; } def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_VARIABLE; } @@ -19571,6 +19752,11 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; } break; + + case VIR_DOMAIN_CLOCK_OFFSET_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected clock offset %d"), def->clock.offset); } if ((n = virXPathNodeSet("./clock/timer", ctxt, &nodes)) < 0) @@ -20664,8 +20850,12 @@ virDomainDeviceInfoCheckABIStability(virDomainDeviceInfoPtr src, case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device address type %d"), src->type); + return false; } return true; @@ -21104,7 +21294,7 @@ virDomainChannelDefCheckABIStability(virDomainChrDefPtr src, return false; } - switch (src->targetType) { + switch ((virDomainChrChannelTargetType)src->targetType) { case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN: case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO: @@ -21137,6 +21327,15 @@ virDomainChannelDefCheckABIStability(virDomainChrDefPtr src, return false; } break; + + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_NONE: + break; + + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected channel target type %d"), src->targetType); + return false; } if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info)) @@ -21283,7 +21482,10 @@ virDomainRedirdevDefCheckABIStability(virDomainRedirdevDefPtr src, } break; case VIR_DOMAIN_REDIRDEV_BUS_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected redirdev bus type %d"), src->bus); + return false; } if (!virDomainDeviceInfoCheckABIStability(&src->info, &dst->info)) @@ -21433,6 +21635,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src, /* coverity[dead_error_begin] */ case VIR_DOMAIN_HYPERV_LAST: + default: break; } } @@ -21457,6 +21660,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src, /* coverity[dead_error_begin] */ case VIR_DOMAIN_KVM_LAST: + default: break; } } @@ -22188,6 +22392,7 @@ virDomainDefCheckABIStabilityFlags(virDomainDefPtr src, case VIR_DOMAIN_DEVICE_SHMEM: case VIR_DOMAIN_DEVICE_MEMORY: case VIR_DOMAIN_DEVICE_IOMMU: + default: break; } #endif @@ -22819,6 +23024,7 @@ virDomainDiskSourceFormatInternal(virBufferPtr buf, case VIR_STORAGE_TYPE_NONE: case VIR_STORAGE_TYPE_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected disk type %d"), src->type); goto error; @@ -23438,7 +23644,7 @@ virDomainFSDefFormat(virBufferPtr buf, virBufferAddLit(buf, "/>\n"); } - switch (def->type) { + switch ((virDomainFSType)def->type) { case VIR_DOMAIN_FS_TYPE_MOUNT: case VIR_DOMAIN_FS_TYPE_BIND: virBufferEscapeString(buf, "<source dir='%s'/>\n", @@ -23471,6 +23677,12 @@ virDomainFSDefFormat(virBufferPtr buf, virBufferEscapeString(buf, " volume='%s'", def->src->srcpool->volume); virBufferAddLit(buf, "/>\n"); break; + + case VIR_DOMAIN_FS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected filesystem type %d"), def->type); + return -1; } virBufferEscapeString(buf, "<target dir='%s'/>\n", @@ -24138,8 +24350,12 @@ virDomainNetDefFormat(virBufferPtr buf, break; case VIR_DOMAIN_NET_TYPE_USER: - case VIR_DOMAIN_NET_TYPE_LAST: break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), def->type); + return -1; } /* if sourceLines == 0 - no <source> info at all so far @@ -24323,7 +24539,6 @@ virDomainChrSourceDefFormat(virBufferPtr buf, case VIR_DOMAIN_CHR_TYPE_VC: case VIR_DOMAIN_CHR_TYPE_STDIO: case VIR_DOMAIN_CHR_TYPE_SPICEVMC: - case VIR_DOMAIN_CHR_TYPE_LAST: /* nada */ break; @@ -24416,6 +24631,11 @@ virDomainChrSourceDefFormat(virBufferPtr buf, def->data.spiceport.channel); break; + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), def->type); + goto error; } if (def->logfile) { @@ -24484,6 +24704,12 @@ virDomainChrTargetDefFormat(virBufferPtr buf, virDomainChrDeviceStateTypeToString(def->state)); } break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected channel target type %d"), + def->targetType); + return -1; } virBufferAddLit(buf, "/>\n"); @@ -24543,6 +24769,7 @@ virDomainChrTargetDefFormat(virBufferPtr buf, break; case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unexpected char device type %d"), def->deviceType); @@ -24695,6 +24922,9 @@ virDomainTPMDefFormat(virBufferPtr buf, def->data.passthrough.source.data.file.path); break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), def->type); break; } @@ -24963,9 +25193,14 @@ virDomainRNGDefFormat(virBufferPtr buf, return -1; virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "</backend>\n"); + break; case VIR_DOMAIN_RNG_BACKEND_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend type %d"), def->backend); + virBufferFreeAndReset(&driverBuf); + return -1; } virDomainVirtioOptionsFormat(&driverBuf, def->virtio); @@ -24999,6 +25234,7 @@ virDomainRNGDefFree(virDomainRNGDefPtr def) virDomainChrSourceDefFree(def->source.chardev); break; case VIR_DOMAIN_RNG_BACKEND_LAST: + default: break; } @@ -25040,8 +25276,12 @@ virDomainMemorySourceDefFormat(virBufferPtr buf, break; case VIR_DOMAIN_MEMORY_MODEL_NONE: - case VIR_DOMAIN_MEMORY_MODEL_LAST: break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), def->model); + goto cleanup; } virBufferAdjustIndent(buf, -2); @@ -25494,8 +25734,12 @@ virDomainGraphicsDefFormat(virBufferPtr buf, virDomainGraphicsListenDefFormatAddr(buf, glisten, flags); break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), glisten->type); + return -1; } if (def->data.vnc.keymap) @@ -25596,7 +25840,10 @@ virDomainGraphicsDefFormat(virBufferPtr buf, break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), glisten->type); + return -1; } if (def->data.spice.keymap) @@ -25611,7 +25858,11 @@ virDomainGraphicsDefFormat(virBufferPtr buf, break; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), + def->type); + return -1; } for (i = 0; i < def->nListens; i++) { @@ -25777,7 +26028,7 @@ virDomainHostdevDefFormat(virBufferPtr buf, virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); - switch (def->mode) { + switch ((virDomainHostdevMode)def->mode) { case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: if (virDomainHostdevDefFormatSubsys(buf, def, flags, false) < 0) return -1; @@ -25786,6 +26037,11 @@ virDomainHostdevDefFormat(virBufferPtr buf, if (virDomainHostdevDefFormatCaps(buf, def) < 0) return -1; break; + case VIR_DOMAIN_HOSTDEV_MODE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev mode %d"), def->mode); + return -1; } if (def->readonly) @@ -26074,6 +26330,7 @@ virDomainSchedulerFormat(virBufferPtr buf, case VIR_PROC_POLICY_NONE: case VIR_PROC_POLICY_LAST: + default: break; } @@ -26775,6 +27032,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, case VIR_TRISTATE_SWITCH_LAST: case VIR_TRISTATE_SWITCH_OFF: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected state of feature '%s'"), name); @@ -26790,6 +27048,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, case VIR_DOMAIN_FEATURE_VMPORT: case VIR_DOMAIN_FEATURE_SMM: switch ((virTristateSwitch) def->features[i]) { + default: case VIR_TRISTATE_SWITCH_LAST: case VIR_TRISTATE_SWITCH_ABSENT: break; @@ -26857,6 +27116,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, /* coverity[dead_error_begin] */ case VIR_DOMAIN_HYPERV_LAST: + default: break; } @@ -26884,6 +27144,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, /* coverity[dead_error_begin] */ case VIR_DOMAIN_KVM_LAST: + default: break; } } @@ -26937,6 +27198,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, /* coverity[dead_error_begin] */ case VIR_DOMAIN_FEATURE_LAST: + default: break; } } @@ -26950,7 +27212,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, virBufferAsprintf(buf, "<clock offset='%s'", virDomainClockOffsetTypeToString(def->clock.offset)); - switch (def->clock.offset) { + switch ((virDomainClockOffsetType)def->clock.offset) { case VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME: case VIR_DOMAIN_CLOCK_OFFSET_UTC: if (def->clock.data.utc_reset) @@ -26969,6 +27231,11 @@ virDomainDefFormatInternal(virDomainDefPtr def, case VIR_DOMAIN_CLOCK_OFFSET_TIMEZONE: virBufferEscapeString(buf, " timezone='%s'", def->clock.data.timezone); break; + case VIR_DOMAIN_CLOCK_OFFSET_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected clock offset type %d"), def->clock.offset); + goto error; } if (def->clock.ntimers == 0) { virBufferAddLit(buf, "/>\n"); @@ -27871,10 +28138,10 @@ virDomainStateReasonToString(virDomainState state, int reason) case VIR_DOMAIN_PMSUSPENDED: return virDomainPMSuspendedReasonTypeToString(reason); case VIR_DOMAIN_LAST: - break; + default: + VIR_WARN("Unexpected domain state: %d", state); + return NULL; } - VIR_WARN("Unexpected domain state: %d", state); - return NULL; } @@ -27899,10 +28166,10 @@ virDomainStateReasonFromString(virDomainState state, const char *reason) case VIR_DOMAIN_PMSUSPENDED: return virDomainPMSuspendedReasonTypeFromString(reason); case VIR_DOMAIN_LAST: - break; + default: + VIR_WARN("Unexpected domain state: %d", state); + return -1; } - VIR_WARN("Unexpected domain state: %d", state); - return -1; } @@ -28270,10 +28537,15 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, case VIR_DOMAIN_DEVICE_MEMBALLOON: case VIR_DOMAIN_DEVICE_NVRAM: case VIR_DOMAIN_DEVICE_IOMMU: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Copying definition of '%s' type " + "is not implemented yet."), + virDomainDeviceTypeToString(src->type)); + goto cleanup; case VIR_DOMAIN_DEVICE_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("Copying definition of '%d' type " - "is not implemented yet."), + _("Unexpected device type %d"), src->type); goto cleanup; } @@ -28417,6 +28689,10 @@ virDomainObjGetMetadata(virDomainObjPtr vm, /* coverity[dead_error_begin] */ case VIR_DOMAIN_METADATA_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected metadata type %d"), + type); break; } @@ -28503,6 +28779,10 @@ virDomainDefSetMetadata(virDomainDefPtr def, /* coverity[dead_error_begin] */ case VIR_DOMAIN_METADATA_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected metadata type %d"), + type); break; } @@ -28849,6 +29129,7 @@ virDomainNetTypeSharesHostView(const virDomainNetDef *net) case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_LAST: + default: break; } return false; @@ -29141,6 +29422,11 @@ virDomainDiskTranslateSourcePool(virConnectPtr conn, virStorageVolTypeToString(info.type), virStoragePoolTypeToString(pooldef->type)); goto cleanup; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage vol type %d"), + info.type); + goto cleanup; } break; @@ -29185,6 +29471,11 @@ virDomainDiskTranslateSourcePool(virConnectPtr conn, if (virDomainDiskAddISCSIPoolSourceHost(def, pooldef) < 0) goto cleanup; break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage pool mode %d"), + def->src->srcpool->mode); + goto cleanup; } break; @@ -29192,12 +29483,17 @@ virDomainDiskTranslateSourcePool(virConnectPtr conn, case VIR_STORAGE_POOL_RBD: case VIR_STORAGE_POOL_SHEEPDOG: case VIR_STORAGE_POOL_GLUSTER: - case VIR_STORAGE_POOL_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("using '%s' pools for backing 'volume' disks " "isn't yet supported"), virStoragePoolTypeToString(pooldef->type)); goto cleanup; + case VIR_STORAGE_POOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage pool type %d"), + pooldef->type); + goto cleanup; } ret = 0; diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 7baccd5b57..a6202ec1b1 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -2042,6 +2042,7 @@ virDomainEventDispatchDefaultFunc(virConnectPtr conn, goto cleanup; } case VIR_DOMAIN_EVENT_ID_LAST: + default: break; } diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c index 0a4b28f489..89f77a719e 100644 --- a/src/conf/interface_conf.c +++ b/src/conf/interface_conf.c @@ -83,7 +83,7 @@ virInterfaceDefFree(virInterfaceDefPtr def) VIR_FREE(def->name); VIR_FREE(def->mac); - switch (def->type) { + switch ((virInterfaceType)def->type) { case VIR_INTERFACE_TYPE_BRIDGE: VIR_FREE(def->data.bridge.delay); for (i = 0; i < def->data.bridge.nbItf; i++) { @@ -106,6 +106,10 @@ virInterfaceDefFree(virInterfaceDefPtr def) VIR_FREE(def->data.vlan.tag); VIR_FREE(def->data.vlan.dev_name); break; + case VIR_INTERFACE_TYPE_ETHERNET: + case VIR_INTERFACE_TYPE_LAST: + default: + break; } /* free all protos */ @@ -760,7 +764,7 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt, goto error; } - switch (type) { + switch ((virInterfaceType)type) { case VIR_INTERFACE_TYPE_ETHERNET: if ((tmp = virXPathString("string(./mac/@address)", ctxt))) def->mac = tmp; @@ -804,7 +808,11 @@ virInterfaceDefParseXML(xmlXPathContextPtr ctxt, goto error; break; } - + case VIR_INTERFACE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected interface type %d"), type); + goto error; } ctxt->node = cur; @@ -1115,7 +1123,7 @@ virInterfaceDefDevFormat(virBufferPtr buf, if (def->type != VIR_INTERFACE_TYPE_BRIDGE) virInterfaceLinkFormat(buf, &def->lnk); - switch (def->type) { + switch ((virInterfaceType)def->type) { case VIR_INTERFACE_TYPE_ETHERNET: if (def->mac) virBufferAsprintf(buf, "<mac address='%s'/>\n", def->mac); @@ -1129,6 +1137,11 @@ virInterfaceDefDevFormat(virBufferPtr buf, case VIR_INTERFACE_TYPE_VLAN: virInterfaceVlanDefFormat(buf, def); break; + case VIR_INTERFACE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected interface type %d"), def->type); + goto cleanup; } virBufferAdjustIndent(buf, -2); diff --git a/src/conf/netdev_bandwidth_conf.h b/src/conf/netdev_bandwidth_conf.h index 30f988953c..3d2ebb62b4 100644 --- a/src/conf/netdev_bandwidth_conf.h +++ b/src/conf/netdev_bandwidth_conf.h @@ -56,9 +56,9 @@ static inline bool virNetDevSupportBandwidth(virDomainNetType type) case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_LAST: - break; + default: + return false; } - return false; } #endif /* __VIR_NETDEV_BANDWIDTH_CONF_H__ */ diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 54109a3d2e..e91df37463 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -1874,7 +1874,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) /* Validate some items in the main NetworkDef that need to align * with the chosen forward mode. */ - switch (def->forward.type) { + switch ((virNetworkForwardType)def->forward.type) { case VIR_NETWORK_FORWARD_NONE: break; @@ -1955,6 +1955,12 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt) goto error; } break; + + case VIR_NETWORK_FORWARD_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected forward type %d"), def->forward.type); + goto error; } VIR_FREE(stp); diff --git a/src/conf/network_event.c b/src/conf/network_event.c index e0d1a3d5ca..d005784b52 100644 --- a/src/conf/network_event.c +++ b/src/conf/network_event.c @@ -114,6 +114,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn, } case VIR_NETWORK_EVENT_ID_LAST: + default: break; } VIR_WARN("Unexpected event ID %d", event->eventID); diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index fd8f4e4a94..5dd945a07f 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -592,8 +592,14 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def) case VIR_NODE_DEV_CAP_MDEV_TYPES: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: - case VIR_NODE_DEV_CAP_LAST: break; + case VIR_NODE_DEV_CAP_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected node device capability %d"), + caps->data.type); + virBufferFreeAndReset(&buf); + return NULL; } virBufferAdjustIndent(&buf, -2); @@ -1884,12 +1890,16 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt, case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_SCSI_GENERIC: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Invalid capability type '%s' for '%s'"), + virNodeDevCapTypeToString(caps->data.type), def->name); + goto error; case VIR_NODE_DEV_CAP_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("unknown capability type '%d' for '%s'"), + _("Unexpected node device capability '%d' for '%s'"), caps->data.type, def->name); - ret = -1; - break; + goto error; } if (ret < 0) @@ -1967,6 +1977,7 @@ virNodeDeviceDefParseXML(xmlXPathContextPtr ctxt, def->devlinks[m++] = (char*)xmlNodeGetContent(node); break; case VIR_NODE_DEV_DEVNODE_LAST: + default: break; } } @@ -2213,6 +2224,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps) case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_LAST: + default: /* This case is here to shutup the compiler */ break; } @@ -2464,8 +2476,13 @@ virNodeDeviceUpdateCaps(virNodeDeviceDefPtr def) case VIR_NODE_DEV_CAP_MDEV_TYPES: case VIR_NODE_DEV_CAP_MDEV: case VIR_NODE_DEV_CAP_CCW_DEV: - case VIR_NODE_DEV_CAP_LAST: break; + case VIR_NODE_DEV_CAP_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected node device capability %d"), + cap->data.type); + return -1; } cap = cap->next; } diff --git a/src/conf/node_device_event.c b/src/conf/node_device_event.c index 312ef512d1..3b1e059b2c 100644 --- a/src/conf/node_device_event.c +++ b/src/conf/node_device_event.c @@ -146,6 +146,7 @@ virNodeDeviceEventDispatchDefaultFunc(virConnectPtr conn, } case VIR_NODE_DEVICE_EVENT_ID_LAST: + default: break; } VIR_WARN("Unexpected event ID %d", event->eventID); diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c index 9e8c725f9f..56f2800ea7 100644 --- a/src/conf/nwfilter_conf.c +++ b/src/conf/nwfilter_conf.c @@ -2398,6 +2398,7 @@ virNWFilterRuleDefFixup(virNWFilterRuleDefPtr rule) break; case VIR_NWFILTER_RULE_PROTOCOL_LAST: + default: break; } #undef COPY_NEG_SIGN diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c index 3a01049182..586fa539d2 100644 --- a/src/conf/nwfilter_params.c +++ b/src/conf/nwfilter_params.c @@ -60,6 +60,7 @@ virNWFilterVarValueFree(virNWFilterVarValuePtr val) VIR_FREE(val->u.array.values); break; case NWFILTER_VALUE_TYPE_LAST: + default: break; } VIR_FREE(val); @@ -92,6 +93,7 @@ virNWFilterVarValueCopy(const virNWFilterVarValue *val) } break; case NWFILTER_VALUE_TYPE_LAST: + default: break; } @@ -162,6 +164,7 @@ virNWFilterVarValueGetNthValue(const virNWFilterVarValue* val, unsigned int idx) res = val->u.array.values[idx]; break; case NWFILTER_VALUE_TYPE_LAST: + default: break; } @@ -179,6 +182,7 @@ virNWFilterVarValueGetCardinality(const virNWFilterVarValue *val) return val->u.array.nValues; break; case NWFILTER_VALUE_TYPE_LAST: + default: return 0; } return 0; @@ -246,6 +250,7 @@ virNWFilterVarValueAddValue(virNWFilterVarValuePtr val, char *value) break; case NWFILTER_VALUE_TYPE_LAST: + default: break; } @@ -283,6 +288,7 @@ virNWFilterVarValueDelNthValue(virNWFilterVarValuePtr val, unsigned int pos) break; case NWFILTER_VALUE_TYPE_LAST: + default: break; } @@ -305,6 +311,7 @@ virNWFilterVarValueDelValue(virNWFilterVarValuePtr val, const char *value) break; case NWFILTER_VALUE_TYPE_LAST: + default: break; } @@ -373,6 +380,7 @@ virNWFilterVarCombIterAddVariable(virNWFilterVarCombIterEntryPtr cie, minValue = 0; break; case VIR_NWFILTER_VAR_ACCESS_LAST: + default: return -1; } @@ -514,6 +522,7 @@ virNWFilterVarCombIterCreate(virNWFilterHashTablePtr hash, res->nIter++; break; case VIR_NWFILTER_VAR_ACCESS_LAST: + default: goto err_exit; } @@ -587,6 +596,7 @@ virNWFilterVarCombIterGetVarValue(virNWFilterVarCombIterPtr ci, } break; case VIR_NWFILTER_VAR_ACCESS_LAST: + default: return NULL; } @@ -940,6 +950,7 @@ virNWFilterVarAccessEqual(const virNWFilterVarAccess *a, return a->u.iterId == b->u.iterId; break; case VIR_NWFILTER_VAR_ACCESS_LAST: + default: break; } return false; @@ -1025,6 +1036,7 @@ virNWFilterVarAccessParse(const char *varAccess) dest->u.iterId = result; break; case VIR_NWFILTER_VAR_ACCESS_LAST: + default: goto err_exit; } @@ -1053,6 +1065,7 @@ virNWFilterVarAccessPrint(virNWFilterVarAccessPtr vap, virBufferPtr buf) virBufferAsprintf(buf, "[@%u]", vap->u.iterId); break; case VIR_NWFILTER_VAR_ACCESS_LAST: + default: break; } } @@ -1117,6 +1130,7 @@ virNWFilterVarAccessIsAvailable(const virNWFilterVarAccess *varAccess, case VIR_NWFILTER_VAR_ACCESS_ITERATOR: break; case VIR_NWFILTER_VAR_ACCESS_LAST: + default: return false; } diff --git a/src/conf/secret_event.c b/src/conf/secret_event.c index c130909282..ce5767a49a 100644 --- a/src/conf/secret_event.c +++ b/src/conf/secret_event.c @@ -147,6 +147,7 @@ virSecretEventDispatchDefaultFunc(virConnectPtr conn, } case VIR_SECRET_EVENT_ID_LAST: + default: break; } VIR_WARN("Unexpected event ID %d", event->eventID); diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c index f9b796878a..2f37adb875 100644 --- a/src/conf/storage_event.c +++ b/src/conf/storage_event.c @@ -147,6 +147,7 @@ virStoragePoolEventDispatchDefaultFunc(virConnectPtr conn, } case VIR_STORAGE_POOL_EVENT_ID_LAST: + default: break; } VIR_WARN("Unexpected event ID %d", event->eventID); diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c index ad0f27ee47..82c84b37fe 100644 --- a/src/conf/virnodedeviceobj.c +++ b/src/conf/virnodedeviceobj.c @@ -680,6 +680,7 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj, case VIR_NODE_DEV_CAP_MDEV: case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_LAST: + default: break; } } diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c index 799b8c9fa3..e6c5704989 100644 --- a/src/conf/virstorageobj.c +++ b/src/conf/virstorageobj.c @@ -1880,6 +1880,7 @@ virStoragePoolObjSourceFindDuplicateCb(const void *payload, case VIR_STORAGE_POOL_RBD: case VIR_STORAGE_POOL_LAST: + default: break; } -- 2.14.3

On 02/15/2018 11:43 AM, Daniel P. Berrangé wrote:
Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/conf/device_conf.c | 4 +- src/conf/domain_addr.c | 10 +- src/conf/domain_audit.c | 4 + src/conf/domain_conf.c | 468 ++++++++++++++++++++++++++++++++------- src/conf/domain_event.c | 1 + src/conf/interface_conf.c | 21 +- src/conf/netdev_bandwidth_conf.h | 4 +- src/conf/network_conf.c | 8 +- src/conf/network_event.c | 1 + src/conf/node_device_conf.c | 27 ++- src/conf/node_device_event.c | 1 + src/conf/nwfilter_conf.c | 1 + src/conf/nwfilter_params.c | 14 ++ src/conf/secret_event.c | 1 + src/conf/storage_event.c | 1 + src/conf/virnodedeviceobj.c | 1 + src/conf/virstorageobj.c | 1 + 17 files changed, 468 insertions(+), 100 deletions(-)
Ugh... A few more DEAD_ERROR* from switch stuff - I'm just going to disable it in my coverity check scripts. It'll be easier that way. Maybe some day in the far future gcc8 will be used in/for Coverity and they'll fix the problem ;-) Given the comments about a common enum error, I'll provide some feedback here without trying to cloud my mind with that...
diff --git a/src/conf/device_conf.c b/src/conf/device_conf.c index d69f94fadf..6037d290e9 100644 --- a/src/conf/device_conf.c +++ b/src/conf/device_conf.c @@ -83,7 +83,6 @@ virDomainDeviceInfoAddressIsEqual(const virDomainDeviceInfo *a,
switch ((virDomainDeviceAddressType) a->type) { case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE: - case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
LAST changes from a return true because of break ...
/* address types below don't have any specific data */ case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO: case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390: @@ -140,6 +139,9 @@ virDomainDeviceInfoAddressIsEqual(const virDomainDeviceInfo *a, if (memcmp(&a->addr.dimm, &b->addr.dimm, sizeof(a->addr.dimm))) return false; break; + case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST: + default: + return false;
... to a return false (and of course the default: case is added) ... Later on in virDomainChrSourceDefIsEqual the _LAST continues to return true when the default case is added and returns false.
}
return true; diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index df19c6be1a..98230fc267 100644 --- a/src/conf/domain_addr.c +++ b/src/conf/domain_addr.c
[...]
@@ -352,6 +354,11 @@ virDomainPCIAddressBusSetModel(virDomainPCIAddressBusPtr bus, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("PCI controller model was not set correctly")); return -1; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected PCI controller model %d"), model); + return -1;
For consistency, shouldn't LAST and default elicit the same Unexpected message?
}
bus->model = model; @@ -1753,6 +1760,7 @@ virDomainUSBAddressControllerModelToPorts(virDomainControllerDefPtr cont) case VIR_DOMAIN_CONTROLLER_MODEL_USB_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: + default: break; } return 0;
Could just return 0 instead of break (like done above in virDomainPCIControllerModelToConnectType) [...]
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 538dfc84bd..9cc6e87ccb 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c
[...]
@@ -2338,6 +2354,9 @@ virDomainChrSourceDefIsEqual(const virDomainChrSourceDef *src, case VIR_DOMAIN_CHR_TYPE_STDIO: case VIR_DOMAIN_CHR_TYPE_LAST: break; + + default: + return false;
... and here's an example where _LAST still returned true, but default returns false Shouldn't this follow the model of virDomainDeviceInfoAddressIsEqual where _LAST was changed from returning TRUE (because of break) to returning false? IDC which way we head with this, as long as it's consistent. Someday someone will "copy" one example or the other and someone else will note well it's done differently elsewhere leading to the conundrum of which approach is better.
}
return true;
[...]
virDomainDeviceInfoPtr @@ -3608,6 +3636,7 @@ virDomainDeviceGetInfo(virDomainDeviceDefPtr device) case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: + default: break; } return NULL;
The return NULL could be moved inside the switch, right? [...]
@@ -5854,16 +5911,24 @@ virDomainDefLifecycleActionAllowed(virDomainLifecycle type, case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART: case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME: case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE: - case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: return true; case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY: case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART: break; + case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected lifecycle action %d"), action); + return false; } break; case VIR_DOMAIN_LIFECYCLE_CRASH: - case VIR_DOMAIN_LIFECYCLE_LAST: return true; + case VIR_DOMAIN_LIFECYCLE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected lifecycle type %d"), type); + return false; }
With default: in place, the following is perhaps more "readable" if it's moved up into the one place where we break in the action switch and could fall through. I don't think anything else can fall thru
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
[...]
@@ -21433,6 +21635,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
The switch w/ VIR_DOMAIN_FEATURE_LAST is missing the default: label
/* coverity[dead_error_begin] */ case VIR_DOMAIN_HYPERV_LAST: + default: break; } } @@ -21457,6 +21660,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDefPtr src,
/* coverity[dead_error_begin] */ case VIR_DOMAIN_KVM_LAST: + default: break; } }
[...]
diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index fd8f4e4a94..5dd945a07f 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c
[...]
@@ -2213,6 +2224,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps) case VIR_NODE_DEV_CAP_VPORTS: case VIR_NODE_DEV_CAP_CCW_DEV: case VIR_NODE_DEV_CAP_LAST: + default: /* This case is here to shutup the compiler */'
Comment can probably be removed...
break; }
[...]
diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c index 3a01049182..586fa539d2 100644 --- a/src/conf/nwfilter_params.c +++ b/src/conf/nwfilter_params.c
[...]
@@ -179,6 +182,7 @@ virNWFilterVarValueGetCardinality(const virNWFilterVarValue *val) return val->u.array.nValues; break; case NWFILTER_VALUE_TYPE_LAST: + default: return 0; } return 0;
Not reachable now, right? [...]
diff --git a/src/conf/storage_event.c b/src/conf/storage_event.c index f9b796878a..2f37adb875 100644 --- a/src/conf/storage_event.c +++ b/src/conf/storage_event.c @@ -147,6 +147,7 @@ virStoragePoolEventDispatchDefaultFunc(virConnectPtr conn, }
case VIR_STORAGE_POOL_EVENT_ID_LAST: + default: break; } VIR_WARN("Unexpected event ID %d", event->eventID);
Probably could move the VIR_WARN inside the switch now. [...] John

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/cpu/cpu.c | 6 +++++- src/cpu/cpu_ppc64.c | 16 ++++++++++++---- src/cpu/cpu_x86.c | 13 +++++++++---- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 047e3b1112..6191840634 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -428,11 +428,15 @@ virCPUGetHost(virArch arch, break; case VIR_CPU_TYPE_AUTO: - case VIR_CPU_TYPE_LAST: virReportError(VIR_ERR_INVALID_ARG, _("unsupported CPU type: %s"), virCPUTypeToString(type)); goto error; + case VIR_CPU_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU type %d"), type); + goto error; } if (nodeInfo) { diff --git a/src/cpu/cpu_ppc64.c b/src/cpu/cpu_ppc64.c index 76582d4083..5234bc927f 100644 --- a/src/cpu/cpu_ppc64.c +++ b/src/cpu/cpu_ppc64.c @@ -460,11 +460,13 @@ ppc64MapLoadCallback(cpuMapElement element, case CPU_MAP_ELEMENT_MODEL: return ppc64ModelsLoad(map, ctxt, nodes, n); case CPU_MAP_ELEMENT_FEATURE: + return 0; case CPU_MAP_ELEMENT_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU map element %d"), element); + return -1; } - - return 0; } static struct ppc64_map * @@ -573,7 +575,7 @@ ppc64Compute(virCPUDefPtr host, if (cpu->type == VIR_CPU_TYPE_GUEST) { /* Guest CPU information */ virCPUCompareResult tmp; - switch (cpu->mode) { + switch ((virCPUMode)cpu->mode) { case VIR_CPU_MODE_HOST_MODEL: /* host-model only: * we need to take compatibility modes into account */ @@ -595,6 +597,12 @@ ppc64Compute(virCPUDefPtr host, * look up guest CPU information */ guest_model = ppc64ModelFromCPU(cpu, map); break; + + case VIR_CPU_MODE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU mode %d"), cpu->mode); + goto cleanup; } } else { /* Other host CPU information */ diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index b2398c5ad2..1aaf83e109 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -1122,8 +1122,12 @@ x86ModelFromCPU(const virCPUDef *cpu, /* coverity[dead_error_condition] */ case VIR_CPU_FEATURE_OPTIONAL: - case VIR_CPU_FEATURE_LAST: break; + case VIR_CPU_FEATURE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU feature policy %d"), fpol); + goto error; } } else if (x86DataAdd(&model->data, &feature->data) < 0) { goto error; @@ -1381,10 +1385,11 @@ x86MapLoadCallback(cpuMapElement element, case CPU_MAP_ELEMENT_MODEL: return x86ModelsLoad(map, ctxt, nodes, n); case CPU_MAP_ELEMENT_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU map element %d"), element); + return -1; } - - return 0; } -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- po/POTFILES.in | 1 + src/secret/secret_util.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/po/POTFILES.in b/po/POTFILES.in index 2859554690..e06aa730f8 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -166,6 +166,7 @@ src/rpc/virnetsocket.c src/rpc/virnetsshsession.c src/rpc/virnettlscontext.c src/secret/secret_driver.c +src/secret/secret_util.c src/security/security_apparmor.c src/security/security_dac.c src/security/security_driver.c diff --git a/src/secret/secret_util.c b/src/secret/secret_util.c index 16e43ab2cc..64d3e7b8bd 100644 --- a/src/secret/secret_util.c +++ b/src/secret/secret_util.c @@ -57,7 +57,7 @@ virSecretGetSecretString(virConnectPtr conn, virSecretPtr sec = NULL; int ret = -1; - switch (seclookupdef->type) { + switch ((virSecretLookupType)seclookupdef->type) { case VIR_SECRET_LOOKUP_TYPE_UUID: sec = conn->secretDriver->secretLookupByUUID(conn, seclookupdef->u.uuid); break; @@ -66,6 +66,15 @@ virSecretGetSecretString(virConnectPtr conn, sec = conn->secretDriver->secretLookupByUsage(conn, secretUsageType, seclookupdef->u.usage); break; + + case VIR_SECRET_LOOKUP_TYPE_NONE: + break; + + case VIR_SECRET_LOOKUP_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected secret lookup type %d"), seclookupdef->type); + goto cleanup; } if (!sec) -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libvirt_private.syms | 2 ++ src/xen/xen_driver.c | 17 ++++++++++++++++- src/xenconfig/xen_common.c | 6 +++++- src/xenconfig/xen_sxpr.c | 47 +++++++++++++++++++++++++++++++++++----------- src/xenconfig/xen_xl.c | 20 +++++++++++++++++--- 5 files changed, 76 insertions(+), 16 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3b14d7d158..87a9c85f09 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -402,6 +402,8 @@ virDomainInputBusTypeToString; virDomainInputDefFind; virDomainInputDefFree; virDomainInputDefGetPath; +virDomainInputTypeFromString; +virDomainInputTypeToString; virDomainIOMMUModelTypeFromString; virDomainIOMMUModelTypeToString; virDomainIOThreadIDAdd; diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index f521fd1f2c..0dee96d21a 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -344,7 +344,7 @@ xenDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, } if (dev->type == VIR_DOMAIN_DEVICE_VIDEO && dev->data.video->vram == 0) { - switch (dev->data.video->type) { + switch ((virDomainVideoType)dev->data.video->type) { case VIR_DOMAIN_VIDEO_TYPE_VGA: case VIR_DOMAIN_VIDEO_TYPE_CIRRUS: case VIR_DOMAIN_VIDEO_TYPE_VMVGA: @@ -359,6 +359,21 @@ xenDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, case VIR_DOMAIN_VIDEO_TYPE_QXL: /* Use 64M as the minimal video video memory for qxl device */ return 64 * 1024; + case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: + return 0; + case VIR_DOMAIN_VIDEO_TYPE_VBOX: + case VIR_DOMAIN_VIDEO_TYPE_PARALLELS: + case VIR_DOMAIN_VIDEO_TYPE_VIRTIO: + case VIR_DOMAIN_VIDEO_TYPE_GOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported video type %s"), + virDomainVideoTypeToString(dev->data.video->type)); + return -1; + case VIR_DOMAIN_VIDEO_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected video type %d"), dev->data.video->type); + return -1; } } diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c index c3fe5d39dc..900c2dd5f0 100644 --- a/src/xenconfig/xen_common.c +++ b/src/xenconfig/xen_common.c @@ -1721,7 +1721,11 @@ xenFormatCPUFeatures(virConfPtr conf, virDomainDefPtr def) return -1; case VIR_DOMAIN_TIMER_NAME_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected timer name %d"), + def->clock.timers[i]->name); + return -1; } } diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c index e868c05695..146947364c 100644 --- a/src/xenconfig/xen_sxpr.c +++ b/src/xenconfig/xen_sxpr.c @@ -212,7 +212,7 @@ xenParseSxprChar(const char *value, } } - switch (def->source->type) { + switch ((virDomainChrType)def->source->type) { case VIR_DOMAIN_CHR_TYPE_PTY: if (VIR_STRDUP(def->source->data.file.path, tty) < 0) goto error; @@ -304,6 +304,25 @@ xenParseSxprChar(const char *value, def->source->data.nix.listen = true; } break; + + case VIR_DOMAIN_CHR_TYPE_NULL: + case VIR_DOMAIN_CHR_TYPE_STDIO: + case VIR_DOMAIN_CHR_TYPE_DEV: + break; + case VIR_DOMAIN_CHR_TYPE_VC: + case VIR_DOMAIN_CHR_TYPE_SPICEVMC: + case VIR_DOMAIN_CHR_TYPE_SPICEPORT: + case VIR_DOMAIN_CHR_TYPE_NMDM: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported chardev type %s"), + virDomainChrTypeToString(def->source->type)); + goto error; + + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), def->source->type); + goto error; } return def; @@ -1931,8 +1950,12 @@ xenFormatSxprNet(virConnectPtr conn, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: - case VIR_DOMAIN_NET_TYPE_LAST: break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), def->type); + return -1; } if (def->ifname != NULL && @@ -2122,15 +2145,7 @@ xenFormatSxprInput(virDomainInputDefPtr input, if (input->bus != VIR_DOMAIN_INPUT_BUS_USB) return 0; - if (input->type != VIR_DOMAIN_INPUT_TYPE_MOUSE && - input->type != VIR_DOMAIN_INPUT_TYPE_TABLET && - input->type != VIR_DOMAIN_INPUT_TYPE_KBD) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected input type %d"), input->type); - return -1; - } - - switch (input->type) { + switch ((virDomainInputType)input->type) { case VIR_DOMAIN_INPUT_TYPE_MOUSE: virBufferAsprintf(buf, "(usbdevice %s)", "mouse"); break; @@ -2140,6 +2155,16 @@ xenFormatSxprInput(virDomainInputDefPtr input, case VIR_DOMAIN_INPUT_TYPE_KBD: virBufferAsprintf(buf, "(usbdevice %s)", "keyboard"); break; + case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported input type %s"), + virDomainInputTypeToString(input->type)); + return -1; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input type %d"), input->type); + return -1; } return 0; diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index e61784aff2..c098b0b4ee 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -1173,8 +1173,13 @@ xenFormatXLOS(virConfPtr conf, virDomainDefPtr def) case VIR_CPU_FEATURE_FORCE: case VIR_CPU_FEATURE_REQUIRE: case VIR_CPU_FEATURE_OPTIONAL: - case VIR_CPU_FEATURE_LAST: break; + case VIR_CPU_FEATURE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU feature policy %d"), + def->cpu->features[i].policy); + return -1; } } } @@ -1357,7 +1362,6 @@ xenFormatXLDiskSrcNet(virStorageSourcePtr src) case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: case VIR_STORAGE_NET_PROTOCOL_SSH: case VIR_STORAGE_NET_PROTOCOL_VXHS: - case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_NO_SUPPORT, _("Unsupported network block protocol '%s'"), @@ -1399,6 +1403,12 @@ xenFormatXLDiskSrcNet(virStorageSourcePtr src) ret = virBufferContentAndReset(&buf); break; + case VIR_STORAGE_NET_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage protocol %d"), + src->protocol); + goto cleanup; } cleanup: @@ -1433,8 +1443,12 @@ xenFormatXLDiskSrc(virStorageSourcePtr src, char **srcstr) case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: break; + default: + case VIR_STORAGE_TYPE_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), + actualType); } return 0; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/locking/lock_driver_sanlock.c | 6 +++++- src/locking/lock_manager.c | 2 ++ src/locking/sanlock_helper.c | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/locking/lock_driver_sanlock.c b/src/locking/lock_driver_sanlock.c index 345cf0a772..4a9971ac9f 100644 --- a/src/locking/lock_driver_sanlock.c +++ b/src/locking/lock_driver_sanlock.c @@ -859,11 +859,15 @@ virLockManagerSanlockRegisterKillscript(int sock, case VIR_DOMAIN_LOCK_FAILURE_RESTART: case VIR_DOMAIN_LOCK_FAILURE_IGNORE: - case VIR_DOMAIN_LOCK_FAILURE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Failure action %s is not supported by sanlock"), virDomainLockFailureTypeToString(action)); goto cleanup; + case VIR_DOMAIN_LOCK_FAILURE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected lock failure action %d"), action); + goto cleanup; } virBufferEscape(&buf, '\\', "\\ ", "%s", vmuri); diff --git a/src/locking/lock_manager.c b/src/locking/lock_manager.c index 4ef9f9e692..03e28f1159 100644 --- a/src/locking/lock_manager.c +++ b/src/locking/lock_manager.c @@ -97,6 +97,8 @@ static void virLockManagerLogParams(size_t nparams, virUUIDFormat(params[i].value.uuid, uuidstr); VIR_DEBUG(" key=%s type=uuid value=%s", params[i].key, uuidstr); break; + default: + break; } } } diff --git a/src/locking/sanlock_helper.c b/src/locking/sanlock_helper.c index 57e1cfb031..6a2f59e866 100644 --- a/src/locking/sanlock_helper.c +++ b/src/locking/sanlock_helper.c @@ -94,10 +94,13 @@ main(int argc, char **argv) case VIR_DOMAIN_LOCK_FAILURE_DEFAULT: case VIR_DOMAIN_LOCK_FAILURE_RESTART: case VIR_DOMAIN_LOCK_FAILURE_IGNORE: - case VIR_DOMAIN_LOCK_FAILURE_LAST: fprintf(stderr, _("unsupported failure action: '%s'\n"), virDomainLockFailureTypeToString(action)); break; + case VIR_DOMAIN_LOCK_FAILURE_LAST: + default: + fprintf(stderr, _("Unexpected failure action: %d\n"), action); + break; } cleanup: -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/test/test_driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 043caa9762..6eabfc1cfa 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2921,6 +2921,8 @@ testNodeGetCPUStats(virConnectPtr conn ATTRIBUTE_UNUSED, VIR_NODE_CPU_STATS_IOWAIT, 763600000) < 0) return -1; break; + default: + break; } } -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/remote/remote_driver.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 9ea726dc45..bc4842fca6 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1131,6 +1131,11 @@ doRemoteOpen(virConnectPtr conn, goto failed; #endif /* WIN32 */ + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected remote transport type %d"), transport); + goto failed; } /* switch (transport) */ @@ -3742,7 +3747,7 @@ remoteAuthenticate(virConnectPtr conn, struct private_data *priv, #if WITH_SASL static int remoteAuthCredVir2SASL(int vircred) { - switch (vircred) { + switch ((virConnectCredentialType)vircred) { case VIR_CRED_USERNAME: return SASL_CB_USER; @@ -3766,9 +3771,12 @@ static int remoteAuthCredVir2SASL(int vircred) case VIR_CRED_REALM: return SASL_CB_GETREALM; - } - return 0; + case VIR_CRED_EXTERNAL: + case VIR_CRED_LAST: + default: + return 0; + } } static int remoteAuthCredSASL2Vir(int vircred) @@ -3797,9 +3805,10 @@ static int remoteAuthCredSASL2Vir(int vircred) case SASL_CB_GETREALM: return VIR_CRED_REALM; - } - return 0; + default: + return 0; + } } /* -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/openvz/openvz_driver.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 9bd73d85c4..6c434dd13c 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -1866,6 +1866,9 @@ openvzDomainGetMemoryParameters(virDomainPtr domain, VIR_TYPED_PARAM_ULLONG, val) < 0) goto cleanup; break; + + default: + break; } } -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/security/security_apparmor.c | 12 +++++-- src/security/security_dac.c | 59 ++++++++++++++++++++++++++++------ src/security/security_selinux.c | 69 ++++++++++++++++++++++++++++++++-------- 3 files changed, 115 insertions(+), 25 deletions(-) diff --git a/src/security/security_apparmor.c b/src/security/security_apparmor.c index a9899923ac..7943743494 100644 --- a/src/security/security_apparmor.c +++ b/src/security/security_apparmor.c @@ -919,7 +919,10 @@ AppArmorSetSecurityHostdevLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - ret = 0; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsystem type %d"), + dev->source.subsys.type); break; } @@ -990,9 +993,14 @@ AppArmorSetChardevLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_CHR_TYPE_TCP: case VIR_DOMAIN_CHR_TYPE_SPICEVMC: case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: ret = 0; break; + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), + dev_source->type); + break; } done: diff --git a/src/security/security_dac.c b/src/security/security_dac.c index 74446d6644..7142b802f9 100644 --- a/src/security/security_dac.c +++ b/src/security/security_dac.c @@ -1009,7 +1009,10 @@ virSecurityDACSetHostdevLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - ret = 0; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsys type %d"), + dev->source.subsys.type); break; } @@ -1177,7 +1180,10 @@ virSecurityDACRestoreHostdevLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - ret = 0; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsys type %d"), + dev->source.subsys.type); break; } @@ -1265,9 +1271,13 @@ virSecurityDACSetChardevLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_CHR_TYPE_TCP: case VIR_DOMAIN_CHR_TYPE_SPICEVMC: case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: ret = 0; break; + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), dev_source->type); + break; } done: @@ -1328,9 +1338,13 @@ virSecurityDACRestoreChardevLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_CHR_TYPE_SPICEVMC: case VIR_DOMAIN_CHR_TYPE_SPICEPORT: case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: ret = 0; break; + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), dev_source->type); + break; } done: @@ -1372,6 +1386,10 @@ virSecurityDACSetTPMFileLabel(virSecurityManagerPtr mgr, false); break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), tpm->type); + ret = -1; break; } @@ -1393,6 +1411,10 @@ virSecurityDACRestoreTPMFileLabel(virSecurityManagerPtr mgr, false); break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), tpm->type); + ret = -1; break; } @@ -1475,9 +1497,13 @@ virSecurityDACSetInputLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_INPUT_TYPE_MOUSE: case VIR_DOMAIN_INPUT_TYPE_TABLET: case VIR_DOMAIN_INPUT_TYPE_KBD: - case VIR_DOMAIN_INPUT_TYPE_LAST: ret = 0; break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input type %d"), input->type); + break; } return ret; @@ -1499,9 +1525,13 @@ virSecurityDACRestoreInputLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_INPUT_TYPE_MOUSE: case VIR_DOMAIN_INPUT_TYPE_TABLET: case VIR_DOMAIN_INPUT_TYPE_KBD: - case VIR_DOMAIN_INPUT_TYPE_LAST: ret = 0; break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input type %d"), input->type); + break; } return ret; @@ -1522,10 +1552,14 @@ virSecurityDACRestoreMemoryLabel(virSecurityManagerPtr mgr, break; case VIR_DOMAIN_MEMORY_MODEL_DIMM: - case VIR_DOMAIN_MEMORY_MODEL_LAST: case VIR_DOMAIN_MEMORY_MODEL_NONE: ret = 0; break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), mem->model); + break; } return ret; @@ -1647,10 +1681,14 @@ virSecurityDACSetMemoryLabel(virSecurityManagerPtr mgr, break; case VIR_DOMAIN_MEMORY_MODEL_DIMM: - case VIR_DOMAIN_MEMORY_MODEL_LAST: case VIR_DOMAIN_MEMORY_MODEL_NONE: ret = 0; break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), mem->model); + break; } return ret; @@ -1903,9 +1941,10 @@ virSecurityDACGenLabel(virSecurityManagerPtr mgr, return 0; case VIR_DOMAIN_SECLABEL_DEFAULT: case VIR_DOMAIN_SECLABEL_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected security label type '%s'"), - virDomainSeclabelTypeToString(seclabel->type)); + _("unexpected security label type %d"), + seclabel->type); return rc; } diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index c26cdacd9f..a33d07b6ab 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -763,7 +763,7 @@ virSecuritySELinuxGenLabel(virSecurityManagerPtr mgr, VIR_DEBUG("type=%d", seclabel->type); - switch (seclabel->type) { + switch ((virDomainSeclabelType)seclabel->type) { case VIR_DOMAIN_SECLABEL_STATIC: if (!(ctx = context_new(seclabel->label))) { virReportSystemError(errno, @@ -832,10 +832,12 @@ virSecuritySELinuxGenLabel(virSecurityManagerPtr mgr, break; + case VIR_DOMAIN_SECLABEL_DEFAULT: + case VIR_DOMAIN_SECLABEL_LAST: default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("unexpected security label type '%s'"), - virDomainSeclabelTypeToString(seclabel->type)); + _("unexpected security label type '%d'"), + seclabel->type); goto cleanup; } @@ -1346,8 +1348,12 @@ virSecuritySELinuxSetInputLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_INPUT_TYPE_MOUSE: case VIR_DOMAIN_INPUT_TYPE_TABLET: case VIR_DOMAIN_INPUT_TYPE_KBD: - case VIR_DOMAIN_INPUT_TYPE_LAST: break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input type %d"), input->type); + return -1; } return 0; @@ -1374,8 +1380,12 @@ virSecuritySELinuxRestoreInputLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_INPUT_TYPE_MOUSE: case VIR_DOMAIN_INPUT_TYPE_TABLET: case VIR_DOMAIN_INPUT_TYPE_KBD: - case VIR_DOMAIN_INPUT_TYPE_LAST: break; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input type %d"), input->type); + return -1; } return rc; @@ -1402,8 +1412,12 @@ virSecuritySELinuxSetMemoryLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_DIMM: - case VIR_DOMAIN_MEMORY_MODEL_LAST: break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), mem->model); + return -1; } return 0; @@ -1429,9 +1443,13 @@ virSecuritySELinuxRestoreMemoryLabel(virSecurityManagerPtr mgr, case VIR_DOMAIN_MEMORY_MODEL_DIMM: case VIR_DOMAIN_MEMORY_MODEL_NONE: - case VIR_DOMAIN_MEMORY_MODEL_LAST: ret = 0; break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), mem->model); + return -1; } return ret; @@ -1473,6 +1491,9 @@ virSecuritySELinuxSetTPMFileLabel(virSecurityManagerPtr mgr, } break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), tpm->type); break; } @@ -1506,6 +1527,9 @@ virSecuritySELinuxRestoreTPMFileLabelInt(virSecurityManagerPtr mgr, } break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), tpm->type); break; } @@ -1860,7 +1884,10 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - ret = 0; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsystem type %d"), + dev->source.subsys.type); break; } @@ -1883,7 +1910,7 @@ virSecuritySELinuxSetHostdevCapsLabel(virSecurityManagerPtr mgr, if (secdef == NULL) return 0; - switch (dev->source.caps.type) { + switch ((virDomainHostdevCapsType)dev->source.caps.type) { case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_STORAGE: { if (vroot) { if (virAsprintf(&path, "%s/%s", vroot, @@ -1912,9 +1939,15 @@ virSecuritySELinuxSetHostdevCapsLabel(virSecurityManagerPtr mgr, break; } - default: + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET: ret = 0; break; + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev caps type %d"), + dev->source.caps.type); + break; } return ret; @@ -2101,7 +2134,10 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManagerPtr mgr, } case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - ret = 0; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsystem type %d"), + dev->source.subsys.type); break; } @@ -2118,7 +2154,7 @@ virSecuritySELinuxRestoreHostdevCapsLabel(virSecurityManagerPtr mgr, int ret = -1; char *path; - switch (dev->source.caps.type) { + switch ((virDomainHostdevCapsType)dev->source.caps.type) { case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_STORAGE: { if (vroot) { if (virAsprintf(&path, "%s/%s", vroot, @@ -2147,9 +2183,16 @@ virSecuritySELinuxRestoreHostdevCapsLabel(virSecurityManagerPtr mgr, break; } - default: + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET: ret = 0; break; + + case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsystem type %d"), + dev->source.subsys.type); + break; } return ret; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/rpc/virnetlibsshsession.c | 4 ++++ src/rpc/virnetservermdns.c | 5 ++++- src/rpc/virnetsshsession.c | 8 ++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/rpc/virnetlibsshsession.c b/src/rpc/virnetlibsshsession.c index 25f93cec97..25d65878b2 100644 --- a/src/rpc/virnetlibsshsession.c +++ b/src/rpc/virnetlibsshsession.c @@ -880,6 +880,10 @@ virNetLibsshAuthenticate(virNetLibsshSessionPtr sess) /* try to authenticate with password */ ret = virNetLibsshAuthenticatePassword(sess, auth); break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SSH auth method %d"), auth->method); + return -1; } if (ret == SSH_AUTH_ERROR) { diff --git a/src/rpc/virnetservermdns.c b/src/rpc/virnetservermdns.c index 0a2bc87322..7e3b7e632a 100644 --- a/src/rpc/virnetservermdns.c +++ b/src/rpc/virnetservermdns.c @@ -133,6 +133,7 @@ static void virNetServerMDNSGroupCallback(AvahiEntryGroup *g ATTRIBUTE_UNUSED, case AVAHI_ENTRY_GROUP_UNCOMMITED: case AVAHI_ENTRY_GROUP_REGISTERING: + default: ; } } @@ -249,7 +250,9 @@ static void virNetServerMDNSClientCallback(AvahiClient *c, case AVAHI_CLIENT_CONNECTING: VIR_DEBUG("Client connecting.... %p", mdns->client); - ; + break; + default: + break; } } diff --git a/src/rpc/virnetsshsession.c b/src/rpc/virnetsshsession.c index e742175654..40256d0f9a 100644 --- a/src/rpc/virnetsshsession.c +++ b/src/rpc/virnetsshsession.c @@ -813,6 +813,10 @@ virNetSSHAuthenticateKeyboardInteractive(virNetSSHSessionPtr sess, case VIR_NET_SSH_AUTHCB_OK: /* everything went fine, let's continue */ break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SSH auth code %d"), sess->authCbErr); + return -1; } if (ret == 0) @@ -897,6 +901,10 @@ virNetSSHAuthenticate(virNetSSHSessionPtr sess) if (strstr(auth_list, "password")) ret = virNetSSHAuthenticatePassword(sess, auth); break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SSH auth method %d"), auth->method); + return -1; } /* return on success or error */ -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/vbox/vbox_common.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 07f4308784..b7b8ddb2be 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -331,7 +331,7 @@ vboxGenerateMediumName(PRUint32 storageBus, break; case StorageBus_Null: - + default: return NULL; } @@ -380,11 +380,16 @@ vboxSetStorageController(virDomainControllerDefPtr controller, case VIR_DOMAIN_CONTROLLER_TYPE_CCID: case VIR_DOMAIN_CONTROLLER_TYPE_USB: case VIR_DOMAIN_CONTROLLER_TYPE_PCI: - case VIR_DOMAIN_CONTROLLER_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("The vbox driver does not support %s controller type"), virDomainControllerTypeToString(controller->type)); return -1; + case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller type %d"), + controller->type); + return -1; } /* libvirt scsi model => vbox scsi model */ @@ -417,6 +422,7 @@ vboxSetStorageController(virDomainControllerDefPtr controller, goto cleanup; case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected SCSI controller model %d"), controller->model); @@ -439,6 +445,7 @@ vboxSetStorageController(virDomainControllerDefPtr controller, break; case VIR_DOMAIN_CONTROLLER_MODEL_IDE_LAST: case VIR_DOMAIN_CONTROLLER_MODEL_IDE_DEFAULT: + default: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unexpected IDE controller model %d"), controller->model); @@ -1110,12 +1117,17 @@ vboxAttachDrives(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) break; case VIR_DOMAIN_DISK_DEVICE_LUN: - case VIR_DOMAIN_DISK_DEVICE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("The vbox driver does not support %s disk device"), virDomainDiskDeviceTypeToString(disk->device)); ret = -1; goto cleanup; + case VIR_DOMAIN_DISK_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk device type %d"), disk->device); + ret = -1; + goto cleanup; } switch ((virDomainDiskBus) disk->bus) { @@ -1150,12 +1162,17 @@ vboxAttachDrives(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) case VIR_DOMAIN_DISK_BUS_USB: case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SD: - case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("The vbox driver does not support %s bus type"), virDomainDiskBusTypeToString(disk->bus)); ret = -1; goto cleanup; + case VIR_DOMAIN_DISK_BUS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk device type %d"), disk->device); + ret = -1; + goto cleanup; } /* If disk source is specified, lookup IMedium - removable drives don't @@ -3158,6 +3175,7 @@ vboxDumpStorageControllers(virDomainDefPtr def, IMachine *machine) case StorageControllerType_IntelAhci: case StorageControllerType_I82078: case StorageControllerType_Null: + default: model = -1; break; @@ -3183,6 +3201,7 @@ vboxDumpStorageControllers(virDomainDefPtr def, IMachine *machine) break; case StorageBus_Null: + default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported null storage bus")); @@ -3415,6 +3434,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) break; case StorageBus_Null: + default: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Unsupported null storage bus")); goto cleanup; @@ -3437,6 +3457,7 @@ vboxDumpDisks(virDomainDefPtr def, vboxDriverPtr data, IMachine *machine) case DeviceType_USB: case DeviceType_SharedFolder: case DeviceType_Null: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unsupported vbox device type: %d"), deviceType); goto cleanup; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libxl/libxl_conf.c | 57 ++++++++++++++++++++++++++++++++++++++++-------- src/libxl/libxl_domain.c | 23 ++++++++++++++++++- src/libxl/libxl_driver.c | 14 ++++++++++++ src/libxl/libxl_logger.c | 2 ++ 4 files changed, 86 insertions(+), 10 deletions(-) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 970cff205b..e2136a8065 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -118,10 +118,9 @@ libxlActionFromVirLifecycle(virDomainLifecycleAction action) return LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_RESTART; case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: - break; + default: + return 0; } - - return 0; } @@ -147,6 +146,7 @@ libxlMakeDomCreateInfo(libxl_ctx *ctx, case VIR_TRISTATE_SWITCH_ABSENT: case VIR_TRISTATE_SWITCH_LAST: + default: break; } } else { @@ -333,6 +333,10 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, return -1; case VIR_DOMAIN_TIMER_NAME_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected timer name %d"), + def->clock.timers[i]->name); break; } } @@ -379,8 +383,13 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, case VIR_CPU_FEATURE_FORCE: case VIR_CPU_FEATURE_REQUIRE: case VIR_CPU_FEATURE_OPTIONAL: - case VIR_CPU_FEATURE_LAST: break; + case VIR_CPU_FEATURE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU feature policy %d"), + def->cpu->features[i].policy); + return -1; } } } @@ -716,7 +725,6 @@ libxlDiskSetDiscard(libxl_device_disk *x_disk, int discard) #if defined(LIBXL_HAVE_LIBXL_DEVICE_DISK_DISCARD_ENABLE) switch ((virDomainDiskDiscard)discard) { case VIR_DOMAIN_DISK_DISCARD_DEFAULT: - case VIR_DOMAIN_DISK_DISCARD_LAST: break; case VIR_DOMAIN_DISK_DISCARD_UNMAP: libxl_defbool_set(&x_disk->discard_enable, true); @@ -724,6 +732,11 @@ libxlDiskSetDiscard(libxl_device_disk *x_disk, int discard) case VIR_DOMAIN_DISK_DISCARD_IGNORE: libxl_defbool_set(&x_disk->discard_enable, false); break; + case VIR_DOMAIN_DISK_DISCARD_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk discard mode %d"), discard); + return -1; } return 0; #else @@ -757,7 +770,6 @@ libxlMakeNetworkDiskSrcStr(virStorageSourcePtr src, case VIR_STORAGE_NET_PROTOCOL_SHEEPDOG: case VIR_STORAGE_NET_PROTOCOL_SSH: case VIR_STORAGE_NET_PROTOCOL_VXHS: - case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: virReportError(VIR_ERR_NO_SUPPORT, _("Unsupported network block protocol '%s'"), @@ -809,6 +821,11 @@ libxlMakeNetworkDiskSrcStr(virStorageSourcePtr src, ret = virBufferContentAndReset(&buf); break; + case VIR_STORAGE_NET_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage protocol %d"), src->protocol); + goto cleanup; } cleanup: @@ -1062,6 +1079,7 @@ libxlUpdateDiskDef(virDomainDiskDefPtr l_disk, libxl_device_disk *x_disk) driver = "phy"; break; case LIBXL_DISK_BACKEND_UNKNOWN: + default: break; } if (driver) @@ -1179,11 +1197,15 @@ libxlMakeNic(virDomainDefPtr def, case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_DIRECT: case VIR_DOMAIN_NET_TYPE_HOSTDEV: - case VIR_DOMAIN_NET_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported interface type %s"), virDomainNetTypeToString(l_nic->type)); goto cleanup; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), l_nic->type); + goto cleanup; } if (l_nic->domain_name) { @@ -1340,8 +1362,16 @@ libxlMakeVfb(virPortAllocatorPtr graphicsports, case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported graphics type %s"), + virDomainGraphicsTypeToString(l_vfb->type)); + return -1; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unexpected graphics type %d"), + l_vfb->type); + return -1; } return 0; @@ -1465,7 +1495,11 @@ libxlMakeBuildInfoVfb(virPortAllocatorPtr graphicsports, libxl_defbool_set(&b_info->u.hvm.spice.agent_mouse, false); break; case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected mouse mode %d"), + l_vfb->data.spice.mousemode); + return -1; } #ifdef LIBXL_HAVE_SPICE_VDAGENT @@ -1754,6 +1788,11 @@ libxlDriverGetDom0MaxmemConf(libxlDriverConfigPtr cfg, case 'T': multiplier = 1024 * 1024 * 1024; break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory suffix '%c'"), *p); + goto cleanup; + } } *maxmem = *maxmem * multiplier; diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index feb092ba48..73941ca2d3 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -324,7 +324,7 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, if (dev->type == VIR_DOMAIN_DEVICE_VIDEO && def->os.type == VIR_DOMAIN_OSTYPE_HVM) { int dm_type = libxlDomainGetEmulatorType(def); - switch (dev->data.video->type) { + switch ((virDomainVideoType)dev->data.video->type) { case VIR_DOMAIN_VIDEO_TYPE_VGA: case VIR_DOMAIN_VIDEO_TYPE_XEN: if (dev->data.video->vram == 0) { @@ -346,6 +346,24 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev, if (dev->data.video->vram == 0) dev->data.video->vram = 128 * 1024; break; + + case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: + break; + case VIR_DOMAIN_VIDEO_TYPE_VMVGA: + case VIR_DOMAIN_VIDEO_TYPE_VBOX: + case VIR_DOMAIN_VIDEO_TYPE_PARALLELS: + case VIR_DOMAIN_VIDEO_TYPE_VIRTIO: + case VIR_DOMAIN_VIDEO_TYPE_GOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported video type %s"), + virDomainVideoTypeToString(dev->data.video->type)); + return -1; + case VIR_DOMAIN_VIDEO_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected video type %d"), + dev->data.video->type); + return -1; } } @@ -469,6 +487,7 @@ libxlDomainShutdownThread(void *opaque) case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY: case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART: case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: + default: goto endjob; } } else if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) { @@ -486,6 +505,7 @@ libxlDomainShutdownThread(void *opaque) goto restart; case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE: case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: + default: goto endjob; case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY: libxlDomainAutoCoreDump(driver, vm); @@ -511,6 +531,7 @@ libxlDomainShutdownThread(void *opaque) case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY: case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART: case VIR_DOMAIN_LIFECYCLE_ACTION_LAST: + default: goto endjob; } } else { diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 4b52de36f5..68164d1b91 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2266,6 +2266,9 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, virDomainDefSetVcpus(def, nvcpus) < 0) goto endjob; break; + + default: + break; } ret = 0; @@ -3510,7 +3513,15 @@ libxlDomainAttachDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev) #ifndef LIBXL_HAVE_PVUSB case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: #endif + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported hostdev subsystem type %s"), + virDomainHostdevSubsysTypeToString(hostdev->source.subsys.type)); + return -1; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unexpected hostdev subsystem type %d"), + hostdev->source.subsys.type); return -1; } @@ -4876,6 +4887,9 @@ libxlDomainGetNumaParameters(virDomainPtr dom, nodeset = NULL; break; + + default: + break; } } diff --git a/src/libxl/libxl_logger.c b/src/libxl/libxl_logger.c index 40404826fc..39f9c724b1 100644 --- a/src/libxl/libxl_logger.c +++ b/src/libxl/libxl_logger.c @@ -156,6 +156,8 @@ libxlLoggerNew(const char *logDir, virLogPriority minLevel) case VIR_LOG_ERROR: logger.minLevel = XTL_ERROR; break; + default: + break; } logger.logDir = logDir; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/libvirt_private.syms | 2 + src/qemu/qemu_alias.c | 3 + src/qemu/qemu_block.c | 22 ++- src/qemu/qemu_blockjob.c | 1 + src/qemu/qemu_capabilities.c | 23 ++- src/qemu/qemu_cgroup.c | 9 +- src/qemu/qemu_command.c | 395 ++++++++++++++++++++++++++++++++------- src/qemu/qemu_domain.c | 197 ++++++++++++++----- src/qemu/qemu_domain_address.c | 46 ++++- src/qemu/qemu_driver.c | 109 +++++++++-- src/qemu/qemu_hostdev.c | 5 +- src/qemu/qemu_hotplug.c | 58 +++++- src/qemu/qemu_interface.c | 12 +- src/qemu/qemu_migration.c | 24 ++- src/qemu/qemu_migration_cookie.c | 6 +- src/qemu/qemu_monitor.c | 13 +- src/qemu/qemu_monitor_json.c | 67 +++++-- src/qemu/qemu_monitor_text.c | 3 + src/qemu/qemu_parse_command.c | 12 +- src/qemu/qemu_process.c | 108 ++++++++++- 20 files changed, 918 insertions(+), 197 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 87a9c85f09..6a9e109855 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -198,6 +198,8 @@ virDomainBootTypeFromString; virDomainBootTypeToString; virDomainCapabilitiesPolicyTypeToString; virDomainCapsFeatureTypeToString; +virDomainChrChannelTargetTypeFromString; +virDomainChrChannelTargetTypeToString; virDomainChrConsoleTargetTypeFromString; virDomainChrConsoleTargetTypeToString; virDomainChrDefForeach; diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index ae30f7df82..834cc4a319 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -110,6 +110,9 @@ qemuAssignDeviceChrAlias(virDomainDefPtr def, break; case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), chr->deviceType); return -1; } diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 585f0255ee..13fcd5a6a8 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -515,11 +515,17 @@ qemuBlockStorageSourceBuildJSONSocketAddress(virStorageNetHostDefPtr host, break; case VIR_STORAGE_NET_HOST_TRANS_RDMA: - case VIR_STORAGE_NET_HOST_TRANS_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("transport protocol '%s' is not yet supported"), virStorageNetHostTransportTypeToString(host->transport)); goto cleanup; + + case VIR_STORAGE_NET_HOST_TRANS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage transport %d"), + host->transport); + goto cleanup; } VIR_STEAL_PTR(ret, server); @@ -1005,7 +1011,9 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported storage type %s"), + virStorageTypeToString(actualType)); return NULL; case VIR_STORAGE_TYPE_NETWORK: @@ -1056,9 +1064,19 @@ qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src) case VIR_STORAGE_NET_PROTOCOL_NONE: case VIR_STORAGE_NET_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage protocol %d"), + src->protocol); return NULL; } break; + + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), actualType); + return NULL; } if (virJSONValueObjectAdd(fileprops, "S:node-name", src->nodestorage, NULL) < 0) { diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 617e4ee564..2a08e09d99 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -199,6 +199,7 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver, break; case VIR_DOMAIN_BLOCK_JOB_LAST: + default: break; } diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index b5eb8cf46a..a07bf00ebc 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2598,9 +2598,12 @@ virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps, /* 'full' is non-NULL only if we have data from both QEMU and * virCPUGetHost */ return cpuData->full ? cpuData->full : cpuData->reported; - } - return NULL; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU model type %d"), cpuType); + return NULL; + } } @@ -2643,11 +2646,10 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps, cpus = qemuCaps->tcgCPUModels; return cpus && cpus->nmodels > 0; + default: case VIR_CPU_MODE_LAST: - break; + return false; } - - return false; } @@ -3447,7 +3449,10 @@ virQEMUCapsInitCPUModelX86(virQEMUCapsPtr qemuCaps, break; case QEMU_MONITOR_CPU_PROPERTY_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected monitor CPU property type %d"), prop->type); + goto cleanup; } } @@ -3705,7 +3710,10 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps, break; case QEMU_MONITOR_CPU_PROPERTY_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected monitor CPU property type %d"), prop->type); + goto cleanup; } if ((str = virXMLPropString(ctxt->node, "migratable"))) { @@ -4161,6 +4169,7 @@ virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qemuCaps, break; case QEMU_MONITOR_CPU_PROPERTY_LAST: + default: break; } diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index b604edb31c..6c32303c18 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -239,7 +239,10 @@ qemuSetupTPMCgroup(virDomainObjPtr vm) ret = qemuSetupChrSourceCgroup(vm, &dev->data.passthrough.source); break; case VIR_DOMAIN_TPM_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), dev->type); + return -1; } return ret; @@ -263,6 +266,8 @@ qemuSetupInputCgroup(virDomainObjPtr vm, VIR_CGROUP_DEVICE_RW, false); virDomainAuditCgroupPath(vm, priv->cgroup, "allow", dev->source.evdev, "rw", ret); break; + default: + break; } return ret; @@ -286,6 +291,8 @@ qemuTeardownInputCgroup(virDomainObjPtr vm, VIR_CGROUP_DEVICE_RWM, false); virDomainAuditCgroupPath(vm, priv->cgroup, "deny", dev->source.evdev, "rwm", ret); break; + default: + break; } return ret; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 33ca1e0960..71e697dd41 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -642,7 +642,13 @@ qemuBuildGeneralSecinfoURI(virURIPtr uri, break; case VIR_DOMAIN_SECRET_INFO_TYPE_AES: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Unsupported secret info type aes")); + return -1; case VIR_DOMAIN_SECRET_INFO_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected secret info type %d"), secinfo->type); return -1; } @@ -690,6 +696,9 @@ qemuBuildRBDSecinfoURI(virBufferPtr buf, break; case VIR_DOMAIN_SECRET_INFO_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected secret info type %d"), secinfo->type); return -1; } @@ -1013,9 +1022,9 @@ qemuBuildNetworkDriveStr(virStorageSourcePtr src, case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: + default: virReportError(VIR_ERR_INTERNAL_ERROR, - _("Unexpected network protocol '%s'"), - virStorageNetProtocolTypeToString(src->protocol)); + _("Unexpected network protocol %d"), src->protocol); goto cleanup; } @@ -1056,8 +1065,12 @@ qemuGetDriveSourceString(virStorageSourcePtr src, case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: break; + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), actualType); + goto cleanup; } ret = 0; @@ -1259,7 +1272,7 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk, } } - switch (disk->bus) { + switch ((virDomainDiskBus)disk->bus) { case VIR_DOMAIN_DISK_BUS_SCSI: if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -1319,7 +1332,14 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk, case VIR_DOMAIN_DISK_BUS_VIRTIO: case VIR_DOMAIN_DISK_BUS_XEN: case VIR_DOMAIN_DISK_BUS_SD: + case VIR_DOMAIN_DISK_BUS_USB: + case VIR_DOMAIN_DISK_BUS_UML: + case VIR_DOMAIN_DISK_BUS_SATA: break; + case VIR_DOMAIN_DISK_BUS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk bus %d"), disk->bus); } if (disk->src->readonly && @@ -1868,11 +1888,15 @@ qemuCheckIOThreads(const virDomainDef *def, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: - case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("IOThreads not available for bus %s target %s"), virDomainDiskBusTypeToString(disk->bus), disk->dst); return false; + case VIR_DOMAIN_DISK_BUS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk bus %d"), disk->bus); + return false; } /* Can we find the disk iothread in the iothreadid list? */ @@ -2277,7 +2301,7 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, /* bootDevs will get translated into either bootindex=N or boot=on * depending on what qemu supports */ for (i = 0; i < def->os.nBootDevs; i++) { - switch (def->os.bootDevs[i]) { + switch ((virDomainBootOrder)def->os.bootDevs[i]) { case VIR_DOMAIN_BOOT_CDROM: bootCD = i + 1; break; @@ -2287,6 +2311,13 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, case VIR_DOMAIN_BOOT_DISK: bootDisk = i + 1; break; + case VIR_DOMAIN_BOOT_NET: + break; + case VIR_DOMAIN_BOOT_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk boot device %d"), def->os.bootDevs[i]); + return -1; } } } @@ -2308,7 +2339,7 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, if (disk->info.bootIndex) { bootindex = disk->info.bootIndex; } else { - switch (disk->device) { + switch ((virDomainDiskDevice)disk->device) { case VIR_DOMAIN_DISK_DEVICE_CDROM: bootindex = bootCD; bootCD = 0; @@ -2322,6 +2353,11 @@ qemuBuildDiskDriveCommandLine(virCommandPtr cmd, bootindex = bootDisk; bootDisk = 0; break; + case VIR_DOMAIN_DISK_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk device type %d"), disk->device); + return -1; } if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX)) { driveBoot = !!bootindex; @@ -2677,6 +2713,7 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, goto error; case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected SCSI controller model %d"), def->model); @@ -2782,6 +2819,7 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, goto error; case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected PCI controller model %d"), def->model); @@ -2791,11 +2829,15 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef, case VIR_DOMAIN_CONTROLLER_TYPE_IDE: case VIR_DOMAIN_CONTROLLER_TYPE_FDC: - case VIR_DOMAIN_CONTROLLER_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported controller type: %s"), virDomainControllerTypeToString(def->type)); goto error; + case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller type %d"), def->type); + goto error; } if (def->queues) @@ -3146,8 +3188,12 @@ qemuBuildMemoryBackendStr(virJSONValuePtr *backendProps, break; case VIR_DOMAIN_MEMORY_ACCESS_DEFAULT: - case VIR_DOMAIN_MEMORY_ACCESS_LAST: break; + case VIR_DOMAIN_MEMORY_ACCESS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory access mode %d"), memAccess); + goto cleanup; } } else { *backendType = "memory-backend-ram"; @@ -3329,9 +3375,13 @@ qemuBuildMemoryDeviceStr(virDomainMemoryDefPtr mem) break; case VIR_DOMAIN_MEMORY_MODEL_NONE: - case VIR_DOMAIN_MEMORY_MODEL_LAST: break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), mem->model); + return NULL; } if (virBufferCheckError(&buf) < 0) @@ -3664,8 +3714,12 @@ qemuBuildHostNetStr(virDomainNetDefPtr net, case VIR_DOMAIN_NET_TYPE_HOSTDEV: /* Should have been handled earlier via PCI/USB hotplug code. */ - case VIR_DOMAIN_NET_TYPE_LAST: break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), netType); + goto cleanup; } if (vlan >= 0) { @@ -3959,7 +4013,10 @@ qemuBuildVirtioInputDevStr(const virDomainDef *def, virQEMUBuildBufferEscapeComma(&buf, dev->source.evdev); break; case VIR_DOMAIN_INPUT_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input type %d"), dev->type); + goto error; } if (qemuBuildDeviceAddressStr(&buf, def, &dev->info, qemuCaps) < 0) @@ -3985,7 +4042,7 @@ qemuBuildUSBInputDevStr(const virDomainDef *def, { virBuffer buf = VIR_BUFFER_INITIALIZER; - switch (dev->type) { + switch ((virDomainInputType)dev->type) { case VIR_DOMAIN_INPUT_TYPE_MOUSE: virBufferAsprintf(&buf, "usb-mouse,id=%s", dev->info.alias); break; @@ -4001,6 +4058,16 @@ qemuBuildUSBInputDevStr(const virDomainDef *def, } virBufferAsprintf(&buf, "usb-kbd,id=%s", dev->info.alias); break; + case VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported input type %s"), + virDomainInputTypeToString(dev->type)); + goto error; + case VIR_DOMAIN_INPUT_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input type %d"), dev->type); + goto error; } if (qemuBuildDeviceAddressStr(&buf, def, &dev->info, qemuCaps) < 0) @@ -4023,7 +4090,7 @@ qemuBuildInputDevStr(char **devstr, virDomainInputDefPtr input, virQEMUCapsPtr qemuCaps) { - switch (input->bus) { + switch ((virDomainInputBus)input->bus) { case VIR_DOMAIN_INPUT_BUS_USB: if (!(*devstr = qemuBuildUSBInputDevStr(def, input, qemuCaps))) return -1; @@ -4033,6 +4100,21 @@ qemuBuildInputDevStr(char **devstr, if (!(*devstr = qemuBuildVirtioInputDevStr(def, input, qemuCaps))) return -1; break; + + case VIR_DOMAIN_INPUT_BUS_PS2: + /* nada */ + break; + case VIR_DOMAIN_INPUT_BUS_XEN: + case VIR_DOMAIN_INPUT_BUS_PARALLELS: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported input bus %s"), + virDomainInputBusTypeToString(input->bus)); + return -1; + case VIR_DOMAIN_INPUT_BUS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input bus %d"), input->bus); + return -1; } return 0; } @@ -4105,11 +4187,15 @@ qemuBuildSoundDevStr(const virDomainDef *def, model = "sb16"; break; case VIR_DOMAIN_SOUND_MODEL_PCSPK: /* pc-speaker is handled separately */ - case VIR_DOMAIN_SOUND_MODEL_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("sound card model '%s' is not supported by qemu"), virDomainSoundModelTypeToString(sound->model)); goto error; + case VIR_DOMAIN_SOUND_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected sound model %d"), sound->model); + goto error; } virBufferAsprintf(&buf, "%s,id=%s", model, sound->info.alias); @@ -4488,11 +4574,15 @@ qemuBuildPCIHostdevDevStr(const virDomainDef *def, case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("invalid PCI passthrough type '%s'"), virDomainHostdevSubsysPCIBackendTypeToString(backend)); goto error; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev PCI backend %d"), backend); + goto error; } virBufferAddLit(&buf, ",host="); @@ -5432,13 +5522,30 @@ qemuBuildSclpDevStr(virDomainChrDefPtr dev) { virBuffer buf = VIR_BUFFER_INITIALIZER; if (dev->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE) { - switch (dev->targetType) { + switch ((virDomainChrConsoleTargetType)dev->targetType) { case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLP: virBufferAddLit(&buf, "sclpconsole"); break; case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SCLPLM: virBufferAddLit(&buf, "sclplmconsole"); break; + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE: + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL: + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN: + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_UML: + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO: + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC: + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported console target type %s"), + virDomainChrConsoleTargetTypeToString(dev->targetType)); + goto error; + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected console target type %d"), + dev->targetType); + goto error; } } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -5472,7 +5579,6 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager, switch ((virDomainRNGBackend) rng->backend) { case VIR_DOMAIN_RNG_BACKEND_RANDOM: - case VIR_DOMAIN_RNG_BACKEND_LAST: /* no chardev backend is needed */ return 0; @@ -5482,6 +5588,12 @@ qemuBuildRNGBackendChrdevStr(virLogManagerPtr logManager, rng->info.alias, qemuCaps, true, chardevStdioLogd))) return -1; + break; + case VIR_DOMAIN_RNG_BACKEND_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend %d"), rng->backend); + return -1; } return 0; @@ -5533,8 +5645,9 @@ qemuBuildRNGBackendProps(virDomainRNGDefPtr rng, break; case VIR_DOMAIN_RNG_BACKEND_LAST: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("unknown rng-random backend")); + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend %d"), rng->backend); goto cleanup; } @@ -6028,6 +6141,11 @@ qemuBuildClockArgStr(virDomainClockDefPtr def) case VIR_DOMAIN_TIMER_TRACK_WALL: virBufferAddLit(&buf, ",clock=host"); break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected timer tracking mode %d"), + def->timers[i]->track); + goto error; } switch (def->timers[i]->tickpolicy) { @@ -6046,6 +6164,11 @@ qemuBuildClockArgStr(virDomainClockDefPtr def) _("unsupported rtc timer tickpolicy '%s'"), virDomainTimerTickpolicyTypeToString(def->timers[i]->tickpolicy)); goto error; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected timer tick policy %d"), + def->timers[i]->tickpolicy); + goto error; } break; /* no need to check other timers - there is only one rtc */ } @@ -6115,7 +6238,6 @@ qemuBuildClockCommandLine(virCommandPtr cmd, case VIR_DOMAIN_TIMER_NAME_KVMCLOCK: case VIR_DOMAIN_TIMER_NAME_HYPERVCLOCK: /* Timers above are handled when building -cpu. */ - case VIR_DOMAIN_TIMER_NAME_LAST: break; case VIR_DOMAIN_TIMER_NAME_RTC: @@ -6137,6 +6259,11 @@ qemuBuildClockCommandLine(virCommandPtr cmd, _("unsupported rtc tickpolicy '%s'"), virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy)); return -1; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected timer tick policy %d"), + def->clock.timers[i]->tickpolicy); + return -1; } } else if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_RTC) && (def->clock.timers[i]->tickpolicy @@ -6191,6 +6318,11 @@ qemuBuildClockCommandLine(virCommandPtr cmd, _("unsupported pit tickpolicy '%s'"), virDomainTimerTickpolicyTypeToString(def->clock.timers[i]->tickpolicy)); return -1; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected timer tick policy %d"), + def->clock.timers[i]->tickpolicy); + return -1; } break; @@ -6215,6 +6347,12 @@ qemuBuildClockCommandLine(virCommandPtr cmd, } } break; + case VIR_DOMAIN_TIMER_NAME_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected timer name %d"), + def->clock.timers[i]->name); + return -1; } } @@ -6480,7 +6618,11 @@ qemuBuildIOMMUCommandLine(virCommandPtr cmd, } break; case VIR_DOMAIN_IOMMU_MODEL_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unsupported iommu model %d"), + iommu->model); + return -1; } if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MACHINE_IOMMU)) @@ -6519,13 +6661,19 @@ qemuBuildIOMMUCommandLine(virCommandPtr cmd, virBufferAsprintf(&opts, ",device-iotlb=%s", virTristateSwitchTypeToString(iommu->iotlb)); } - case VIR_DOMAIN_IOMMU_MODEL_LAST: break; + case VIR_DOMAIN_IOMMU_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unsupported iommu model %d"), + iommu->model); + goto cleanup; } virCommandAddArg(cmd, "-device"); virCommandAddArgBuffer(cmd, &opts); ret = 0; + cleanup: virBufferFreeAndReset(&opts); return ret; } @@ -6641,7 +6789,11 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, break; case VIR_CPU_MODE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU mode %d"), + cpu->mode); + goto cleanup; } if (ARCH_IS_S390(def->os.arch) && cpu->features && @@ -6674,8 +6826,13 @@ qemuBuildCpuModelArgStr(virQEMUDriverPtr driver, break; case VIR_CPU_FEATURE_OPTIONAL: - case VIR_CPU_FEATURE_LAST: break; + case VIR_CPU_FEATURE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU feature policy %d"), + cpu->features[i].policy); + goto cleanup; } } @@ -6811,6 +6968,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd, /* coverity[dead_error_begin] */ case VIR_DOMAIN_HYPERV_LAST: + default: break; } } @@ -6833,6 +6991,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd, /* coverity[dead_error_begin] */ case VIR_DOMAIN_KVM_LAST: + default: break; } } @@ -6865,7 +7024,11 @@ qemuBuildCpuCommandLine(virCommandPtr cmd, break; case VIR_CPU_CACHE_MODE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU cache mode %d"), + cache->mode); + goto cleanup; } if (hostOff && @@ -7226,12 +7389,16 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, _("IOMMU device: '%s' is only supported with " "Q35 machines"), virDomainIOMMUModelTypeToString(def->iommu->model)); - return -1; + goto cleanup; } virBufferAddLit(&buf, ",iommu=on"); break; case VIR_DOMAIN_IOMMU_MODEL_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected iommu model %d"), + def->iommu->model); + goto cleanup; } } @@ -7268,7 +7435,11 @@ qemuBuildMachineCommandLine(virCommandPtr cmd, virBufferAddLit(&buf, ",kernel_irqchip=on"); break; case VIR_DOMAIN_IOAPIC_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected ioapic type %d"), + def->ioapic); + goto cleanup; } } @@ -7757,7 +7928,11 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPtr cfg, break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), + glisten->type); + goto error; } if (graphics->data.vnc.sharePolicy) { @@ -7888,7 +8063,11 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg, hasInsecure = true; break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), + glisten->type); + goto error; } if (cfg->spiceSASL) { @@ -7952,9 +8131,14 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg, virBufferAddLit(&opt, "plaintext-channel=default,"); break; case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY: - case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_LAST: /* nothing */ break; + case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected spice channel mode %d"), + graphics->data.spice.defaultMode); + goto error; } for (i = 0; i < VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_LAST; i++) { @@ -7985,6 +8169,12 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg, case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY: break; + case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected spice channel mode %d"), + graphics->data.spice.channels[i]); + goto error; } } @@ -8110,11 +8300,15 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfigPtr cfg, case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: - case VIR_DOMAIN_GRAPHICS_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported graphics type '%s'"), virDomainGraphicsTypeToString(graphics->type)); return -1; + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), graphics->type); + return -1; } return 0; @@ -8163,11 +8357,16 @@ qemuBuildVhostuserCommandLine(virQEMUDriverPtr driver, case VIR_DOMAIN_CHR_TYPE_SPICEVMC: case VIR_DOMAIN_CHR_TYPE_SPICEPORT: case VIR_DOMAIN_CHR_TYPE_NMDM: - case VIR_DOMAIN_CHR_TYPE_LAST: - virReportError(VIR_ERR_INTERNAL_ERROR, + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("vhost-user type '%s' not supported"), virDomainChrTypeToString(net->data.vhostuser->type)); goto error; + case VIR_DOMAIN_CHR_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev type %d"), + net->data.vhostuser->type); + goto error; } if (queues > 1 && @@ -8349,14 +8548,12 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, */ ret = 0; goto cleanup; - break; case VIR_DOMAIN_NET_TYPE_VHOSTUSER: ret = qemuBuildVhostuserCommandLine(driver, logManager, cmd, def, net, qemuCaps, bootindex, chardevStdioLogd); goto cleanup; - break; case VIR_DOMAIN_NET_TYPE_USER: case VIR_DOMAIN_NET_TYPE_SERVER: @@ -8364,9 +8561,13 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: - case VIR_DOMAIN_NET_TYPE_LAST: /* nada */ break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } /* For types whose implementations use a netdev on the host, add @@ -8400,7 +8601,6 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: - case VIR_DOMAIN_NET_TYPE_LAST: /* These types don't use a network device on the host, but * instead use some other type of connection to the emulated * device in the qemu process. @@ -8411,7 +8611,12 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver, * up in the list of interfaces on the host - it's just some * PCI device.) */ - break; + break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } /* Set bandwidth or warn if requested and not supported. */ @@ -8926,7 +9131,10 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, break; case VIR_DOMAIN_SHMEM_MODEL_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected shmem model %d"), shmem->model); + return -1; } if (!devstr) @@ -8970,10 +9178,9 @@ qemuChrSerialTargetModelToCaps(virDomainChrSerialTargetModel targetModel) return QEMU_CAPS_DEVICE_PL011; case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: - break; + default: + return 0; } - - return 0; } @@ -9127,7 +9334,7 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager, virDomainChrDefPtr channel = def->channels[i]; char *devstr; - switch (channel->targetType) { + switch ((virDomainChrChannelTargetType)channel->targetType) { case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_GUESTFWD: if (!(devstr = qemuBuildChrChardevStr(logManager, cmd, cfg, def, channel->source, @@ -9167,6 +9374,19 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager, if (qemuBuildChrDeviceCommandLine(cmd, def, channel, qemuCaps) < 0) return -1; break; + + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_NONE: + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported channel target type %s"), + virDomainChrChannelTargetTypeToString(channel->targetType)); + return -1; + + case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected channel target type %d"), channel->targetType); + return -1; } } @@ -9387,7 +9607,7 @@ qemuBuildRedirdevCommandLine(virLogManagerPtr logManager, } -static void +static int qemuBuildDomainLoaderCommandLine(virCommandPtr cmd, virDomainDefPtr def) { @@ -9396,7 +9616,7 @@ qemuBuildDomainLoaderCommandLine(virCommandPtr cmd, int unit = 0; if (!loader) - return; + return 0; switch ((virDomainLoader) loader->type) { case VIR_DOMAIN_LOADER_TYPE_ROM: @@ -9438,11 +9658,14 @@ qemuBuildDomainLoaderCommandLine(virCommandPtr cmd, break; case VIR_DOMAIN_LOADER_TYPE_LAST: - /* nada */ - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected loader type %d"), loader->type); + return -1; } virBufferFreeAndReset(&buf); + return 0; } @@ -9496,8 +9719,13 @@ qemuBuildTPMBackendStr(const virDomainDef *def, switch (tpm->type) { case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH: - if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH)) - goto no_support; + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("The QEMU executable %s does not support TPM " + "backend type %s"), + def->emulator, type); + goto error; + } tpmdev = tpm->data.passthrough.source.data.file.path; if (!(cancel_path = virTPMCreateCancelPath(tpmdev))) @@ -9543,6 +9771,9 @@ qemuBuildTPMBackendStr(const virDomainDef *def, break; case VIR_DOMAIN_TPM_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), tpm->type); goto error; } @@ -9551,12 +9782,6 @@ qemuBuildTPMBackendStr(const virDomainDef *def, return virBufferContentAndReset(&buf); - no_support: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("The QEMU executable %s does not support TPM " - "backend type %s"), - def->emulator, type); - error: VIR_FREE(devset); VIR_FREE(cancel_path); @@ -9730,8 +9955,13 @@ qemuBuildPanicCommandLine(virCommandPtr cmd, /* default model value was changed before in post parse */ case VIR_DOMAIN_PANIC_MODEL_DEFAULT: - case VIR_DOMAIN_PANIC_MODEL_LAST: break; + case VIR_DOMAIN_PANIC_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected panic model %d"), + def->panics[i]->model); + return -1; } } @@ -9787,7 +10017,7 @@ qemuBuildCommandLineValidate(virQEMUDriverPtr driver, } for (i = 0; i < def->ngraphics; ++i) { - switch (def->graphics[i]->type) { + switch ((virDomainGraphicsType)def->graphics[i]->type) { case VIR_DOMAIN_GRAPHICS_TYPE_SDL: ++sdl; break; @@ -9799,8 +10029,16 @@ qemuBuildCommandLineValidate(virQEMUDriverPtr driver, break; case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported graphics type %s"), + virDomainGraphicsTypeToString(def->graphics[i]->type)); + return -1; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), + def->graphics[i]->type); + return -1; } } @@ -9900,7 +10138,8 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, if (qemuBuildCpuCommandLine(cmd, driver, def, qemuCaps) < 0) goto error; - qemuBuildDomainLoaderCommandLine(cmd, def); + if (qemuBuildDomainLoaderCommandLine(cmd, def) < 0) + goto error; if (!migrateURI && !snapshot && qemuDomainAlignMemorySizes(def) < 0) goto error; @@ -10144,14 +10383,18 @@ qemuBuildSerialChrDeviceStr(char **deviceStr, case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: - /* Except from _LAST, which is just a guard value and will never - * be used, all of the above are platform devices, which means + /* All of the above are platform devices, which means * qemuBuildSerialCommandLine() will have taken the appropriate * branch and we will not have ended up here. */ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid target model for serial device")); goto error; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected serial target model %d"), + serial->targetModel); + goto error; } virBufferAsprintf(&cmd, "%s,chardev=char%s,id=%s", @@ -10213,8 +10456,16 @@ qemuBuildChannelChrDeviceStr(char **deviceStr, case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_XEN: case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_NONE: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("unsupported channel target type %s"), + virDomainChrChannelTargetTypeToString(chr->targetType)); + goto cleanup; case VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_LAST: - return ret; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected channel target type %d"), + chr->targetType); + goto cleanup; } ret = 0; @@ -10251,10 +10502,15 @@ qemuBuildConsoleChrDeviceStr(char **deviceStr, case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_UML: case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LXC: case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_OPENVZ: - case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported console target type %s"), - NULLSTR(virDomainChrConsoleTargetTypeToString(chr->targetType))); + virDomainChrConsoleTargetTypeToString(chr->targetType)); + goto cleanup; + case VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected console target type %d"), + chr->targetType); goto cleanup; } @@ -10289,6 +10545,9 @@ qemuBuildChrDeviceStr(char **deviceStr, break; case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), chr->deviceType); return ret; } diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 7697de69e4..28aba63fb3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -175,9 +175,9 @@ qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job, case QEMU_ASYNC_JOB_NONE: case QEMU_ASYNC_JOB_LAST: ATTRIBUTE_FALLTHROUGH; + default: + return "none"; } - - return "none"; } int @@ -199,12 +199,12 @@ qemuDomainAsyncJobPhaseFromString(qemuDomainAsyncJob job, case QEMU_ASYNC_JOB_NONE: case QEMU_ASYNC_JOB_LAST: ATTRIBUTE_FALLTHROUGH; + default: + if (STREQ(phase, "none")) + return 0; + else + return -1; } - - if (STREQ(phase, "none")) - return 0; - else - return -1; } @@ -416,9 +416,6 @@ static virDomainJobType qemuDomainJobStatusToType(qemuDomainJobStatus status) { switch (status) { - case QEMU_DOMAIN_JOB_STATUS_NONE: - break; - case QEMU_DOMAIN_JOB_STATUS_ACTIVE: case QEMU_DOMAIN_JOB_STATUS_MIGRATING: case QEMU_DOMAIN_JOB_STATUS_QEMU_COMPLETED: @@ -434,9 +431,11 @@ qemuDomainJobStatusToType(qemuDomainJobStatus status) case QEMU_DOMAIN_JOB_STATUS_CANCELED: return VIR_DOMAIN_JOB_CANCELLED; - } - return VIR_DOMAIN_JOB_NONE; + case QEMU_DOMAIN_JOB_STATUS_NONE: + default: + return VIR_DOMAIN_JOB_NONE; + } } int @@ -473,6 +472,7 @@ qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo, break; case QEMU_DOMAIN_JOB_STATS_TYPE_NONE: + default: break; } @@ -716,10 +716,12 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo, return qemuDomainDumpJobInfoToParams(jobInfo, type, params, nparams); case QEMU_DOMAIN_JOB_STATS_TYPE_NONE: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected job stats type %d"), jobInfo->statsType); + return -1; } - return -1; } @@ -973,6 +975,7 @@ qemuDomainSecretInfoFree(qemuDomainSecretInfoPtr *secinfo) break; case VIR_DOMAIN_SECRET_INFO_TYPE_LAST: + default: break; } @@ -3186,7 +3189,10 @@ qemuDomainDefCPUPostParse(virDomainDefPtr def) break; case VIR_CPU_CACHE_MODE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU cache mode %d"), cache->mode); + return -1; } } @@ -3216,7 +3222,10 @@ qemuDomainDefCPUPostParse(virDomainDefPtr def) break; case VIR_CPU_MODE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU mode %d"), def->cpu->mode); + return -1; } return 0; @@ -3498,6 +3507,7 @@ qemuDomainNetSupportsCoalesce(virDomainNetType type) case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_LAST: + default: break; } return false; @@ -3544,6 +3554,7 @@ qemuDomainChrSourceDefValidate(const virDomainChrSourceDef *def) case VIR_DOMAIN_CHR_TYPE_SPICEPORT: case VIR_DOMAIN_CHR_TYPE_NMDM: case VIR_DOMAIN_CHR_TYPE_LAST: + default: break; } @@ -3567,10 +3578,9 @@ qemuDomainChrSerialTargetTypeToAddressType(int targetType) case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - break; + default: + return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; } - - return VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE; } @@ -3593,10 +3603,9 @@ qemuDomainChrSerialTargetModelToTargetType(int targetModel) return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP; case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: - break; + default: + return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE; } - - return VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE; } @@ -3639,8 +3648,12 @@ qemuDomainChrTargetDefValidate(const virDomainChrDef *chr) break; case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: break; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected serial target type %d"), chr->targetType); + return -1; } /* Validate target model */ @@ -3665,17 +3678,25 @@ qemuDomainChrTargetDefValidate(const virDomainChrDef *chr) break; case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: break; + case VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected serial target model %d"), chr->targetModel); + return -1; } break; case VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE: case VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL: case VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL: - case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: /* Nothing to do */ break; + case VIR_DOMAIN_CHR_DEVICE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected chardev device type %d"), chr->deviceType); + return -1; } return 0; @@ -3809,7 +3830,10 @@ qemuDomainWatchdogDefValidate(const virDomainWatchdogDef *dev, break; case VIR_DOMAIN_WATCHDOG_MODEL_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected watchdog model %d"), dev->model); + return -1; } return 0; @@ -3932,11 +3956,12 @@ qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev, static int qemuDomainDeviceDefValidateVideo(const virDomainVideoDef *video) { - switch (video->type) { + switch ((virDomainVideoType)video->type) { case VIR_DOMAIN_VIDEO_TYPE_XEN: case VIR_DOMAIN_VIDEO_TYPE_VBOX: case VIR_DOMAIN_VIDEO_TYPE_PARALLELS: case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: + case VIR_DOMAIN_VIDEO_TYPE_GOP: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("video type '%s' is not supported with QEMU"), virDomainVideoTypeToString(video->type)); @@ -3946,8 +3971,12 @@ qemuDomainDeviceDefValidateVideo(const virDomainVideoDef *video) case VIR_DOMAIN_VIDEO_TYPE_VMVGA: case VIR_DOMAIN_VIDEO_TYPE_QXL: case VIR_DOMAIN_VIDEO_TYPE_VIRTIO: - case VIR_DOMAIN_VIDEO_TYPE_LAST: break; + case VIR_DOMAIN_VIDEO_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected video type %d"), video->type); + return -1; } if (!video->primary && @@ -4125,6 +4154,7 @@ qemuDomainCheckSCSIControllerModel(virQEMUCapsPtr qemuCaps, return false; case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unexpected SCSI controller model %d"), model); @@ -4216,8 +4246,12 @@ qemuDomainDeviceDefValidateControllerSCSI(const virDomainControllerDef *controll case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSISAS1078: case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: break; + case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller SCSI model %d"), controller->model); + return -1; } return 0; @@ -4264,8 +4298,12 @@ qemuDomainDeviceDefValidateControllerPCI(const virDomainControllerDef *controlle case VIR_DOMAIN_CONTROLLER_MODEL_PCI_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller PCI model %d"), model); + return -1; } pciopts = &controller->opts.pciopts; @@ -4495,9 +4533,13 @@ qemuDomainDeviceDefValidateControllerPCI(const virDomainControllerDef *controlle break; case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller PCI model %d"), model); + return -1; } return 0; @@ -4563,8 +4605,12 @@ qemuDomainDeviceDefValidateController(const virDomainControllerDef *controller, case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: case VIR_DOMAIN_CONTROLLER_TYPE_CCID: case VIR_DOMAIN_CONTROLLER_TYPE_USB: - case VIR_DOMAIN_CONTROLLER_TYPE_LAST: break; + case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller type %d"), controller->type); + return -1; } return ret; @@ -4667,8 +4713,12 @@ qemuDomainDeviceDefValidate(const virDomainDeviceDef *dev, case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: case VIR_DOMAIN_DEVICE_NONE: - case VIR_DOMAIN_DEVICE_LAST: break; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } virObjectUnref(qemuCaps); @@ -4969,8 +5019,12 @@ qemuDomainControllerDefPostParse(virDomainControllerDefPtr cont, case VIR_DOMAIN_CONTROLLER_TYPE_CCID: case VIR_DOMAIN_CONTROLLER_TYPE_IDE: case VIR_DOMAIN_CONTROLLER_TYPE_FDC: - case VIR_DOMAIN_CONTROLLER_TYPE_LAST: break; + case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller type %d"), cont->type); + return -1; } return 0; @@ -5027,9 +5081,12 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr, chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE; break; case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: - /* Nothing to do */ break; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected serial target type %d"), chr->targetType); + return -1; } } @@ -5951,9 +6008,14 @@ qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver, case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: - case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: /* Nothing to do */ break; + case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected serial target type %d"), + serial->targetType); + goto cleanup; } } } @@ -6919,8 +6981,8 @@ qemuDomainCheckDiskStartupPolicy(virQEMUDriverPtr driver, break; case VIR_DOMAIN_STARTUP_POLICY_LAST: - /* this should never happen */ - break; + default: + return -1; } qemuDomainCheckRemoveOptionalDisk(driver, vm, diskIndex); @@ -8117,6 +8179,9 @@ qemuDomainDefValidateMemoryHotplugDevice(const virDomainMemoryDef *mem, case VIR_DOMAIN_MEMORY_MODEL_NONE: case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), mem->model); return -1; } @@ -8203,8 +8268,12 @@ qemuDomainDefValidateMemoryHotplug(const virDomainDef *def, break; case VIR_DOMAIN_MEMORY_MODEL_NONE: - case VIR_DOMAIN_MEMORY_MODEL_LAST: break; + case VIR_DOMAIN_MEMORY_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected memory model %d"), def->mems[i]->model); + return -1; } /* already existing devices don't need to be checked on hotplug */ @@ -8821,9 +8890,9 @@ qemuDomainNetSupportsMTU(virDomainNetType type) case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_LAST: - break; + default: + return false; } - return false; } int @@ -9276,14 +9345,22 @@ qemuDomainGetHostdevPath(virDomainDefPtr def, perm = VIR_CGROUP_DEVICE_RW; break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsystem type %d"), + dev->source.subsys.type); + goto cleanup; } break; case VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES: - case VIR_DOMAIN_HOSTDEV_MODE_LAST: /* nada */ break; + case VIR_DOMAIN_HOSTDEV_MODE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev mode %d"), dev->mode); + goto cleanup; } if (tmpPath) { @@ -9965,8 +10042,10 @@ qemuDomainSetupTPM(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, break; case VIR_DOMAIN_TPM_TYPE_LAST: - /* nada */ - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected TPM type %d"), dev->type); + return -1; } VIR_DEBUG("Setup TPM"); @@ -10054,9 +10133,12 @@ qemuDomainSetupRNG(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, return -1; case VIR_DOMAIN_RNG_BACKEND_EGD: - case VIR_DOMAIN_RNG_BACKEND_LAST: - /* nada */ break; + case VIR_DOMAIN_RNG_BACKEND_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend %d"), rng->backend); + return -1; } return 0; @@ -10110,7 +10192,10 @@ qemuDomainSetupLoader(virQEMUDriverConfigPtr cfg ATTRIBUTE_UNUSED, break; case VIR_DOMAIN_LOADER_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected loader type %d"), loader->type); + goto cleanup; } } @@ -10319,6 +10404,7 @@ qemuDomainNamespaceAvailable(qemuDomainNamespace ns ATTRIBUTE_UNUSED) # endif break; case QEMU_DOMAIN_NS_LAST: + default: break; } @@ -10988,8 +11074,12 @@ qemuDomainNamespaceSetupRNG(virDomainObjPtr vm, break; case VIR_DOMAIN_RNG_BACKEND_EGD: - case VIR_DOMAIN_RNG_BACKEND_LAST: break; + case VIR_DOMAIN_RNG_BACKEND_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend %d"), rng->backend); + return -1; } if (path && qemuDomainNamespaceMknodPath(vm, path) < 0) @@ -11011,8 +11101,12 @@ qemuDomainNamespaceTeardownRNG(virDomainObjPtr vm, break; case VIR_DOMAIN_RNG_BACKEND_EGD: - case VIR_DOMAIN_RNG_BACKEND_LAST: break; + case VIR_DOMAIN_RNG_BACKEND_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected RNG backend %d"), rng->backend); + return -1; } if (path && qemuDomainNamespaceUnlinkPath(vm, path) < 0) @@ -11529,6 +11623,7 @@ qemuProcessEventFree(struct qemuProcessEvent *event) VIR_FREE(event->data); break; case QEMU_PROCESS_EVENT_LAST: + default: break; } VIR_FREE(event); diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c index de565dbf74..8695e7cc07 100644 --- a/src/qemu/qemu_domain_address.c +++ b/src/qemu/qemu_domain_address.c @@ -542,6 +542,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_CONTROLLER_MODEL_USB_QUSB2: /* xen only */ case VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE: case VIR_DOMAIN_CONTROLLER_MODEL_USB_LAST: + default: return 0; } @@ -573,6 +574,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, return pciFlags; case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST: + default: return 0; } @@ -582,6 +584,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_CONTROLLER_TYPE_FDC: case VIR_DOMAIN_CONTROLLER_TYPE_CCID: case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + default: /* should be 0 */ return pciFlags; } @@ -625,6 +628,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_SOUND_MODEL_PCSPK: case VIR_DOMAIN_SOUND_MODEL_USB: case VIR_DOMAIN_SOUND_MODEL_LAST: + default: return 0; } @@ -642,6 +646,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: case VIR_DOMAIN_DISK_BUS_LAST: + default: return 0; } @@ -754,6 +759,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_MEMBALLOON_MODEL_XEN: case VIR_DOMAIN_MEMBALLOON_MODEL_NONE: case VIR_DOMAIN_MEMBALLOON_MODEL_LAST: + default: return 0; } @@ -763,6 +769,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, return virtioFlags; case VIR_DOMAIN_RNG_MODEL_LAST: + default: return 0; } @@ -775,6 +782,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_WATCHDOG_MODEL_IB700: case VIR_DOMAIN_WATCHDOG_MODEL_DIAG288: case VIR_DOMAIN_WATCHDOG_MODEL_LAST: + default: return 0; } @@ -795,6 +803,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: case VIR_DOMAIN_VIDEO_TYPE_GOP: case VIR_DOMAIN_VIDEO_TYPE_LAST: + default: return 0; } @@ -811,6 +820,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_INPUT_BUS_XEN: case VIR_DOMAIN_INPUT_BUS_PARALLELS: case VIR_DOMAIN_INPUT_BUS_LAST: + default: return 0; } @@ -826,6 +836,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_NONE: case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_LAST: + default: return 0; } @@ -841,17 +852,14 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev, case VIR_DOMAIN_DEVICE_LEASE: case VIR_DOMAIN_DEVICE_GRAPHICS: case VIR_DOMAIN_DEVICE_IOMMU: + return 0; case VIR_DOMAIN_DEVICE_LAST: case VIR_DOMAIN_DEVICE_NONE: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); return 0; } - - /* We can never get here, because all cases are covered in the - * switch, and they all return, but the compiler will still - * complain "control reaches end of non-void function" unless - * we add the following return. - */ - return 0; } @@ -1576,7 +1584,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, for (i = 0; i < def->ncontrollers; i++) { virDomainControllerDefPtr cont = def->controllers[i]; - switch (cont->type) { + switch ((virDomainControllerType)cont->type) { case VIR_DOMAIN_CONTROLLER_TYPE_SATA: /* Verify that the first SATA controller is at 00:1F.2 the * q35 machine type *always* has a SATA controller at this @@ -1660,6 +1668,19 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def, } } break; + + case VIR_DOMAIN_CONTROLLER_TYPE_IDE: + case VIR_DOMAIN_CONTROLLER_TYPE_FDC: + case VIR_DOMAIN_CONTROLLER_TYPE_SCSI: + case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL: + case VIR_DOMAIN_CONTROLLER_TYPE_CCID: + break; + + case VIR_DOMAIN_CONTROLLER_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller type %d"), cont->type); + goto cleanup; } } @@ -1958,6 +1979,8 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def, addr.function = 2; addr.multi = VIR_TRISTATE_SWITCH_ABSENT; break; + default: + break; } if (foundAddr) { @@ -2187,6 +2210,7 @@ qemuDomainPCIControllerSetDefaultModelName(virDomainControllerDefPtr cont, case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: break; } } @@ -2574,8 +2598,12 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def, case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_SWITCH_UPSTREAM_PORT: case VIR_DOMAIN_CONTROLLER_MODEL_PCIE_ROOT: case VIR_DOMAIN_CONTROLLER_MODEL_PCI_DEFAULT: - case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: break; + case VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected controller PCI model %d"), cont->model); + goto cleanup; } /* check if every PCI bridge controller's index is larger than diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 0b8976010f..54da651c65 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4563,6 +4563,8 @@ syncNicRxFilterMultiMode(char *ifname, virNetDevRxFilterPtr guestFilter, ifname); } break; + default: + break; } } } @@ -4889,6 +4891,7 @@ static void qemuProcessEventHandler(void *data, void *opaque) processMonitorEOFEvent(driver, vm); break; case QEMU_PROCESS_EVENT_LAST: + default: break; } @@ -7753,11 +7756,15 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live attach of device '%s' is not supported"), virDomainDeviceTypeToString(dev->type)); break; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } if (alias) { @@ -7852,11 +7859,15 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("live detach of device '%s' is not supported"), virDomainDeviceTypeToString(dev->type)); break; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } if (ret == 0) @@ -7968,11 +7979,15 @@ qemuDomainUpdateDeviceLive(virConnectPtr conn, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("live update of device '%s' is not supported"), virDomainDeviceTypeToString(dev->type)); break; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } return ret; @@ -8155,11 +8170,15 @@ qemuDomainAttachDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent attach of device '%s' is not supported"), virDomainDeviceTypeToString(dev->type)); return -1; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) @@ -8338,11 +8357,15 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent detach of device '%s' is not supported"), virDomainDeviceTypeToString(dev->type)); return -1; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) @@ -8425,11 +8448,15 @@ qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent update of device '%s' is not supported"), virDomainDeviceTypeToString(dev->type)); return -1; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + return -1; } if (virDomainDefPostParse(vmdef, caps, parse_flags, xmlopt, NULL) < 0) @@ -13268,6 +13295,11 @@ qemuDomainGetJobInfoDumpStats(virQEMUDriverPtr driver, VIR_DEBUG("dump completed, bytes written='%llu'", jobInfo->stats.dump.completed); break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected dump status %d"), jobInfo->stats.dump.status); + return -1; } return 0; @@ -13329,6 +13361,11 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver, case QEMU_DOMAIN_JOB_STATS_TYPE_NONE: break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected job stats type %d"), jobInfo->statsType); + goto cleanup; } ret = 0; @@ -14120,23 +14157,30 @@ qemuDomainSnapshotPrepareDiskExternalInactive(virDomainSnapshotDiskDefPtr snapdi case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: case VIR_STORAGE_NET_PROTOCOL_VXHS: - case VIR_STORAGE_NET_PROTOCOL_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("external inactive snapshots are not supported on " "'network' disks using '%s' protocol"), virStorageNetProtocolTypeToString(domdisk->src->protocol)); return -1; + case VIR_STORAGE_NET_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage protocol %d"), snapdisk->src->protocol); + return -1; } break; case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("external inactive snapshots are not supported on " "'%s' disks"), virStorageTypeToString(domDiskType)); return -1; + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), domDiskType); } switch ((virStorageType) snapDiskType) { @@ -14148,11 +14192,14 @@ qemuDomainSnapshotPrepareDiskExternalInactive(virDomainSnapshotDiskDefPtr snapdi case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("external inactive snapshots are not supported on " "'%s' disks"), virStorageTypeToString(snapDiskType)); return -1; + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), snapDiskType); } if (qemuDomainSnapshotPrepareDiskShared(snapdisk, domdisk) < 0) @@ -14197,24 +14244,31 @@ qemuDomainSnapshotPrepareDiskExternalActive(virDomainSnapshotDiskDefPtr snapdisk case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: case VIR_STORAGE_NET_PROTOCOL_VXHS: - case VIR_STORAGE_NET_PROTOCOL_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("external active snapshots are not supported on " "'network' disks using '%s' protocol"), virStorageNetProtocolTypeToString(snapdisk->src->protocol)); return -1; - + case VIR_STORAGE_NET_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage protocol %d"), snapdisk->src->protocol); + return -1; } break; case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("external active snapshots are not supported on " "'%s' disks"), virStorageTypeToString(actualType)); return -1; + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), actualType); + return -1; } if (qemuDomainSnapshotPrepareDiskShared(snapdisk, domdisk) < 0) @@ -14315,23 +14369,31 @@ qemuDomainSnapshotPrepareDiskInternal(virConnectPtr conn, case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: case VIR_STORAGE_NET_PROTOCOL_VXHS: - case VIR_STORAGE_NET_PROTOCOL_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("internal inactive snapshots are not supported on " "'network' disks using '%s' protocol"), virStorageNetProtocolTypeToString(disk->src->protocol)); return -1; + case VIR_STORAGE_NET_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage protocol %d"), disk->src->protocol); + return -1; } break; case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_VOLUME: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("internal inactive snapshots are not supported on " "'%s' disks"), virStorageTypeToString(actualType)); return -1; + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage type %d"), actualType); + return -1; } return 0; @@ -14425,10 +14487,14 @@ qemuDomainSnapshotPrepare(virConnectPtr conn, break; case VIR_DOMAIN_SNAPSHOT_LOCATION_DEFAULT: - case VIR_DOMAIN_SNAPSHOT_LOCATION_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("unexpected code path")); goto cleanup; + case VIR_DOMAIN_SNAPSHOT_LOCATION_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected snapshot location type %d"), disk->snapshot); + goto cleanup; } } @@ -15176,10 +15242,14 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, /* invalid states */ case VIR_DOMAIN_NOSTATE: case VIR_DOMAIN_BLOCKED: /* invalid state, unused in qemu */ - case VIR_DOMAIN_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid domain state %s"), virDomainStateTypeToString(vm->state.state)); goto cleanup; + case VIR_DOMAIN_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected domain state %d"), vm->state.state); + goto endjob; } /* We are going to modify the domain below. Internal snapshots would use @@ -16089,12 +16159,16 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, case VIR_DOMAIN_NOSTATE: case VIR_DOMAIN_BLOCKED: - case VIR_DOMAIN_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid target domain state '%s'. Refusing " "snapshot reversion"), virDomainStateTypeToString(snap->def->state)); goto endjob; + case VIR_DOMAIN_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected domain state %d"), snap->def->state); + goto endjob; } ret = 0; @@ -21182,6 +21256,7 @@ qemuDomainModifyLifecycleAction(virDomainDefPtr def, def->onCrash = action; break; case VIR_DOMAIN_LIFECYCLE_LAST: + default: break; } } diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 73d26f4c63..724a72867a 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -240,7 +240,10 @@ qemuHostdevPreparePCIDevicesCheckSupport(virDomainHostdevDefPtr *hostdevs, case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev PCI backend %d"), *backend); + return false; } } diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0d7d02c25b..ac66df9ab9 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -778,15 +778,23 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn, case VIR_DOMAIN_DISK_BUS_UML: case VIR_DOMAIN_DISK_BUS_SATA: case VIR_DOMAIN_DISK_BUS_SD: - case VIR_DOMAIN_DISK_BUS_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("disk bus '%s' cannot be hotplugged."), virDomainDiskBusTypeToString(disk->bus)); + goto cleanup; + case VIR_DOMAIN_DISK_BUS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk bus %d"), disk->bus); + goto cleanup; } break; case VIR_DOMAIN_DISK_DEVICE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected disk device type %d"), disk->device); + goto cleanup; } cleanup: @@ -986,11 +994,16 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_UDP: - case VIR_DOMAIN_NET_TYPE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("hotplug of interface type of %s is not implemented yet"), virDomainNetTypeToString(actualType)); goto cleanup; + + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } /* Set device online immediately */ @@ -1297,12 +1310,15 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver, break; case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_XEN: - case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("QEMU does not support device assignment mode '%s'"), virDomainHostdevSubsysPCIBackendTypeToString(backend)); goto error; - break; + case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev PCI backend %d"), backend); + goto error; } /* Temporarily add the hostdev to the domain definition. This is needed @@ -2662,6 +2678,9 @@ qemuDomainAttachShmemDevice(virQEMUDriverPtr driver, virDomainShmemModelTypeToString(shmem->model)); ATTRIBUTE_FALLTHROUGH; case VIR_DOMAIN_SHMEM_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected shmem device type %d"), shmem->model); return -1; } @@ -3590,9 +3609,15 @@ qemuDomainChangeGraphics(virQEMUDriverPtr driver, break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: /* nada */ break; + + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), + newlisten->type); + goto cleanup; } } @@ -4077,7 +4102,11 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: break; case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hostdev subsystem type %d"), + hostdev->source.subsys.type); + goto cleanup; } virDomainHostdevDefFree(hostdev); @@ -4536,11 +4565,15 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver, case VIR_DOMAIN_DEVICE_TPM: case VIR_DOMAIN_DEVICE_PANIC: case VIR_DOMAIN_DEVICE_IOMMU: - case VIR_DOMAIN_DEVICE_LAST: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("don't know how to remove a %s device"), virDomainDeviceTypeToString(dev->type)); break; + case VIR_DOMAIN_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected device type %d"), dev->type); + break; } return ret; } @@ -5153,6 +5186,9 @@ qemuDomainDetachShmemDevice(virQEMUDriverPtr driver, virDomainShmemModelTypeToString(shmem->model)); ATTRIBUTE_FALLTHROUGH; case VIR_DOMAIN_SHMEM_MODEL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected shmem model %d"), shmem->model); return -1; } @@ -6282,10 +6318,14 @@ qemuDomainDetachInputDevice(virDomainObjPtr vm, virDomainInputBusTypeToString(input->bus)); return -1; - case VIR_DOMAIN_INPUT_BUS_LAST: case VIR_DOMAIN_INPUT_BUS_USB: case VIR_DOMAIN_INPUT_BUS_VIRTIO: break; + case VIR_DOMAIN_INPUT_BUS_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected input bus %d"), input->bus); + return -1; } qemuDomainMarkDeviceForRemoval(vm, &input->info); diff --git a/src/qemu/qemu_interface.c b/src/qemu/qemu_interface.c index cebb490221..93f5a9185a 100644 --- a/src/qemu/qemu_interface.c +++ b/src/qemu/qemu_interface.c @@ -122,9 +122,13 @@ qemuInterfaceStartDevice(virDomainNetDefPtr net) case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: - case VIR_DOMAIN_NET_TYPE_LAST: /* these types all require no action */ break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } ret = 0; @@ -210,9 +214,13 @@ qemuInterfaceStopDevice(virDomainNetDefPtr net) case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: case VIR_DOMAIN_NET_TYPE_HOSTDEV: - case VIR_DOMAIN_NET_TYPE_LAST: /* these types all require no action */ break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), actualType); + goto cleanup; } ret = 0; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index fe3342b38d..39d4ba7709 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -352,11 +352,15 @@ qemuMigrationPrecreateDisk(virConnectPtr conn, case VIR_STORAGE_TYPE_BLOCK: case VIR_STORAGE_TYPE_DIR: case VIR_STORAGE_TYPE_NONE: - case VIR_STORAGE_TYPE_LAST: virReportError(VIR_ERR_INTERNAL_ERROR, _("cannot precreate storage for disk type '%s'"), virStorageTypeToString(disk->src->type)); goto cleanup; + case VIR_STORAGE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unespected storage type %d"), disk->src->type); + goto cleanup; } if ((vol = virStorageVolLookupByName(pool, volName))) { @@ -775,6 +779,11 @@ qemuMigrationCancelOneDriveMirror(virQEMUDriverPtr driver, case VIR_DOMAIN_BLOCK_JOB_COMPLETED: ret = 1; goto cleanup; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("UJnexpected block job status %d"), status); + goto cleanup; } if (!(diskAlias = qemuAliasFromDisk(disk))) @@ -1400,6 +1409,7 @@ qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo) case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE: case QEMU_MONITOR_MIGRATION_STATUS_CANCELLING: case QEMU_MONITOR_MIGRATION_STATUS_LAST: + default: break; } } @@ -1500,6 +1510,11 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver, case QEMU_DOMAIN_JOB_STATUS_POSTCOPY: case QEMU_DOMAIN_JOB_STATUS_PAUSED: break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected job status %d"), jobInfo->status); + goto cleanup; } ret = 0; @@ -1603,6 +1618,7 @@ qemuMigrationCompleted(virQEMUDriverPtr driver, case QEMU_DOMAIN_JOB_STATUS_ACTIVE: case QEMU_DOMAIN_JOB_STATUS_COMPLETED: case QEMU_DOMAIN_JOB_STATUS_NONE: + default: /* Impossible. */ break; } @@ -1961,6 +1977,7 @@ qemuMigrationCleanup(virDomainObjPtr vm, /* single phase outgoing migration; unreachable */ case QEMU_MIGRATION_PHASE_NONE: case QEMU_MIGRATION_PHASE_LAST: + default: /* unreachable */ ; } @@ -3899,6 +3916,11 @@ qemuMigrationRun(virQEMUDriverPtr driver, spec->dest.fd.qemu); VIR_FORCE_CLOSE(spec->dest.fd.qemu); break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected migration dest type %d"), spec->destType); + goto exit_monitor; } if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c index 945530c409..5c721e7fe1 100644 --- a/src/qemu/qemu_migration_cookie.c +++ b/src/qemu/qemu_migration_cookie.c @@ -340,8 +340,12 @@ qemuMigrationCookieAddGraphics(qemuMigrationCookiePtr mig, case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET: case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), glisten->type); + return -1; } /* Seamless migration is supported only for one graphics. */ diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 9b5ad72cf9..455a4eff17 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2234,9 +2234,11 @@ qemuMonitorBlockIOStatusToError(const char *status) /* unreachable */ case QEMU_MONITOR_BLOCK_IO_STATUS_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected block IO status %d"), st); + return -1; } - return -1; } @@ -3680,6 +3682,7 @@ qemuMonitorVMStatusToPausedReason(const char *status) /* unreachable from this point on */ case QEMU_MONITOR_VM_STATUS_LAST: + default: ; } return VIR_DOMAIN_PAUSED_UNKNOWN; @@ -3865,7 +3868,10 @@ qemuMonitorCPUModelInfoCopy(const qemuMonitorCPUModelInfo *orig) break; case QEMU_MONITOR_CPU_PROPERTY_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU property %d"), orig->props[i].type); + goto error; } } @@ -4366,6 +4372,7 @@ qemuMonitorGuestPanicEventInfoFormatMsg(qemuMonitorEventPanicInfoPtr info) case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE: case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST: + default: break; } diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 242b92ea3f..790ea0277c 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -899,6 +899,7 @@ qemuMonitorJSONHandleBlockJobImpl(qemuMonitorPtr mon, break; case VIR_DOMAIN_BLOCK_JOB_FAILED: case VIR_DOMAIN_BLOCK_JOB_LAST: + default: VIR_DEBUG("should not get here"); break; } @@ -1619,7 +1620,7 @@ qemuMonitorJSONUpdateVideoMemorySize(qemuMonitorPtr mon, {0} }; - switch (video->type) { + switch ((virDomainVideoType)video->type) { case VIR_DOMAIN_VIDEO_TYPE_VGA: if (qemuMonitorJSONGetObjectProperty(mon, path, "vgamem_mb", &prop) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -1663,10 +1664,22 @@ qemuMonitorJSONUpdateVideoMemorySize(qemuMonitorPtr mon, video->vram = prop.val.ul * 1024; break; case VIR_DOMAIN_VIDEO_TYPE_CIRRUS: + case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: + case VIR_DOMAIN_VIDEO_TYPE_VIRTIO: + break; case VIR_DOMAIN_VIDEO_TYPE_XEN: case VIR_DOMAIN_VIDEO_TYPE_VBOX: + case VIR_DOMAIN_VIDEO_TYPE_GOP: + case VIR_DOMAIN_VIDEO_TYPE_PARALLELS: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unsupported video type %s"), + virDomainVideoTypeToString(video->type)); + return -1; case VIR_DOMAIN_VIDEO_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected video type %d"), video->type); + return -1; } return 0; @@ -1689,7 +1702,7 @@ qemuMonitorJSONUpdateVideoVram64Size(qemuMonitorPtr mon, {0} }; - switch (video->type) { + switch ((virDomainVideoType)video->type) { case VIR_DOMAIN_VIDEO_TYPE_QXL: if (video->vram64 != 0) { if (qemuMonitorJSONGetObjectProperty(mon, path, @@ -1705,10 +1718,22 @@ qemuMonitorJSONUpdateVideoVram64Size(qemuMonitorPtr mon, case VIR_DOMAIN_VIDEO_TYPE_VGA: case VIR_DOMAIN_VIDEO_TYPE_VMVGA: case VIR_DOMAIN_VIDEO_TYPE_CIRRUS: + case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: + case VIR_DOMAIN_VIDEO_TYPE_VIRTIO: + break; case VIR_DOMAIN_VIDEO_TYPE_XEN: case VIR_DOMAIN_VIDEO_TYPE_VBOX: + case VIR_DOMAIN_VIDEO_TYPE_GOP: + case VIR_DOMAIN_VIDEO_TYPE_PARALLELS: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unsupported video type %s"), + virDomainVideoTypeToString(video->type)); + return -1; case VIR_DOMAIN_VIDEO_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected video type %d"), video->type); + return -1; } return 0; @@ -3075,6 +3100,11 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValuePtr reply, } } break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected migration status %d"), stats->status); + return -1; } return 0; @@ -5297,6 +5327,11 @@ qemuMonitorJSONParseCPUModelProperty(const char *key, case VIR_JSON_TYPE_ARRAY: case VIR_JSON_TYPE_NULL: return 0; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected JSON value type %d"), value->type); + return -1; } machine_model->nprops++; @@ -5351,6 +5386,10 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon, case QEMU_MONITOR_CPU_MODEL_EXPANSION_FULL: typeStr = "full"; break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected CPU model expansion %d"), type); + goto cleanup; } if (!(cmd = qemuMonitorJSONMakeCommand("query-cpu-model-expansion", @@ -5935,11 +5974,11 @@ int qemuMonitorJSONGetObjectProperty(qemuMonitorPtr mon, ret = 0; break; case QEMU_MONITOR_OBJECT_PROPERTY_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("qom-get invalid object property type %d"), prop->type); goto cleanup; - break; } if (ret == -1) { @@ -5998,6 +6037,7 @@ int qemuMonitorJSONSetObjectProperty(qemuMonitorPtr mon, MAKE_SET_CMD("s:value", prop->val.str); break; case QEMU_MONITOR_OBJECT_PROPERTY_LAST: + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("qom-set invalid object property type %d"), prop->type); @@ -6708,16 +6748,15 @@ qemuMonitorJSONAttachCharDevCommand(const char *chrID, case VIR_DOMAIN_CHR_TYPE_PIPE: case VIR_DOMAIN_CHR_TYPE_STDIO: case VIR_DOMAIN_CHR_TYPE_NMDM: + virReportError(VIR_ERR_OPERATION_FAILED, + _("Hotplug unsupported for char device type '%s'"), + virDomainChrTypeToString(chr->type)); + goto cleanup; case VIR_DOMAIN_CHR_TYPE_LAST: - if (virDomainChrTypeToString(chr->type)) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Hotplug unsupported for char device type '%s'"), - virDomainChrTypeToString(chr->type)); - } else { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Hotplug unsupported for char device type '%d'"), - chr->type); - } + default: + virReportError(VIR_ERR_OPERATION_FAILED, + _("Unexpected chardev type %d"), + chr->type); goto cleanup; } diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index 2db71548cb..ddab0e7d5a 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -618,6 +618,9 @@ static int parseMemoryStat(char **text, unsigned int tag, case VIR_DOMAIN_MEMORY_STAT_UNUSED: case VIR_DOMAIN_MEMORY_STAT_AVAILABLE: value >>= 10; + break; + default: + break; } mstat->tag = tag; mstat->val = value; diff --git a/src/qemu/qemu_parse_command.c b/src/qemu/qemu_parse_command.c index 5fe3f97d03..3f5c4c0cbc 100644 --- a/src/qemu/qemu_parse_command.c +++ b/src/qemu/qemu_parse_command.c @@ -1577,7 +1577,10 @@ qemuParseCommandLineCPU(virDomainDefPtr dom, break; case VIR_DOMAIN_HYPERV_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected hyperv feature %d"), f); + goto cleanup; } virStringListFree(hv_tokens); hv_tokens = NULL; @@ -2174,10 +2177,15 @@ qemuParseCommandLine(virCapsPtr caps, case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: case VIR_STORAGE_NET_PROTOCOL_SSH: - case VIR_STORAGE_NET_PROTOCOL_LAST: case VIR_STORAGE_NET_PROTOCOL_NONE: /* ignored for now */ break; + case VIR_STORAGE_NET_PROTOCOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage protocol %d"), + disk->src->protocol); + goto error; } } diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index b86ecda93f..9f30e80046 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -2702,7 +2702,7 @@ qemuProcessUpdateVideoRamSize(virQEMUDriverPtr driver, for (i = 0; i < vm->def->nvideos; i++) { video = vm->def->videos[i]; - switch (video->type) { + switch ((virDomainVideoType)video->type) { case VIR_DOMAIN_VIDEO_TYPE_VGA: if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VGA_VGAMEM)) { if (qemuMonitorUpdateVideoMemorySize(priv->mon, video, "VGA") < 0) @@ -2740,10 +2740,22 @@ qemuProcessUpdateVideoRamSize(virQEMUDriverPtr driver, } break; case VIR_DOMAIN_VIDEO_TYPE_CIRRUS: + case VIR_DOMAIN_VIDEO_TYPE_DEFAULT: + case VIR_DOMAIN_VIDEO_TYPE_VIRTIO: + break; + case VIR_DOMAIN_VIDEO_TYPE_GOP: + case VIR_DOMAIN_VIDEO_TYPE_PARALLELS: case VIR_DOMAIN_VIDEO_TYPE_XEN: case VIR_DOMAIN_VIDEO_TYPE_VBOX: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported video type %s"), + virDomainVideoTypeToString(video->type)); + goto error; case VIR_DOMAIN_VIDEO_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected video type %d"), video->type); + goto error; } } @@ -3092,6 +3104,11 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver, return -1; } break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected migration phase %d"), phase); + return -1; } qemuMigrationReset(driver, vm, QEMU_ASYNC_JOB_NONE); @@ -3172,6 +3189,11 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver, /* migration completed, we need to kill the domain here */ *stopFlags |= VIR_QEMU_PROCESS_STOP_MIGRATED; return -1; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected migration phase %d"), phase); + return -1; } if (resume) { @@ -3253,8 +3275,12 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver, break; case QEMU_ASYNC_JOB_NONE: - case QEMU_ASYNC_JOB_LAST: break; + case QEMU_ASYNC_JOB_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected job type %d"), job->asyncJob); + return -1; } if (!virDomainObjIsActive(vm)) @@ -3290,8 +3316,12 @@ qemuProcessRecoverJob(virQEMUDriverPtr driver, case QEMU_JOB_ASYNC_NESTED: /* async job was already handled above */ case QEMU_JOB_NONE: - case QEMU_JOB_LAST: break; + case QEMU_JOB_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected job type %d"), job->active); + return -1; } return 0; @@ -3612,6 +3642,12 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver, case VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY: /* default mode will be used */ break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SPICE channel mode %d"), + graphics->data.spice.channels[i]); + goto cleanup; } } switch (defaultMode) { @@ -3628,6 +3664,12 @@ qemuProcessSPICEAllocatePorts(virQEMUDriverPtr driver, needTLSPort = true; needPort = true; break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected SPICE channel mode %d"), + defaultMode); + goto cleanup; } } @@ -3748,6 +3790,7 @@ qemuProcessVerifyHypervFeatures(virDomainDefPtr def, /* coverity[dead_error_begin] */ case VIR_DOMAIN_HYPERV_VENDOR_ID: case VIR_DOMAIN_HYPERV_LAST: + default: break; } } @@ -4297,10 +4340,18 @@ qemuProcessGraphicsReservePorts(virQEMUDriverPtr driver, break; case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + break; case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported graphics type %s"), + virDomainGraphicsTypeToString(graphics->type)); + return -1; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), graphics->type); + return -1; } return 0; @@ -4335,9 +4386,17 @@ qemuProcessGraphicsAllocatePorts(virQEMUDriverPtr driver, break; case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + break; case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported graphics type %s"), + virDomainGraphicsTypeToString(graphics->type)); + return -1; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), graphics->type); break; } @@ -4371,7 +4430,7 @@ qemuProcessGetNetworkAddress(virConnectPtr conn, if (!netdef) goto cleanup; - switch (netdef->forward.type) { + switch ((virNetworkForwardType)netdef->forward.type) { case VIR_NETWORK_FORWARD_NONE: case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: @@ -4408,6 +4467,16 @@ qemuProcessGetNetworkAddress(virConnectPtr conn, goto cleanup; } break; + + case VIR_NETWORK_FORWARD_HOSTDEV: + break; + + case VIR_NETWORK_FORWARD_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network forward type %d"), + netdef->forward.type); + goto cleanup; } if (dev_name) { @@ -4484,10 +4553,18 @@ qemuProcessGraphicsSetupListen(virConnectPtr conn, break; case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + break; case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported graphics type %s"), + virDomainGraphicsTypeToString(graphics->type)); + goto cleanup; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), graphics->type); + goto cleanup; } for (i = 0; i < graphics->nListens; i++) { @@ -4534,8 +4611,12 @@ qemuProcessGraphicsSetupListen(virConnectPtr conn, break; case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: - case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), glisten->type); + goto cleanup; } } @@ -4773,10 +4854,18 @@ qemuProcessStartValidateGraphics(virDomainObjPtr vm) break; case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + break; case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported graphics type %s"), + virDomainGraphicsTypeToString(graphics->type)); + return -1; case VIR_DOMAIN_GRAPHICS_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics type %d"), graphics->type); + return -1; } } @@ -6708,6 +6797,7 @@ void qemuProcessStop(virQEMUDriverPtr driver, case VIR_DOMAIN_NET_TYPE_HOSTDEV: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_LAST: + default: /* No special cleanup procedure for these types. */ break; } -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/lxc/lxc_controller.c | 1 + src/lxc/lxc_driver.c | 2 ++ src/lxc/lxc_process.c | 10 +++++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index f9f26570cd..3620998100 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -2583,6 +2583,7 @@ int main(int argc, char *argv[]) case 'h': case '?': + default: fprintf(stderr, "\n"); fprintf(stderr, "syntax: %s [OPTIONS]\n", argv[0]); fprintf(stderr, "\n"); diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 7d6568cdf8..07fd1f6ebe 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1009,6 +1009,8 @@ lxcDomainGetMemoryParameters(virDomainPtr dom, VIR_TYPED_PARAM_ULLONG, val) < 0) goto cleanup; break; + default: + break; } } diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index bc321e360d..82df80acfd 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -510,6 +510,10 @@ static int virLXCProcessSetupNamespaces(virConnectPtr conn, if ((nsFDs[i] = virLXCProcessSetupNamespaceNet(i, lxcDef->ns_val[i])) < 0) return -1; break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected namespace source %d"), lxcDef->ns_source[i]); + return -1; } } @@ -587,13 +591,17 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn, case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: - case VIR_DOMAIN_NET_TYPE_LAST: case VIR_DOMAIN_NET_TYPE_HOSTDEV: virReportError(VIR_ERR_INTERNAL_ERROR, _("Unsupported network type %s"), virDomainNetTypeToString(type)); goto cleanup; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), type); + goto cleanup; } /* Set bandwidth or warn if requested and not supported. */ -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/uml/uml_conf.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c index 49589b33c9..e93aede797 100644 --- a/src/uml/uml_conf.c +++ b/src/uml/uml_conf.c @@ -259,7 +259,10 @@ umlBuildCommandLineNet(virConnectPtr conn, goto error; case VIR_DOMAIN_NET_TYPE_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected net type %d"), def->type); + goto error; } if (def->script) { -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/bhyve/bhyve_command.c | 12 ++++++++++-- src/libvirt_private.syms | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index c1241b8110..ad6775ebc8 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -420,9 +420,17 @@ bhyveBuildGraphicsArgStr(const virDomainDef *def, virBufferAsprintf(&opt, ":%d", graphics->data.vnc.port); break; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_NONE: + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_SOCKET: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("Unsupported listen type %s"), + virDomainGraphicsListenTypeToString(glisten->type)); + goto error; + case VIR_DOMAIN_GRAPHICS_LISTEN_TYPE_LAST: default: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Unsupported listen type")); + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected graphics listen type %d"), glisten->type); + goto error; } if (video->driver) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 6a9e109855..3630d687a6 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -366,6 +366,8 @@ virDomainGraphicsDefFree; virDomainGraphicsGetListen; virDomainGraphicsListenAppendAddress; virDomainGraphicsListenAppendSocket; +virDomainGraphicsListenTypeFromString; +virDomainGraphicsListenTypeToString; virDomainGraphicsSpiceChannelModeTypeFromString; virDomainGraphicsSpiceChannelModeTypeToString; virDomainGraphicsSpiceChannelNameTypeFromString; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/network/bridge_driver.c | 46 ++++++++++++++++++++++++++++++++++++++++----- src/network/leaseshelper.c | 11 +++++++++-- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index dd6e3402ea..ce79a8ec7b 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -445,7 +445,7 @@ networkUpdateState(virNetworkObjPtr obj, } def = virNetworkObjGetDef(obj); - switch (def->forward.type) { + switch ((virNetworkForwardType)def->forward.type) { case VIR_NETWORK_FORWARD_NONE: case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: @@ -484,6 +484,13 @@ networkUpdateState(virNetworkObjPtr obj, case VIR_NETWORK_FORWARD_HOSTDEV: /* so far no extra checks */ break; + + case VIR_NETWORK_FORWARD_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network forward type %d"), + def->forward.type); + goto cleanup; } /* Try and read dnsmasq/radvd pids of active networks */ @@ -2731,9 +2738,14 @@ networkCreateInterfacePool(virNetworkDefPtr netdef) case VIR_NETWORK_FORWARD_NAT: case VIR_NETWORK_FORWARD_ROUTE: case VIR_NETWORK_FORWARD_OPEN: - case VIR_NETWORK_FORWARD_LAST: /* by definition these will never be encountered here */ break; + case VIR_NETWORK_FORWARD_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network forward type %d"), + netdef->forward.type); + goto cleanup; } } @@ -2823,7 +2835,7 @@ networkStartNetwork(virNetworkDriverStatePtr driver, VIR_HOOK_SUBOP_BEGIN) < 0) goto cleanup; - switch (def->forward.type) { + switch ((virNetworkForwardType)def->forward.type) { case VIR_NETWORK_FORWARD_NONE: case VIR_NETWORK_FORWARD_NAT: @@ -2852,6 +2864,13 @@ networkStartNetwork(virNetworkDriverStatePtr driver, if (networkStartNetworkExternal(obj) < 0) goto cleanup; break; + + case VIR_NETWORK_FORWARD_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network forward type %d"), + def->forward.type); + goto cleanup; } /* finally we can call the 'started' hook script if any */ @@ -2905,7 +2924,7 @@ networkShutdownNetwork(virNetworkDriverStatePtr driver, unlink(stateFile); VIR_FREE(stateFile); - switch (def->forward.type) { + switch ((virNetworkForwardType)def->forward.type) { case VIR_NETWORK_FORWARD_NONE: case VIR_NETWORK_FORWARD_NAT: @@ -2931,6 +2950,12 @@ networkShutdownNetwork(virNetworkDriverStatePtr driver, case VIR_NETWORK_FORWARD_HOSTDEV: ret = networkShutdownNetworkExternal(obj); break; + case VIR_NETWORK_FORWARD_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network forward type %d"), + def->forward.type); + ret = -1; } /* now that we know it's stopped call the hook if present */ @@ -3408,8 +3433,14 @@ networkValidate(virNetworkDriverStatePtr driver, } case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_NONE: - case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST: break; + + case VIR_NETWORK_FORWARD_HOSTDEV_DEVICE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network forward hostdev type %d"), + iface->type); + return -1; } } if ((def->forward.npfs > 0) + usesInterface + usesAddress > 1) { @@ -4616,6 +4647,11 @@ networkAllocateActualDevice(virDomainDefPtr dom, case VIR_NETWORK_FORWARD_PASSTHROUGH: iface->data.network.actual->data.direct.mode = VIR_NETDEV_MACVLAN_MODE_PASSTHRU; break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected network forward type %d"), + netdef->forward.type); + goto error; } /* merge virtualports from interface, network, and portgroup to diff --git a/src/network/leaseshelper.c b/src/network/leaseshelper.c index b4d87ee651..95cd2ee910 100644 --- a/src/network/leaseshelper.c +++ b/src/network/leaseshelper.c @@ -202,8 +202,12 @@ main(int argc, char **argv) break; case VIR_LEASE_ACTION_INIT: - case VIR_LEASE_ACTION_LAST: break; + case VIR_LEASE_ACTION_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected lease action %d"), action); + goto cleanup; } if (!(leases_array_new = virJSONValueNewArray())) { @@ -246,7 +250,10 @@ main(int argc, char **argv) break; case VIR_LEASE_ACTION_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected lease action %d"), action); + goto cleanup; } rv = EXIT_SUCCESS; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/interface/interface_backend_udev.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c index 47e850bc2a..0153a46a16 100644 --- a/src/interface/interface_backend_udev.c +++ b/src/interface/interface_backend_udev.c @@ -64,9 +64,9 @@ virUdevStatusString(virUdevStatus status) return "inactive"; case VIR_UDEV_IFACE_ALL: return "all"; + default: + return ""; } - - return ""; } /* @@ -125,6 +125,7 @@ udevGetDevices(struct udev *udev, virUdevStatus status) break; case VIR_UDEV_IFACE_ALL: + default: break; } @@ -1061,7 +1062,7 @@ udevGetIfaceDef(struct udev *udev, const char *name) ifacedef->type = VIR_INTERFACE_TYPE_BOND; } - switch (ifacedef->type) { + switch ((virInterfaceType)ifacedef->type) { case VIR_INTERFACE_TYPE_VLAN: if (udevGetIfaceDefVlan(udev, dev, name, ifacedef) < 0) goto error; @@ -1076,6 +1077,11 @@ udevGetIfaceDef(struct udev *udev, const char *name) break; case VIR_INTERFACE_TYPE_ETHERNET: break; + case VIR_INTERFACE_TYPE_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected interface type %d"), ifacedef->type); + goto error; } udev_device_unref(dev); -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/storage/storage_backend_gluster.c | 12 ++++++++++-- src/storage/storage_backend_rbd.c | 6 +++++- src/storage/storage_driver.c | 1 + src/storage/storage_util.c | 18 ++++++++++++++++-- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c index c6cc531e2f..68c3ad0fab 100644 --- a/src/storage/storage_backend_gluster.c +++ b/src/storage/storage_backend_gluster.c @@ -436,7 +436,6 @@ virStorageBackendGlusterVolDelete(virStoragePoolObjPtr pool, case VIR_STORAGE_VOL_DIR: case VIR_STORAGE_VOL_BLOCK: case VIR_STORAGE_VOL_PLOOP: - case VIR_STORAGE_VOL_LAST: virReportError(VIR_ERR_NO_SUPPORT, _("removing of '%s' volumes is not supported " "by the gluster backend: %s"), @@ -472,6 +471,12 @@ virStorageBackendGlusterVolDelete(virStoragePoolObjPtr pool, } } break; + + case VIR_STORAGE_VOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage vol type %d"), vol->type); + goto cleanup; } ret = 0; @@ -606,7 +611,10 @@ virStorageFileBackendGlusterInitServer(virStorageFileBackendGlusterPrivPtr priv, break; case VIR_STORAGE_NET_HOST_TRANS_LAST: - break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage host transport %d"), host->transport); + return -1; } VIR_DEBUG("adding gluster host for %p: transport=%s host=%s port=%d", diff --git a/src/storage/storage_backend_rbd.c b/src/storage/storage_backend_rbd.c index 642cacb673..e5d9d59ca0 100644 --- a/src/storage/storage_backend_rbd.c +++ b/src/storage/storage_backend_rbd.c @@ -1252,10 +1252,14 @@ virStorageBackendRBDVolWipe(virStoragePoolObjPtr pool, case VIR_STORAGE_VOL_WIPE_ALG_PFITZNER7: case VIR_STORAGE_VOL_WIPE_ALG_PFITZNER33: case VIR_STORAGE_VOL_WIPE_ALG_RANDOM: - case VIR_STORAGE_VOL_WIPE_ALG_LAST: virReportError(VIR_ERR_INVALID_ARG, _("unsupported algorithm %d"), algorithm); goto cleanup; + case VIR_STORAGE_VOL_WIPE_ALG_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage vol wipe algorith %d"), algorithm); + goto cleanup; } if (r < 0) { diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index d5e38af5aa..10bf2e0bda 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1602,6 +1602,7 @@ storageVolLookupByPathCallback(virStoragePoolObjPtr obj, case VIR_STORAGE_POOL_SHEEPDOG: case VIR_STORAGE_POOL_ZFS: case VIR_STORAGE_POOL_LAST: + default: ignore_value(VIR_STRDUP(stable_path, data->path)); break; } diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c index b4aed0f700..83a8494f78 100644 --- a/src/storage/storage_util.c +++ b/src/storage/storage_util.c @@ -2256,11 +2256,15 @@ virStorageBackendVolDeleteLocal(virStoragePoolObjPtr pool ATTRIBUTE_UNUSED, case VIR_STORAGE_VOL_BLOCK: case VIR_STORAGE_VOL_NETWORK: case VIR_STORAGE_VOL_NETDIR: - case VIR_STORAGE_VOL_LAST: virReportError(VIR_ERR_NO_SUPPORT, _("removing block or network volumes is not supported: %s"), vol->target.path); return -1; + case VIR_STORAGE_VOL_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage vol type %d"), vol->type); + return -1; } return 0; } @@ -2749,8 +2753,9 @@ storageBackendVolWipeLocalFile(const char *path, _("'trim' algorithm not supported")); goto cleanup; case VIR_STORAGE_VOL_WIPE_ALG_LAST: + default: virReportError(VIR_ERR_INVALID_ARG, - _("unsupported algorithm %d"), + _("Unexpected storage vol wipe algorithm %d"), algorithm); goto cleanup; } @@ -3273,6 +3278,10 @@ virStorageBackendBLKIDFindEmpty(const char *device, "expected format '%s'"), device, format); break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected storage blkid result %d"), rc); } if (ret == 0 && blkid_do_probe(probe) != 1) { @@ -3448,6 +3457,11 @@ virStorageBackendPARTEDValidLabel(const char *device, virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("Unknown Partition Type, requires build --overwrite")); break; + + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected parted result %d"), check); + break; } return ret; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/node_device/node_device_udev.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c index e87eb32a85..bcd943d272 100644 --- a/src/node_device/node_device_udev.c +++ b/src/node_device/node_device_udev.c @@ -1267,8 +1267,13 @@ udevGetDeviceDetails(struct udev_device *device, case VIR_NODE_DEV_CAP_SYSTEM: case VIR_NODE_DEV_CAP_FC_HOST: case VIR_NODE_DEV_CAP_VPORTS: - case VIR_NODE_DEV_CAP_LAST: break; + case VIR_NODE_DEV_CAP_LAST: + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected nodedve capability %d"), + def->caps->data.type); + return -1; } return 0; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/nwfilter/nwfilter_ebiptables_driver.c | 2 ++ src/nwfilter/nwfilter_gentech_driver.c | 23 ++++++++++++++++++++++- src/nwfilter/nwfilter_learnipaddr.c | 13 ++++++++++--- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/nwfilter/nwfilter_ebiptables_driver.c b/src/nwfilter/nwfilter_ebiptables_driver.c index c624337f4d..3d49884e2e 100644 --- a/src/nwfilter/nwfilter_ebiptables_driver.c +++ b/src/nwfilter/nwfilter_ebiptables_driver.c @@ -1129,6 +1129,8 @@ iptablesEnforceDirection(virFirewallPtr fw, break; case CTDIR_STATUS_OLD: break; + default: + break; } if (rule->tt != VIR_NWFILTER_RULE_DIRECTION_INOUT) diff --git a/src/nwfilter/nwfilter_gentech_driver.c b/src/nwfilter/nwfilter_gentech_driver.c index 840d419bb4..25822d5185 100644 --- a/src/nwfilter/nwfilter_gentech_driver.c +++ b/src/nwfilter/nwfilter_gentech_driver.c @@ -405,6 +405,10 @@ virNWFilterIncludeDefToRuleInst(virNWFilterDriverStatePtr driver, break; case INSTANTIATE_ALWAYS: break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected new filter action %d"), useNewFilter); + goto cleanup; } if (VIR_APPEND_ELEMENT(inst->filters, @@ -555,6 +559,11 @@ virNWFilterDetermineMissingVarsRec(virNWFilterDefPtr filter, break; case INSTANTIATE_ALWAYS: break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected new filter action %d"), useNewFilter); + rc = -1; + goto error; } rc = virNWFilterDetermineMissingVarsRec(next_filter, @@ -562,7 +571,7 @@ virNWFilterDetermineMissingVarsRec(virNWFilterDefPtr filter, missing_vars, useNewFilter, driver); - + error: virNWFilterHashTableFree(tmpvars); virNWFilterObjUnlock(obj); @@ -701,6 +710,10 @@ virNWFilterDoInstantiate(const unsigned char *vmuuid, case INSTANTIATE_ALWAYS: instantiate = true; break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected new filter action %d"), useNewFilter); + goto err_exit; } if (instantiate) { @@ -825,6 +838,10 @@ virNWFilterInstantiateFilterUpdate(virNWFilterDriverStatePtr driver, case INSTANTIATE_ALWAYS: break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected new filter action %d"), useNewFilter); + goto err_exit_vars1; } rc = virNWFilterDoInstantiate(vmuuid, techdriver, filter, @@ -1102,6 +1119,10 @@ virNWFilterDomainFWUpdateCB(virDomainObjPtr obj, _("Failure while applying current filter on " "VM %s"), vm->name); break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected filter step %d"), cb->step); + ret = -1; } if (ret) break; diff --git a/src/nwfilter/nwfilter_learnipaddr.c b/src/nwfilter/nwfilter_learnipaddr.c index 9ca0639576..e2a3704289 100644 --- a/src/nwfilter/nwfilter_learnipaddr.c +++ b/src/nwfilter/nwfilter_learnipaddr.c @@ -351,9 +351,14 @@ procDHCPOpts(struct dhcp *dhcp, int dhcp_opts_len, case DHCP_MSGT_DHCPOFFER: *vmaddr = dhcp->yiaddr; *howDetected = DETECT_DHCP; - break; + break; + default: + break; } } + break; + default: + break; } dhcp_opts_len -= (2 + dhcpopt->len); dhcpopt = (struct dhcp_option*)((char *)dhcpopt + 2 + dhcpopt->len); @@ -542,11 +547,13 @@ learnIPAddressThread(void *arg) case ARPOP_REPLY: vmaddr = arphdr->ar_sip; howDetected = DETECT_STATIC; - break; + break; case ARPOP_REQUEST: vmaddr = arphdr->ar_tip; howDetected = DETECT_STATIC; - break; + break; + default: + break; } } } else if (virMacAddrCmpRaw(&req->macaddr, -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- daemon/libvirtd.c | 4 ++-- daemon/remote.c | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c index c5bb12b8ce..4944633c57 100644 --- a/daemon/libvirtd.c +++ b/daemon/libvirtd.c @@ -290,9 +290,9 @@ static int daemonErrorLogFilter(virErrorPtr err, int priority) case VIR_ERR_NO_SERVER: case VIR_ERR_NO_CLIENT: return VIR_LOG_DEBUG; + default: + return priority; } - - return priority; } diff --git a/daemon/remote.c b/daemon/remote.c index 6de4bd00d4..51740e7b10 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -3288,6 +3288,10 @@ remoteDispatchAuthList(virNetServerPtr server, case VIR_NET_SERVER_SERVICE_AUTH_SASL: ret->types.types_val[0] = REMOTE_AUTH_SASL; break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unexpected auth method %d"), auth); + goto cleanup; } rv = 0; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- tests/cputest.c | 31 +++++++++++++++++++------------ tests/domaincapstest.c | 1 + tests/qemuhotplugtest.c | 4 ++++ tests/storagevolxml2argvtest.c | 2 ++ tests/virusbtest.c | 6 ++++++ 5 files changed, 32 insertions(+), 12 deletions(-) diff --git a/tests/cputest.c b/tests/cputest.c index 1e79edbef7..f29a6967dd 100644 --- a/tests/cputest.c +++ b/tests/cputest.c @@ -178,14 +178,18 @@ static const char * cpuTestCompResStr(virCPUCompareResult result) { switch (result) { - case VIR_CPU_COMPARE_ERROR: return "ERROR"; - case VIR_CPU_COMPARE_INCOMPATIBLE: return "INCOMPATIBLE"; - case VIR_CPU_COMPARE_IDENTICAL: return "IDENTICAL"; - case VIR_CPU_COMPARE_SUPERSET: return "SUPERSET"; - case VIR_CPU_COMPARE_LAST: break; + case VIR_CPU_COMPARE_ERROR: + return "ERROR"; + case VIR_CPU_COMPARE_INCOMPATIBLE: + return "INCOMPATIBLE"; + case VIR_CPU_COMPARE_IDENTICAL: + return "IDENTICAL"; + case VIR_CPU_COMPARE_SUPERSET: + return "SUPERSET"; + case VIR_CPU_COMPARE_LAST: + default: + return "unknown"; } - - return "unknown"; } @@ -193,12 +197,15 @@ static const char * cpuTestBoolWithErrorStr(enum cpuTestBoolWithError result) { switch (result) { - case FAIL: return "FAIL"; - case NO: return "NO"; - case YES: return "YES"; + case FAIL: + return "FAIL"; + case NO: + return "NO"; + case YES: + return "YES"; + default: + return "unknown"; } - - return "unknown"; } diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c index 533a4b3791..1d9fe0fd0f 100644 --- a/tests/domaincapstest.c +++ b/tests/domaincapstest.c @@ -301,6 +301,7 @@ test_virDomainCapsFormat(const void *opaque) switch (data->capsType) { case CAPS_NONE: + default: break; case CAPS_ALL: diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 63bfe44145..47de86792a 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -329,6 +329,10 @@ testQemuHotplug(const void *data) case UPDATE: ret = testQemuHotplugUpdate(vm, dev); + break; + + default: + ret = -1; } cleanup: diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c index 5857d5e350..f8330cb4d2 100644 --- a/tests/storagevolxml2argvtest.c +++ b/tests/storagevolxml2argvtest.c @@ -29,6 +29,8 @@ testSetVolumeType(virStorageVolDefPtr vol, case VIR_STORAGE_POOL_LOGICAL: vol->type = VIR_STORAGE_VOL_BLOCK; return; + default: + return; } } diff --git a/tests/virusbtest.c b/tests/virusbtest.c index 8728fe9092..a5bbbdbf32 100644 --- a/tests/virusbtest.c +++ b/tests/virusbtest.c @@ -93,6 +93,9 @@ static int testDeviceFind(const void *opaque) rv = virUSBDeviceFindByBus(info->bus, info->devno, info->vroot, info->mandatory, &dev); break; + default: + rv = -1; + break; } if (info->expectFailure) { @@ -123,6 +126,9 @@ static int testDeviceFind(const void *opaque) goto cleanup; } break; + default: + ret = -1; + goto cleanup; } ret = 0; -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- tools/virsh-domain-monitor.c | 4 ++++ tools/virsh-domain.c | 14 ++++++++++---- tools/virsh-nodedev.c | 1 + tools/virsh-pool.c | 1 + tools/virsh.c | 1 + tools/virt-admin.c | 1 + tools/vsh.c | 5 +++++ 7 files changed, 23 insertions(+), 4 deletions(-) diff --git a/tools/virsh-domain-monitor.c b/tools/virsh-domain-monitor.c index 32a42707eb..4903acb235 100644 --- a/tools/virsh-domain-monitor.c +++ b/tools/virsh-domain-monitor.c @@ -258,6 +258,7 @@ virshDomainStateReasonToString(int state, int reason) str = virshDomainPMSuspendedReasonTypeToString(reason); break; case VIR_DOMAIN_LAST: + default: ; } @@ -2232,6 +2233,9 @@ cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd) case VIR_IP_ADDR_TYPE_IPV6: type = "ipv6"; break; + default: + type = "unknown"; + break; } virBufferAsprintf(&buf, "%-12s %s/%d", diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 5a0e0c1b21..1ad4cf38eb 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -938,11 +938,13 @@ cmdAttachInterface(vshControl *ctl, const vshCmd *cmd) case VIR_DOMAIN_NET_TYPE_MCAST: case VIR_DOMAIN_NET_TYPE_UDP: case VIR_DOMAIN_NET_TYPE_INTERNAL: - case VIR_DOMAIN_NET_TYPE_LAST: vshError(ctl, _("No support for %s in command 'attach-interface'"), type); goto cleanup; - break; + case VIR_DOMAIN_NET_TYPE_LAST: + default: + vshError(ctl, _("Unexpected net type %d"), typ); + goto cleanup; } if (target != NULL) @@ -2048,17 +2050,16 @@ cmdBlockCommit(vshControl *ctl, const vshCmd *cmd) /* Execution continues here only if --wait or friends were specified */ switch (virshBlockJobWait(bjWait)) { case -1: + default: goto cleanup; case VIR_DOMAIN_BLOCK_JOB_CANCELED: vshPrintExtra(ctl, "\n%s", _("Commit aborted")); goto cleanup; - break; case VIR_DOMAIN_BLOCK_JOB_FAILED: vshError(ctl, "\n%s", _("Commit failed")); goto cleanup; - break; case VIR_DOMAIN_BLOCK_JOB_READY: case VIR_DOMAIN_BLOCK_JOB_COMPLETED: @@ -2366,6 +2367,7 @@ cmdBlockCopy(vshControl *ctl, const vshCmd *cmd) /* Execution continues here only if --wait or friends were specified */ switch (virshBlockJobWait(bjWait)) { case -1: + default: goto cleanup; case VIR_DOMAIN_BLOCK_JOB_CANCELED: @@ -2775,6 +2777,7 @@ cmdBlockPull(vshControl *ctl, const vshCmd *cmd) /* Execution continues here only if --wait or friends were specified */ switch (virshBlockJobWait(bjWait)) { case -1: + default: goto cleanup; case VIR_DOMAIN_BLOCK_JOB_CANCELED: @@ -10838,6 +10841,8 @@ virshMigrateTimeout(vshControl *ctl, if (virDomainMigrateStartPostCopy(dom, 0) < 0) vshDebug(ctl, VSH_ERR_INFO, "switching to post-copy failed\n"); break; + default: + break; } } @@ -12707,6 +12712,7 @@ virshDomainEventDetailToString(int event, int detail) str = virshDomainEventCrashedTypeToString(detail); break; case VIR_DOMAIN_EVENT_LAST: + default: break; } return str ? _(str) : _("unknown"); diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c index d25fe0e09b..c355c8a013 100644 --- a/tools/virsh-nodedev.c +++ b/tools/virsh-nodedev.c @@ -465,6 +465,7 @@ cmdNodeListDevices(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV; break; case VIR_NODE_DEV_CAP_LAST: + default: break; } } diff --git a/tools/virsh-pool.c b/tools/virsh-pool.c index 56b6cfc73d..f827925349 100644 --- a/tools/virsh-pool.c +++ b/tools/virsh-pool.c @@ -1199,6 +1199,7 @@ cmdPoolList(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED) flags |= VIR_CONNECT_LIST_STORAGE_POOLS_VSTORAGE; break; case VIR_STORAGE_POOL_LAST: + default: break; } } diff --git a/tools/virsh.c b/tools/virsh.c index 5f8352e861..96cf902e25 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -120,6 +120,7 @@ virshCatchDisconnect(virConnectPtr conn, /* coverity[dead_error_condition] */ case VIR_CONNECT_CLOSE_REASON_CLIENT: case VIR_CONNECT_CLOSE_REASON_LAST: + default: break; } vshError(ctl, _(str), NULLSTR(uri)); diff --git a/tools/virt-admin.c b/tools/virt-admin.c index c86b5763a7..40dfd89046 100644 --- a/tools/virt-admin.c +++ b/tools/virt-admin.c @@ -142,6 +142,7 @@ vshAdmCatchDisconnect(virAdmConnectPtr conn ATTRIBUTE_UNUSED, /* coverity[dead_error_condition] */ case VIR_CONNECT_CLOSE_REASON_CLIENT: case VIR_CONNECT_CLOSE_REASON_LAST: + default: break; } diff --git a/tools/vsh.c b/tools/vsh.c index 37c292a03d..304209e200 100644 --- a/tools/vsh.c +++ b/tools/vsh.c @@ -408,6 +408,9 @@ vshCmddefCheckInternals(const vshCmdDef *cmd) case VSH_OT_INT: break; + + default: + return -1; } } return 0; @@ -705,6 +708,7 @@ vshCmddefHelp(vshControl *ctl, const vshCmdDef *def) } break; case VSH_OT_ALIAS: + default: /* aliases are intentionally undocumented */ continue; } @@ -747,6 +751,7 @@ vshCmddefHelp(vshControl *ctl, const vshCmdDef *def) opt->name); break; case VSH_OT_ALIAS: + default: continue; } -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- examples/object-events/event-test.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/examples/object-events/event-test.c b/examples/object-events/event-test.c index 8499e0b38e..edb17af82e 100644 --- a/examples/object-events/event-test.c +++ b/examples/object-events/event-test.c @@ -49,6 +49,7 @@ connectClose(virConnectPtr conn ATTRIBUTE_UNUSED, return; case VIR_CONNECT_CLOSE_REASON_LAST: + default: break; }; @@ -88,6 +89,7 @@ eventToString(int event) return "Crashed"; case VIR_DOMAIN_EVENT_LAST: + default: break; } @@ -115,6 +117,7 @@ eventDetailToString(int event, return "Snapshot"; case VIR_DOMAIN_EVENT_DEFINED_LAST: + default: break; } break; @@ -128,6 +131,7 @@ eventDetailToString(int event, return "Renamed"; case VIR_DOMAIN_EVENT_UNDEFINED_LAST: + default: break; } break; @@ -150,6 +154,7 @@ eventDetailToString(int event, return "Event wakeup"; case VIR_DOMAIN_EVENT_STARTED_LAST: + default: break; } break; @@ -184,6 +189,7 @@ eventDetailToString(int event, return "Post-copy Error"; case VIR_DOMAIN_EVENT_SUSPENDED_LAST: + default: break; } break; @@ -203,6 +209,7 @@ eventDetailToString(int event, return "Post-copy"; case VIR_DOMAIN_EVENT_RESUMED_LAST: + default: break; } break; @@ -231,6 +238,7 @@ eventDetailToString(int event, return "Snapshot"; case VIR_DOMAIN_EVENT_STOPPED_LAST: + default: break; } break; @@ -247,6 +255,7 @@ eventDetailToString(int event, return "Host request"; case VIR_DOMAIN_EVENT_SHUTDOWN_LAST: + default: break; } break; @@ -260,6 +269,7 @@ eventDetailToString(int event, return "Disk"; case VIR_DOMAIN_EVENT_PMSUSPENDED_LAST: + default: break; } break; @@ -270,11 +280,13 @@ eventDetailToString(int event, return "Panicked"; case VIR_DOMAIN_EVENT_CRASHED_LAST: + default: break; } break; case VIR_DOMAIN_EVENT_LAST: + default: break; } @@ -299,6 +311,7 @@ networkEventToString(int event) return "Stopped"; case VIR_NETWORK_EVENT_LAST: + default: break; } @@ -317,6 +330,7 @@ guestAgentLifecycleEventStateToString(int event) return "Connected"; case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_LAST: + default: break; } @@ -338,6 +352,7 @@ guestAgentLifecycleEventReasonToString(int event) return "Channel event"; case VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_LAST: + default: break; } @@ -361,6 +376,7 @@ storagePoolEventToString(int event) case VIR_STORAGE_POOL_EVENT_DELETED: return "Deleted"; case VIR_STORAGE_POOL_EVENT_LAST: + default: break; } return "unknown"; @@ -375,6 +391,7 @@ nodeDeviceEventToString(int event) case VIR_NODE_DEVICE_EVENT_DELETED: return "Deleted"; case VIR_NODE_DEVICE_EVENT_LAST: + default: break; } return "unknown"; @@ -392,6 +409,7 @@ secretEventToString(int event) return "Undefined"; case VIR_SECRET_EVENT_LAST: + default: break; } @@ -527,6 +545,7 @@ graphicsPhaseToStr(int phase) return "disconnected"; case VIR_DOMAIN_EVENT_GRAPHICS_LAST: + default: break; } @@ -589,6 +608,7 @@ diskChangeReasonToStr(int reason) return "disk dropped due to startupPolicy"; case VIR_DOMAIN_EVENT_DISK_CHANGE_LAST: + default: break; } @@ -623,6 +643,7 @@ trayChangeReasonToStr(int reason) return "close"; case VIR_DOMAIN_EVENT_TRAY_CHANGE_LAST: + default: break; } @@ -874,6 +895,7 @@ blockJobTypeToStr(int type) switch ((virDomainBlockJobType) type) { case VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN: case VIR_DOMAIN_BLOCK_JOB_TYPE_LAST: + default: break; case VIR_DOMAIN_BLOCK_JOB_TYPE_PULL: @@ -910,6 +932,7 @@ blockJobStatusToStr(int status) return "ready"; case VIR_DOMAIN_BLOCK_JOB_LAST: + default: break; } @@ -1006,6 +1029,7 @@ metadataTypeToStr(int status) return "element"; case VIR_DOMAIN_METADATA_LAST: + default: break; } -- 2.14.3

Even if the compiler has validated that all enum constants have case statements in a switch, it is not safe to omit a default: case statement. When assigning a value to a variable / struct field that is defined with an enum type, nothing prevents an invalid value being assigned. So defensive code must assume existance of invalid values and thus all switches should have a default: case. This enables the -Wswitch-default compiler warning flag which will now enforce this requirement. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- m4/virt-compile-warnings.m4 | 2 -- 1 file changed, 2 deletions(-) diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4 index fc185aef38..216a3ee0e9 100644 --- a/m4/virt-compile-warnings.m4 +++ b/m4/virt-compile-warnings.m4 @@ -45,8 +45,6 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ dontwarn="$dontwarn -Wcast-qual" # We need to use long long in many places dontwarn="$dontwarn -Wlong-long" - # We allow manual list of all enum cases without default: - dontwarn="$dontwarn -Wswitch-default" # Not a problem since we don't use -fstrict-overflow dontwarn="$dontwarn -Wstrict-overflow" # Not a problem since we don't use -funsafe-loop-optimizations -- 2.14.3
participants (4)
-
Andrea Bolognani
-
Daniel P. Berrangé
-
John Ferlan
-
Ján Tomko