[Libguestfs] [libnbd PATCH] maint: Drop useless casts

Eric Blake eblake at redhat.com
Wed May 24 15:00:03 UTC 2023


While reviewing the previous whitespace-only patch, I noticed several
casts that are semantically unnecessary in C:

- converting pointers to and from void* does not need a cast except
  for function pointers or when also casting away const (different
  from C++ where casts to or from void* are required for type safety);
  includes cases like python PyCapsule code which uses void*

- casting away const on a string literal (in C, string literals are
  typed 'char *', different from C++ where they are 'const char *';
  that said, C says it is still undefined behavior to modify their
  contents, so string literals should generally be only assigned to
  'const char *' variables or passed to functions that promise not to
  modify contents); includes cases like ocaml's struct
  custom_operations using 'const char *' as its member type (where
  casting away const just to re-add it is pointless)

- casts used to document what would otherwise be implicit type
  conversions when assigning to integers of a different type or
  passing function parameters not through varargs. While this can be
  useful for documentation purposes, it can also mask bugs when the
  cast uses the wrong intermediate type only to be implicitly
  converted back to the destination type, and it is often easier to
  use optional compiler warning flags to catch instances of unintended
  truncation or sign extension by implicit conversions.

Minimizing semantically unneeded casts lets the remaining casts stand
out for why they are necessary: casting aways const, casts between
pointer aliases (such as struct sockaddr*, char* vs unsigned char*,
...), and scalars passed through vargs in printf-like functions.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 generator/Python.ml                          | 2 +-
 generator/states-connect-socket-activation.c | 2 +-
 generator/states-issue-command.c             | 2 +-
 lib/utils.c                                  | 4 ++--
 python/handle.c                              | 2 +-
 ocaml/nbd-c.h                                | 6 +++---
 tests/opt-set-meta.c                         | 2 +-
 copy/main.c                                  | 6 +++---
 fuse/nbdfuse.c                               | 4 ++--
 fuse/operations.c                            | 2 +-
 ublk/nbdublk.c                               | 4 ++--
 11 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/generator/Python.ml b/generator/Python.ml
index b73f9782..c81878de 100644
--- a/generator/Python.ml
+++ b/generator/Python.ml
@@ -49,7 +49,7 @@ let
 {
   assert (obj);
   assert (obj != Py_None);
-  return (struct nbd_handle *)PyCapsule_GetPointer(obj, \"nbd_handle\");
+  return PyCapsule_GetPointer(obj, \"nbd_handle\");
 }

 /* nbd.Error exception. */
diff --git a/generator/states-connect-socket-activation.c b/generator/states-connect-socket-activation.c
index 98a39c0e..40a3528c 100644
--- a/generator/states-connect-socket-activation.c
+++ b/generator/states-connect-socket-activation.c
@@ -294,7 +294,7 @@  CONNECT_SA.START:

     char buf[32];
     const char *v =
-      nbd_internal_fork_safe_itoa ((long)getpid (), buf, sizeof buf);
+      nbd_internal_fork_safe_itoa (getpid (), buf, sizeof buf);
     NBD_INTERNAL_FORK_SAFE_ASSERT (strlen (v) <= sact_var[pid_ofs].value_len);
     strcpy (env.ptr[pid_ofs] + sact_var[pid_ofs].prefix_len, v);

diff --git a/generator/states-issue-command.c b/generator/states-issue-command.c
index 34ef4652..111e131c 100644
--- a/generator/states-issue-command.c
+++ b/generator/states-issue-command.c
@@ -46,7 +46,7 @@  ISSUE_COMMAND.START:
   h->request.type = htobe16 (cmd->type);
   h->request.handle = htobe64 (cmd->cookie);
   h->request.offset = htobe64 (cmd->offset);
-  h->request.count = htobe32 ((uint32_t)cmd->count);
+  h->request.count = htobe32 (cmd->count);
   h->chunks_sent++;
   h->wbuf = &h->request;
   h->wlen = sizeof (h->request);
diff --git a/lib/utils.c b/lib/utils.c
index e3e13cdd..5df5ae51 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -154,7 +154,7 @@ nbd_internal_set_querylist (struct nbd_handle *h, char **queries)
 const char *
 nbd_internal_fork_safe_itoa (long v, char *buf, size_t bufsize)
 {
-  unsigned long uv = (unsigned long)v;
+  unsigned long uv = v;
   size_t i = bufsize - 1;
   bool neg = false;

@@ -282,7 +282,7 @@ nbd_internal_fork_safe_perror (const char *s)
 #endif
 #endif
   if (!m)
-    m = nbd_internal_fork_safe_itoa ((long)errno, buf, sizeof buf);
+    m = nbd_internal_fork_safe_itoa (errno, buf, sizeof buf);
   xwritel (STDERR_FILENO, s, ": ", m, "\n", (char *)NULL);

   /* Restore original errno in case it was disturbed by the system
diff --git a/python/handle.c b/python/handle.c
index 8ff6ba81..548f2dfe 100644
--- a/python/handle.c
+++ b/python/handle.c
@@ -46,7 +46,7 @@ static inline PyObject *
 put_handle (struct nbd_handle *h)
 {
   assert (h);
-  return PyCapsule_New ((void *)h, "nbd_handle", NULL);
+  return PyCapsule_New (h, "nbd_handle", NULL);
 }

 PyObject *
diff --git a/ocaml/nbd-c.h b/ocaml/nbd-c.h
index 0cbe36d1..e3abb912 100644
--- a/ocaml/nbd-c.h
+++ b/ocaml/nbd-c.h
@@ -49,7 +49,7 @@ static inline value
 caml_alloc_initialized_string (mlsize_t len, const char *p)
 {
   value sv = caml_alloc_string (len);
-  memcpy ((char *)String_val (sv), p, len);
+  memcpy (String_val (sv), p, len);
   return sv;
 }
 #endif
@@ -70,7 +70,7 @@ extern void nbd_internal_ocaml_exception_in_wrapper (const char *, value);
 #define NBD_val(v) (*((struct nbd_handle **)Data_custom_val (v)))

 static struct custom_operations libnbd_custom_operations = {
-  (char *)"libnbd_custom_operations",
+  "libnbd_custom_operations",
   nbd_internal_ocaml_handle_finalize,
   custom_compare_default,
   custom_hash_default,
@@ -110,7 +110,7 @@ struct nbd_buffer {
 #define NBD_buffer_val(v) ((struct nbd_buffer *)Data_custom_val (v))

 static struct custom_operations nbd_buffer_custom_operations = {
-  (char *)"nbd_buffer_custom_operations",
+  "nbd_buffer_custom_operations",
   nbd_internal_ocaml_buffer_finalize,
   custom_compare_default,
   custom_hash_default,
diff --git a/tests/opt-set-meta.c b/tests/opt-set-meta.c
index 1bd60a9c..06f503af 100644
--- a/tests/opt-set-meta.c
+++ b/tests/opt-set-meta.c
@@ -219,7 +219,7 @@ main (int argc, char *argv[])
    * or newer with its --no-sr kill switch.
    */
   requires ("nbdkit --no-sr --help");
-  args[ARRAY_SIZE (args) - 2] = (char *)"--no-sr";
+  args[ARRAY_SIZE (args) - 2] = "--no-sr";
   nbd = nbd_create ();
   if (nbd == NULL ||
       nbd_set_opt_mode (nbd, true) == -1 ||
diff --git a/copy/main.c b/copy/main.c
index 391c0c4f..9449440e 100644
--- a/copy/main.c
+++ b/copy/main.c
@@ -371,7 +371,7 @@ main (int argc, char *argv[])
 #else
     t = 1;
 #endif
-    threads = (unsigned)t;
+    threads = t;
   }

   if (synchronous)
@@ -534,7 +534,7 @@ open_local (const char *filename, direction d)
   }
   if (S_ISREG (stat.st_mode))   /* Regular file. */
     return file_create (filename, fd,
-                        stat.st_size, (uint64_t)stat.st_blksize, false, d);
+                        stat.st_size, stat.st_blksize, false, d);
   else if (S_ISBLK (stat.st_mode)) { /* Block device. */
     unsigned int blkioopt;

@@ -549,7 +549,7 @@ open_local (const char *filename, direction d)
 #endif

     return file_create (filename, fd,
-                        stat.st_size, (uint64_t)blkioopt, true, d);
+                        stat.st_size, blkioopt, true, d);
   }
   else {              /* Probably stdin/stdout, a pipe or a socket. */
     synchronous = true;        /* Force synchronous mode for pipes. */
diff --git a/fuse/nbdfuse.c b/fuse/nbdfuse.c
index 491f6db8..35d5ffac 100644
--- a/fuse/nbdfuse.c
+++ b/fuse/nbdfuse.c
@@ -415,7 +415,7 @@ main (int argc, char *argv[])
       handles_append (&nbd, h); /* reserved above, so can't fail */
     }
   }
-  connections = (unsigned)nbd.len;
+  connections = nbd.len;
   if (verbose)
     fprintf (stderr, "nbdfuse: connections=%u\n", connections);

@@ -424,7 +424,7 @@ main (int argc, char *argv[])
     fprintf (stderr, "%s\n", nbd_get_error ());
     exit (EXIT_FAILURE);
   }
-  size = (uint64_t)ssize;
+  size = ssize;

   /* If the remote NBD server is readonly, then act as if the '-r'
    * flag was given on the nbdfuse command line.
diff --git a/fuse/operations.c b/fuse/operations.c
index 2d0634dc..e487d150 100644
--- a/fuse/operations.c
+++ b/fuse/operations.c
@@ -396,7 +396,7 @@ nbdfuse_read (const char *path, char *buf,

   CHECK_NBD_ASYNC_ERROR (nbd_aio_pread (h, buf, count, offset, cb, 0));

-  return (int)count;
+  return count;
 }

 static int
diff --git a/ublk/nbdublk.c b/ublk/nbdublk.c
index b85ac609..2f097f3e 100644
--- a/ublk/nbdublk.c
+++ b/ublk/nbdublk.c
@@ -347,7 +347,7 @@ main (int argc, char *argv[])
       handles_append (&nbd, h); /* reserved above, so can't fail */
     }
   }
-  connections = (unsigned)nbd.len;
+  connections = nbd.len;

   /* Get the size and preferred block sizes. */
   rs = nbd_get_size (nbd.ptr[0]);
@@ -355,7 +355,7 @@ main (int argc, char *argv[])
     fprintf (stderr, "%s\n", nbd_get_error ());
     exit (EXIT_FAILURE);
   }
-  size = (uint64_t)rs;
+  size = rs;

   rs = nbd_get_block_size (nbd.ptr[0], LIBNBD_SIZE_MAXIMUM);
   if (rs <= 0 || rs > 64 * 1024 * 1024)
-- 
2.40.1



More information about the Libguestfs mailing list