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(a)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