Fix various CI build warnings

  * [-Wpointer-arith] arithmetic on a pointer to void is a GNU extension
  * [-Wswitch-enum] enumeration values 'E1, ...' not explicitly handled in switch
  * [-Wunused-parameter] unused parameter 'p'

For '-Wswitch-enum', the switch statements in the individual backends'
set_option() function has been removed. It is not expected that backends
will need to handle or be aware of all the options.

Signed-off-by: Chris Dickens <christopher.a.dickens@gmail.com>
diff --git a/examples/testlibusb.c b/examples/testlibusb.c
index 52bf501..ba00f90 100755
--- a/examples/testlibusb.c
+++ b/examples/testlibusb.c
@@ -261,6 +261,7 @@
 #else
 static int test_wrapped_device(const char *device_name)
 {
+	(void)device_name;
 	printf("Testing wrapped devices is not supported on your platform\n");
 	return 1;
 }
diff --git a/libusb/core.c b/libusb/core.c
index a6b093b..07d459c 100644
--- a/libusb/core.c
+++ b/libusb/core.c
@@ -2524,6 +2524,7 @@
 #if defined(__ANDROID__)
 	int priority;
 	switch (level) {
+	case LIBUSB_LOG_LEVEL_NONE: return;	/* Impossible, but keeps compiler happy */
 	case LIBUSB_LOG_LEVEL_ERROR: priority = ANDROID_LOG_ERROR; break;
 	case LIBUSB_LOG_LEVEL_WARNING: priority = ANDROID_LOG_WARN; break;
 	case LIBUSB_LOG_LEVEL_INFO: priority = ANDROID_LOG_INFO; break;
@@ -2537,6 +2538,7 @@
 #elif defined(HAVE_SYSLOG)
 	int syslog_level;
 	switch (level) {
+	case LIBUSB_LOG_LEVEL_NONE: return;	/* Impossible, but keeps compiler happy */
 	case LIBUSB_LOG_LEVEL_ERROR: syslog_level = LOG_ERR; break;
 	case LIBUSB_LOG_LEVEL_WARNING: syslog_level = LOG_WARNING; break;
 	case LIBUSB_LOG_LEVEL_INFO: syslog_level = LOG_INFO; break;
@@ -2585,6 +2587,8 @@
 #endif
 
 	switch (level) {
+	case LIBUSB_LOG_LEVEL_NONE:	/* Impossible, but keeps compiler happy */
+		return;
 	case LIBUSB_LOG_LEVEL_ERROR:
 		prefix = "error";
 		break;
diff --git a/libusb/os/linux_usbfs.c b/libusb/os/linux_usbfs.c
index f3c188e..fb2ed53 100644
--- a/libusb/os/linux_usbfs.c
+++ b/libusb/os/linux_usbfs.c
@@ -429,16 +429,17 @@
 	UNUSED(ctx);
 	UNUSED(ap);
 
-	switch (option) {
 #ifdef __ANDROID__
-	case LIBUSB_OPTION_WEAK_AUTHORITY:
+	if (option == LIBUSB_OPTION_WEAK_AUTHORITY) {
 		usbi_dbg("set libusb has weak authority");
 		weak_authority = 1;
 		return LIBUSB_SUCCESS;
-#endif
-	default:
-		return LIBUSB_ERROR_NOT_SUPPORTED;
 	}
+#else
+	UNUSED(option);
+#endif
+
+	return LIBUSB_ERROR_NOT_SUPPORTED;
 }
 
 static int linux_scan_devices(struct libusb_context *ctx)
@@ -676,7 +677,7 @@
 	uint8_t *buffer;
 	size_t remaining;
 
-	device_desc = (struct usbi_device_descriptor *)priv->descriptors;
+	device_desc = priv->descriptors;
 	num_configs = device_desc->bNumConfigurations;
 
 	if (num_configs == 0)
@@ -686,7 +687,7 @@
 	if (!priv->config_descriptors)
 		return LIBUSB_ERROR_NO_MEM;
 
-	buffer = priv->descriptors + LIBUSB_DT_DEVICE_SIZE;
+	buffer = (uint8_t *)priv->descriptors + LIBUSB_DT_DEVICE_SIZE;
 	remaining = priv->descriptors_len - LIBUSB_DT_DEVICE_SIZE;
 
 	for (idx = 0; idx < num_configs; idx++) {
@@ -935,19 +936,21 @@
 
 	alloc_len = 0;
 	do {
-		alloc_len += 256;
+		const size_t desc_read_length = 256;
+		uint8_t *read_ptr;
+
+		alloc_len += desc_read_length;
 		priv->descriptors = usbi_reallocf(priv->descriptors, alloc_len);
 		if (!priv->descriptors) {
 			if (fd != wrapped_fd)
 				close(fd);
 			return LIBUSB_ERROR_NO_MEM;
 		}
+		read_ptr = (uint8_t *)priv->descriptors + priv->descriptors_len;
 		/* usbfs has holes in the file */
 		if (!sysfs_dir)
-			memset(priv->descriptors + priv->descriptors_len,
-			       0, alloc_len - priv->descriptors_len);
-		nb = read(fd, priv->descriptors + priv->descriptors_len,
-			  alloc_len - priv->descriptors_len);
+			memset(read_ptr, 0, desc_read_length);
+		nb = read(fd, read_ptr, desc_read_length);
 		if (nb < 0) {
 			usbi_err(ctx, "read descriptor failed, errno=%d", errno);
 			if (fd != wrapped_fd)
diff --git a/libusb/os/windows_common.c b/libusb/os/windows_common.c
index 8dc0e0a..f25c340 100644
--- a/libusb/os/windows_common.c
+++ b/libusb/os/windows_common.c
@@ -592,19 +592,17 @@
 
 	UNUSED(ap);
 
-	switch ((int)option) {
-	case LIBUSB_OPTION_USE_USBDK:
-		if (usbdk_available) {
-			usbi_dbg("switching context %p to use UsbDk backend", ctx);
-			priv->backend = &usbdk_backend;
-		} else {
+	if (option == LIBUSB_OPTION_USE_USBDK) {
+		if (!usbdk_available) {
 			usbi_err(ctx, "UsbDk backend not available");
 			return LIBUSB_ERROR_NOT_FOUND;
 		}
+		usbi_dbg("switching context %p to use UsbDk backend", ctx);
+		priv->backend = &usbdk_backend;
 		return LIBUSB_SUCCESS;
-	default:
-		return LIBUSB_ERROR_NOT_SUPPORTED;
 	}
+
+	return LIBUSB_ERROR_NOT_SUPPORTED;
 }
 
 static int windows_get_device_list(struct libusb_context *ctx, struct discovered_devs **discdevs)
diff --git a/libusb/os/windows_winusb.c b/libusb/os/windows_winusb.c
index 0f857ed..e0d7b1f 100644
--- a/libusb/os/windows_winusb.c
+++ b/libusb/os/windows_winusb.c
@@ -982,14 +982,18 @@
 		config_desc_length = ROOT_HUB_HS_CONFIG_DESC_LENGTH;
 		ep_interval = 0x0c;	// 256ms
 		break;
-	default:
-		// The default case means absolutely no information about this root hub was
-		// determined. There is not much choice than to be pessimistic and label this
-		// as a full-speed device.
+	case LIBUSB_SPEED_LOW:		// Not used, but keeps compiler happy
+	case LIBUSB_SPEED_UNKNOWN:
+		// This case means absolutely no information about this root hub was determined.
+		// There is not much choice than to be pessimistic and label this as a
+		// full-speed device.
 		speed = LIBUSB_SPEED_FULL;
+		// fallthrough
+	case LIBUSB_SPEED_FULL:
 		dev->device_descriptor.bcdUSB = 0x0110;
 		config_desc_length = ROOT_HUB_FS_CONFIG_DESC_LENGTH;
 		ep_interval = 0xff;	// 255ms
+		break;
 	}
 
 	if (speed >= LIBUSB_SPEED_SUPER) {
diff --git a/libusb/version_nano.h b/libusb/version_nano.h
index 9c3a26e..d853d67 100644
--- a/libusb/version_nano.h
+++ b/libusb/version_nano.h
@@ -1 +1 @@
-#define LIBUSB_NANO 11572
+#define LIBUSB_NANO 11573