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

Daniel P. Berrangé posted 42 patches 6 years, 2 months ago
Failed in applying to current master (apply log)
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(-)
[libvirt] [PATCH v2 00/42] Fix build with gcc8 and switch() robustness
Posted by Daniel P. Berrangé 6 years, 2 months ago
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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list