util: New macro CONST_CAST.
authorBen Pfaff <blp@nicira.com>
Fri, 13 Jul 2012 23:00:29 +0000 (16:00 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 3 Aug 2012 20:33:13 +0000 (13:33 -0700)
Casts are sometimes necessary.  One common reason that they are necessary
is for discarding a "const" qualifier.  However, this can impede
maintenance: if the type of the expression being cast changes, then the
presence of the cast can hide a necessary change in the code that does the
cast.  Using CONST_CAST, instead of a bare cast, makes these changes
visible.

Inspired by my own work elsewhere:
http://git.savannah.gnu.org/cgit/pspp.git/tree/src/libpspp/cast.h#n80

Signed-off-by: Ben Pfaff <blp@nicira.com>
25 files changed:
lib/bitmap.h
lib/dpif-linux.c
lib/dynamic-string.c
lib/hmap.h
lib/json.c
lib/list.c
lib/netdev-linux.c
lib/netdev.c
lib/netlink-socket.c
lib/ofpbuf.c
lib/ovsdb-data.c
lib/ovsdb-idl.c
lib/shash.c
lib/sset.h
lib/stp.c
lib/stream-ssl.c
lib/util.h
lib/vlog.c
ofproto/connmgr.c
ofproto/ofproto-dpif.c
ofproto/ofproto.c
ovsdb/ovsdb-server.c
ovsdb/row.c
ovsdb/transaction.c
tests/test-stp.c

index 47b77e7326aed77d6e9f0ade5cff446461ca7135..89804962323572d4d1be8fb450fd9ff8cdda0624 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
 static inline unsigned long *
 bitmap_unit__(const unsigned long *bitmap, size_t offset)
 {
-    return (unsigned long *) &bitmap[offset / BITMAP_ULONG_BITS];
+    return CONST_CAST(unsigned long *, &bitmap[offset / BITMAP_ULONG_BITS]);
 }
 
 static inline unsigned long
index 97850f5b6a2aee7b1589dff88d1a82d31f2254c0..d9c50ccdf5f0d35738d0492a2abcb39d917798da 100644 (file)
@@ -595,8 +595,8 @@ dpif_linux_port_dump_next(const struct dpif *dpif OVS_UNUSED, void *state_,
         return error;
     }
 
-    dpif_port->name = (char *) vport.name;
-    dpif_port->type = (char *) netdev_vport_get_netdev_type(&vport);
+    dpif_port->name = CONST_CAST(char *, vport.name);
+    dpif_port->type = CONST_CAST(char *, netdev_vport_get_netdev_type(&vport));
     dpif_port->port_no = vport.port_no;
     return 0;
 }
@@ -668,7 +668,7 @@ dpif_linux_flow_get(const struct dpif *dpif_,
             dpif_linux_flow_get_stats(&reply, stats);
         }
         if (actionsp) {
-            buf->data = (void *) reply.actions;
+            buf->data = CONST_CAST(struct nlattr *, reply.actions);
             buf->size = reply.actions_len;
             *actionsp = buf;
         } else {
@@ -1169,9 +1169,11 @@ parse_odp_packet(struct ofpbuf *buf, struct dpif_upcall *upcall,
     memset(upcall, 0, sizeof *upcall);
     upcall->type = type;
     upcall->packet = buf;
-    upcall->packet->data = (void *) nl_attr_get(a[OVS_PACKET_ATTR_PACKET]);
+    upcall->packet->data = CONST_CAST(struct nlattr *,
+                                      nl_attr_get(a[OVS_PACKET_ATTR_PACKET]));
     upcall->packet->size = nl_attr_get_size(a[OVS_PACKET_ATTR_PACKET]);
-    upcall->key = (void *) nl_attr_get(a[OVS_PACKET_ATTR_KEY]);
+    upcall->key = CONST_CAST(struct nlattr *,
+                             nl_attr_get(a[OVS_PACKET_ATTR_KEY]));
     upcall->key_len = nl_attr_get_size(a[OVS_PACKET_ATTR_KEY]);
     upcall->userdata = (a[OVS_PACKET_ATTR_USERDATA]
                         ? nl_attr_get_u64(a[OVS_PACKET_ATTR_USERDATA])
index e7ad73cd667996bd4f7628ed0bfb7ef34fb6503d..b648eef6549a28ab9c3c1b77e0f1beb1074ddcc3 100644 (file)
@@ -311,7 +311,7 @@ ds_cstr(struct ds *ds)
 const char *
 ds_cstr_ro(const struct ds *ds)
 {
-    return ds_cstr((struct ds *) ds);
+    return ds_cstr(CONST_CAST(struct ds *, ds));
 }
 
 /* Returns a null-terminated string representing the current contents of 'ds',
index 9d07e842043f4666d79e2fe633bb45348ab5beac..2867bfa0b1ffa3f9a8c8b21dca63632a0e9e81e4 100644 (file)
@@ -247,7 +247,7 @@ hmap_next_with_hash__(const struct hmap_node *node, size_t hash)
     while (node != NULL && node->hash != hash) {
         node = node->next;
     }
-    return (struct hmap_node *) node;
+    return CONST_CAST(struct hmap_node *, node);
 }
 
 /* Returns the first node in 'hmap' with the given 'hash', or a null pointer if
index ddce335a0bf33638238c3e2c3ac46bad4d3caeeb..f0b6456aae8c7ffe417558aea9796c83688dbefe 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -296,14 +296,14 @@ struct json_array *
 json_array(const struct json *json)
 {
     assert(json->type == JSON_ARRAY);
-    return (struct json_array *) &json->u.array;
+    return CONST_CAST(struct json_array *, &json->u.array);
 }
 
 struct shash *
 json_object(const struct json *json)
 {
     assert(json->type == JSON_OBJECT);
-    return (struct shash *) json->u.object;
+    return CONST_CAST(struct shash *, json->u.object);
 }
 
 bool
index 71790cc373e78a393e362f257ea10c540102556d..804a7e56adc10e452f008ffafed9ca2010931ce1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -136,7 +136,7 @@ list_pop_back(struct list *list)
 struct list *
 list_front(const struct list *list_)
 {
-    struct list *list = (struct list *) list_;
+    struct list *list = CONST_CAST(struct list *, list_);
 
     assert(!list_is_empty(list));
     return list->next;
@@ -147,7 +147,7 @@ list_front(const struct list *list_)
 struct list *
 list_back(const struct list *list_)
 {
-    struct list *list = (struct list *) list_;
+    struct list *list = CONST_CAST(struct list *, list_);
 
     assert(!list_is_empty(list));
     return list->prev;
index efce9a7e29e75e3f87cf4f94a3d2b7d831e863ef..412a92debf0d0758ffcdb2fe0e7fa70c1ee0e7d3 100644 (file)
@@ -955,7 +955,7 @@ netdev_linux_send(struct netdev *netdev_, const void *data, size_t size)
             sll.sll_family = AF_PACKET;
             sll.sll_ifindex = ifindex;
 
-            iov.iov_base = (void *) data;
+            iov.iov_base = CONST_CAST(void *, data);
             iov.iov_len = size;
 
             msg.msg_name = &sll;
@@ -4106,7 +4106,7 @@ tc_query_qdisc(const struct netdev *netdev)
     }
 
     /* Instantiate it. */
-    load_error = ops->tc_load((struct netdev *) netdev, qdisc);
+    load_error = ops->tc_load(CONST_CAST(struct netdev *, netdev), qdisc);
     assert((load_error == 0) == (netdev_dev->tc != NULL));
     ofpbuf_delete(qdisc);
 
index ac98cb52ba79bd2b2d5a414f1e13225757c23f82..394d8957f2488b3640be292c7a219066234e9cf3 100644 (file)
@@ -847,7 +847,7 @@ do_update_flags(struct netdev *netdev, enum netdev_flags off,
 int
 netdev_get_flags(const struct netdev *netdev_, enum netdev_flags *flagsp)
 {
-    struct netdev *netdev = (struct netdev *) netdev_;
+    struct netdev *netdev = CONST_CAST(struct netdev *, netdev_);
     return do_update_flags(netdev, 0, 0, flagsp, false);
 }
 
index 3bdbbd73c70775d05b6a38ae50ae30afe50dcd9a..49a8493eccc54a60c1927f6029108e90f96bad33 100644 (file)
@@ -683,7 +683,7 @@ nl_sock_transact(struct nl_sock *sock, const struct ofpbuf *request,
     struct nl_transaction *transactionp;
     struct nl_transaction transaction;
 
-    transaction.request = (struct ofpbuf *) request;
+    transaction.request = CONST_CAST(struct ofpbuf *, request);
     transaction.reply = replyp ? ofpbuf_new(1024) : NULL;
     transactionp = &transaction;
 
index 02e5aa870ed7669ae4c0fd31ba02b7e4838efc04..a7d4c734181763e5134175d59defb8c69d658989 100644 (file)
@@ -95,7 +95,7 @@ ofpbuf_use_stub(struct ofpbuf *b, void *base, size_t allocated)
 void
 ofpbuf_use_const(struct ofpbuf *b, const void *data, size_t size)
 {
-    ofpbuf_use__(b, (void *) data, size, OFPBUF_STACK);
+    ofpbuf_use__(b, CONST_CAST(void *, data), size, OFPBUF_STACK);
     b->size = size;
 }
 
@@ -408,7 +408,7 @@ ofpbuf_put_hex(struct ofpbuf *b, const char *s, size_t *n)
             if (n) {
                 *n = b->size - initial_size;
             }
-            return (char *) s;
+            return CONST_CAST(char *, s);
         }
 
         ofpbuf_put(b, &byte, 1);
index 3e6f20bbee239b85291e0680891d9d608d4fb8de..e357233bc69a063616fe70513f1eab446e021b46 100644 (file)
@@ -884,9 +884,10 @@ ovsdb_datum_default(const struct ovsdb_type *type)
         d = &default_data[kt][vt];
         if (!d->n) {
             d->n = 1;
-            d->keys = (union ovsdb_atom *) ovsdb_atom_default(kt);
+            d->keys = CONST_CAST(union ovsdb_atom *, ovsdb_atom_default(kt));
             if (vt != OVSDB_TYPE_VOID) {
-                d->values = (union ovsdb_atom *) ovsdb_atom_default(vt);
+                d->values = CONST_CAST(union ovsdb_atom *,
+                                       ovsdb_atom_default(vt));
             }
         }
         return d;
index 3eca2feb320b58a76497cfbe4bec7cf8e99a98fd..534beb02cf404d811228f0f9cedde95daff8202a 100644 (file)
@@ -1820,7 +1820,7 @@ ovsdb_idl_txn_write(const struct ovsdb_idl_row *row_,
                     const struct ovsdb_idl_column *column,
                     struct ovsdb_datum *datum)
 {
-    struct ovsdb_idl_row *row = (struct ovsdb_idl_row *) row_;
+    struct ovsdb_idl_row *row = CONST_CAST(struct ovsdb_idl_row *, row_);
     const struct ovsdb_idl_table_class *class;
     size_t column_idx;
 
@@ -1907,7 +1907,7 @@ void
 ovsdb_idl_txn_verify(const struct ovsdb_idl_row *row_,
                      const struct ovsdb_idl_column *column)
 {
-    struct ovsdb_idl_row *row = (struct ovsdb_idl_row *) row_;
+    struct ovsdb_idl_row *row = CONST_CAST(struct ovsdb_idl_row *, row_);
     const struct ovsdb_idl_table_class *class;
     size_t column_idx;
 
@@ -1946,7 +1946,7 @@ ovsdb_idl_txn_verify(const struct ovsdb_idl_row *row_,
 void
 ovsdb_idl_txn_delete(const struct ovsdb_idl_row *row_)
 {
-    struct ovsdb_idl_row *row = (struct ovsdb_idl_row *) row_;
+    struct ovsdb_idl_row *row = CONST_CAST(struct ovsdb_idl_row *, row_);
 
     if (ovsdb_idl_row_is_synthetic(row)) {
         return;
index 74801763ecaf728442db9239fb190c8be41215f1..1cf7d6e1631b9300637f0c74ebfbc61e0f6f3f50 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -109,7 +109,7 @@ shash_add_nocopy__(struct shash *sh, char *name, const void *data, size_t hash)
 {
     struct shash_node *node = xmalloc(sizeof *node);
     node->name = name;
-    node->data = (void *) data;
+    node->data = CONST_CAST(void *, data);
     hmap_insert(&sh->map, &node->node, hash);
     return node;
 }
@@ -163,7 +163,7 @@ shash_replace(struct shash *sh, const char *name, const void *data)
         return NULL;
     } else {
         void *old_data = node->data;
-        node->data = (void *) data;
+        node->data = CONST_CAST(void *, data);
         return old_data;
     }
 }
index 7f9e1250c919fa741b9eda0f9ac493069bb5068d..f63f4ab9e4794c40a1e5b3ba026082de79af8192 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011 Nicira, Inc.
+ * Copyright (c) 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
 #define SSET_H
 
 #include "hmap.h"
+#include "util.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -82,7 +83,7 @@ bool sset_equals(const struct sset *, const struct sset *);
 #define SSET_NODE_FROM_HMAP_NODE(HMAP_NODE) \
     CONTAINER_OF(HMAP_NODE, struct sset_node, hmap_node)
 #define SSET_NAME_FROM_HMAP_NODE(HMAP_NODE) \
-    ((const char *) (SSET_NODE_FROM_HMAP_NODE(HMAP_NODE)->name))
+    (CONST_CAST(const char *, (SSET_NODE_FROM_HMAP_NODE(HMAP_NODE)->name)))
 #define SSET_NODE_FROM_NAME(NAME) CONTAINER_OF(NAME, struct sset_node, name)
 #define SSET_FIRST(SSET) SSET_NAME_FROM_HMAP_NODE(hmap_first(&(SSET)->map))
 #define SSET_NEXT(SSET, NAME)                                           \
index ee5c8bcde84527c4509d46231915e56d272eeb8a..3d293b6c6137c5fd2bf3817c9d8eba41e991a1ff 100644 (file)
--- a/lib/stp.c
+++ b/lib/stp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -151,7 +151,7 @@ stp_next_enabled_port(const struct stp *stp, const struct stp_port *port)
 {
     for (; port < &stp->ports[ARRAY_SIZE(stp->ports)]; port++) {
         if (port->state != STP_DISABLED) {
-            return (struct stp_port *) port;
+            return CONST_CAST(struct stp_port *, port);
         }
     }
     return NULL;
index f2d5037ad32718e18c0ed7e8289bdcf0fd5b1fd4..42690e481b8ab954cc7f921db1ad6c42909def61 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -902,7 +902,7 @@ do_ssl_init(void)
 
     /* New OpenSSL changed TLSv1_method() to return a "const" pointer, so the
      * cast is needed to avoid a warning with those newer versions. */
-    method = (SSL_METHOD *) TLSv1_method();
+    method = CONST_CAST(SSL_METHOD *, TLSv1_method());
     if (method == NULL) {
         VLOG_ERR("TLSv1_method: %s", ERR_error_string(ERR_get_error(), NULL));
         return ENOPROTOOPT;
index 60ec737e2ad9580c9214a4b94aec303571682ceb..57527fcc686edbfcedcf5149ecf369a69e123758 100644 (file)
 #define BUILD_ASSERT_DECL_GCCONLY(EXPR) ((void) 0)
 #endif
 
+/* Casts 'pointer' to 'type' and issues a compiler warning if the cast changes
+ * anything other than an outermost "const" or "volatile" qualifier.
+ *
+ * The cast to int is present only to suppress an "expression using sizeof
+ * bool" warning from "sparse" (see
+ * http://permalink.gmane.org/gmane.comp.parsers.sparse/2967). */
+#define CONST_CAST(TYPE, POINTER)                               \
+    ((void) sizeof ((int) ((POINTER) == (TYPE) (POINTER))),     \
+     (TYPE) (POINTER))
+
 extern const char *program_name;
 extern const char *subprogram_name;
 
index fc601e8d13f0e8bf48c5be75e9cfd0aac6e0ea91..683cdfcf02ac00dbe50cb5dce52bc2410cd23749 100644 (file)
@@ -762,7 +762,7 @@ void
 vlog_fatal_valist(const struct vlog_module *module_,
                   const char *message, va_list args)
 {
-    struct vlog_module *module = (struct vlog_module *) module_;
+    struct vlog_module *module = CONST_CAST(struct vlog_module *, module_);
 
     /* Don't log this message to the console to avoid redundancy with the
      * message written by the later ovs_fatal_valist(). */
index 5ce77c04c579e97e129c77f4ce3a368cce513f9d..d436f7795dc9cc18221ed73ced89171be5d11a4b 100644 (file)
@@ -477,7 +477,7 @@ connmgr_free_controller_info(struct shash *info)
     SHASH_FOR_EACH (node, info) {
         struct ofproto_controller_info *cinfo = node->data;
         while (cinfo->pairs.n) {
-            free((char *) cinfo->pairs.values[--cinfo->pairs.n]);
+            free(CONST_CAST(char *, cinfo->pairs.values[--cinfo->pairs.n]));
         }
         free(cinfo);
     }
index c50353ede4b53af19704907c0bc5b6d707fdd559..95195a30ca784ed30db2757ac5193ae1e3a25457 100644 (file)
@@ -1964,7 +1964,7 @@ bundle_set(struct ofproto *ofproto_, void *aux,
         break;
 
     case PORT_VLAN_TRUNK:
-        trunks = (unsigned long *) s->trunks;
+        trunks = CONST_CAST(unsigned long *, s->trunks);
         break;
 
     case PORT_VLAN_NATIVE_UNTAGGED:
@@ -1981,7 +1981,7 @@ bundle_set(struct ofproto *ofproto_, void *aux,
             bitmap_set1(trunks, vlan);
             bitmap_set0(trunks, 0);
         } else {
-            trunks = (unsigned long *) s->trunks;
+            trunks = CONST_CAST(unsigned long *, s->trunks);
         }
         break;
 
index 0f24fd018b0dc613714cad2f99f813130c151ac5..cf31a3b2448342edd7c9ad292109cf628e119db2 100644 (file)
@@ -3455,7 +3455,7 @@ ofproto_compose_flow_refresh_update(const struct rule *rule,
     fu.hard_timeout = rule->hard_timeout;
     fu.table_id = rule->table_id;
     fu.cookie = rule->flow_cookie;
-    fu.match = (struct cls_rule *) &rule->cr;
+    fu.match = CONST_CAST(struct cls_rule *, &rule->cr);
     if (!(flags & NXFMF_ACTIONS)) {
         fu.ofpacts = NULL;
         fu.ofpacts_len = 0;
index 6c68e506b197cfb19473e5d736b50ea8e882c12b..1bf10d9b477d29cff8d117e91903e59b32cf234d 100644 (file)
@@ -350,8 +350,8 @@ read_map_string_column(const struct ovsdb_row *row, const char *column_name,
     union ovsdb_atom *atom_key = NULL, *atom_value = NULL;
     size_t i;
 
-    datum = get_datum((struct ovsdb_row *) row, column_name, OVSDB_TYPE_STRING,
-                      OVSDB_TYPE_STRING, UINT_MAX);
+    datum = get_datum(CONST_CAST(struct ovsdb_row *, row), column_name,
+                      OVSDB_TYPE_STRING, OVSDB_TYPE_STRING, UINT_MAX);
 
     if (!datum) {
         return NULL;
@@ -374,8 +374,8 @@ read_column(const struct ovsdb_row *row, const char *column_name,
 {
     const struct ovsdb_datum *datum;
 
-    datum = get_datum((struct ovsdb_row *) row, column_name, type, OVSDB_TYPE_VOID,
-                      1);
+    datum = get_datum(CONST_CAST(struct ovsdb_row *, row), column_name, type,
+                      OVSDB_TYPE_VOID, 1);
     return datum && datum->n ? datum->keys : NULL;
 }
 
index 457869b38cdbdade316885bb4c9bcdcec9bed501..450c3274543230bc2cd3170b9412b1997d67dfa8 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ allocate_row(const struct ovsdb_table *table)
                        + sizeof(struct ovsdb_datum) * n_fields
                        + sizeof(struct hmap_node) * n_indexes);
     struct ovsdb_row *row = xmalloc(row_size);
-    row->table = (struct ovsdb_table *) table;
+    row->table = CONST_CAST(struct ovsdb_table *, table);
     row->txn_row = NULL;
     list_init(&row->src_refs);
     list_init(&row->dst_refs);
@@ -347,7 +347,7 @@ ovsdb_row_hash_destroy(struct ovsdb_row_hash *rh, bool destroy_rows)
     HMAP_FOR_EACH_SAFE (node, next, hmap_node, &rh->rows) {
         hmap_remove(&rh->rows, &node->hmap_node);
         if (destroy_rows) {
-            ovsdb_row_destroy((struct ovsdb_row *) node->row);
+            ovsdb_row_destroy(CONST_CAST(struct ovsdb_row *, node->row));
         }
         free(node);
     }
index e785e216d23071fb6d87fea2b5e2cf65a1b9381c..cc890ad8d189a8424ba9cb1da83b137fd7ff0bb3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -439,8 +439,8 @@ static void
 add_weak_ref(struct ovsdb_txn *txn,
              const struct ovsdb_row *src_, const struct ovsdb_row *dst_)
 {
-    struct ovsdb_row *src = (struct ovsdb_row *) src_;
-    struct ovsdb_row *dst = (struct ovsdb_row *) dst_;
+    struct ovsdb_row *src = CONST_CAST(struct ovsdb_row *, src_);
+    struct ovsdb_row *dst = CONST_CAST(struct ovsdb_row *, dst_);
     struct ovsdb_weak_ref *weak;
 
     if (src == dst) {
@@ -864,7 +864,7 @@ ovsdb_txn_row_create(struct ovsdb_txn *txn, struct ovsdb_table *table,
                      const struct ovsdb_row *old_, struct ovsdb_row *new)
 {
     const struct ovsdb_row *row = old_ ? old_ : new;
-    struct ovsdb_row *old = (struct ovsdb_row *) old_;
+    struct ovsdb_row *old = CONST_CAST(struct ovsdb_row *, old_);
     size_t n_columns = shash_count(&table->schema->columns);
     struct ovsdb_txn_table *txn_table;
     struct ovsdb_txn_row *txn_row;
@@ -895,7 +895,7 @@ ovsdb_txn_row_create(struct ovsdb_txn *txn, struct ovsdb_table *table,
 struct ovsdb_row *
 ovsdb_txn_row_modify(struct ovsdb_txn *txn, const struct ovsdb_row *ro_row_)
 {
-    struct ovsdb_row *ro_row = (struct ovsdb_row *) ro_row_;
+    struct ovsdb_row *ro_row = CONST_CAST(struct ovsdb_row *, ro_row_);
 
     if (ro_row->txn_row) {
         assert(ro_row == ro_row->txn_row->new);
@@ -931,7 +931,7 @@ ovsdb_txn_row_insert(struct ovsdb_txn *txn, struct ovsdb_row *row)
 void
 ovsdb_txn_row_delete(struct ovsdb_txn *txn, const struct ovsdb_row *row_)
 {
-    struct ovsdb_row *row = (struct ovsdb_row *) row_;
+    struct ovsdb_row *row = CONST_CAST(struct ovsdb_row *, row_);
     struct ovsdb_table *table = row->table;
     struct ovsdb_txn_row *txn_row = row->txn_row;
 
index 87c12a0cc29cf0aa2c99800fb8939e5dffa09921..0acc7e0d91e46e03e685bd632558bde01142b730 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009, 2010 Nicira, Inc.
+ * Copyright (c) 2008, 2009, 2010, 2012 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -656,7 +656,7 @@ main(int argc, char *argv[])
 
     for (i = 0; i < tc->n_lans; i++) {
         struct lan *lan = tc->lans[i];
-        free((char *) lan->name);
+        free(CONST_CAST(char *, lan->name));
         free(lan);
     }
     for (i = 0; i < tc->n_bridges; i++) {