Awesome, this is a huge win. Thanks a lot. Ethan
On Fri, Jul 20, 2012 at 4:25 PM, Ben Pfaff <b...@nicira.com> wrote: > 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 <b...@nicira.com> > --- > lib/bitmap.h | 4 ++-- > lib/dpif-linux.c | 12 +++++++----- > lib/dynamic-string.c | 2 +- > lib/hmap.h | 2 +- > lib/json.c | 6 +++--- > lib/list.c | 6 +++--- > lib/netdev-linux.c | 4 ++-- > lib/netdev.c | 2 +- > lib/netlink-socket.c | 2 +- > lib/ofpbuf.c | 4 ++-- > lib/ovsdb-data.c | 5 +++-- > lib/ovsdb-idl.c | 6 +++--- > lib/shash.c | 6 +++--- > lib/sset.h | 5 +++-- > lib/stp.c | 4 ++-- > lib/stream-ssl.c | 4 ++-- > lib/util.h | 10 ++++++++++ > lib/vlog.c | 2 +- > ofproto/connmgr.c | 2 +- > ofproto/ofproto-dpif.c | 4 ++-- > ofproto/ofproto.c | 2 +- > ovsdb/ovsdb-server.c | 8 ++++---- > ovsdb/ovsdb-tool.c | 2 +- > ovsdb/row.c | 6 +++--- > ovsdb/transaction.c | 12 ++++++------ > tests/test-stp.c | 4 ++-- > 26 files changed, 70 insertions(+), 56 deletions(-) > > diff --git a/lib/bitmap.h b/lib/bitmap.h > index 47b77e7..8980496 100644 > --- a/lib/bitmap.h > +++ b/lib/bitmap.h > @@ -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 > diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c > index fcf6899..409a68d 100644 > --- a/lib/dpif-linux.c > +++ b/lib/dpif-linux.c > @@ -590,8 +590,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; > } > @@ -663,7 +663,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 { > @@ -1164,9 +1164,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]) > diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c > index e7ad73c..b648eef 100644 > --- a/lib/dynamic-string.c > +++ b/lib/dynamic-string.c > @@ -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', > diff --git a/lib/hmap.h b/lib/hmap.h > index 9d07e84..2867bfa 100644 > --- a/lib/hmap.h > +++ b/lib/hmap.h > @@ -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 > diff --git a/lib/json.c b/lib/json.c > index ddce335..f0b6456 100644 > --- a/lib/json.c > +++ b/lib/json.c > @@ -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 > diff --git a/lib/list.c b/lib/list.c > index 71790cc..804a7e5 100644 > --- a/lib/list.c > +++ b/lib/list.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. > @@ -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; > diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c > index efce9a7..412a92d 100644 > --- a/lib/netdev-linux.c > +++ b/lib/netdev-linux.c > @@ -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); > > diff --git a/lib/netdev.c b/lib/netdev.c > index 1b76785..7811f68 100644 > --- a/lib/netdev.c > +++ b/lib/netdev.c > @@ -843,7 +843,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); > } > > diff --git a/lib/netlink-socket.c b/lib/netlink-socket.c > index 3bdbbd7..49a8493 100644 > --- a/lib/netlink-socket.c > +++ b/lib/netlink-socket.c > @@ -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; > > diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c > index 02e5aa8..a7d4c73 100644 > --- a/lib/ofpbuf.c > +++ b/lib/ofpbuf.c > @@ -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); > diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c > index 3e6f20b..e357233 100644 > --- a/lib/ovsdb-data.c > +++ b/lib/ovsdb-data.c > @@ -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; > diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c > index 3eca2fe..534beb0 100644 > --- a/lib/ovsdb-idl.c > +++ b/lib/ovsdb-idl.c > @@ -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; > diff --git a/lib/shash.c b/lib/shash.c > index 7480176..1cf7d6e 100644 > --- a/lib/shash.c > +++ b/lib/shash.c > @@ -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; > } > } > diff --git a/lib/sset.h b/lib/sset.h > index 7f9e125..f63f4ab 100644 > --- a/lib/sset.h > +++ b/lib/sset.h > @@ -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) \ > diff --git a/lib/stp.c b/lib/stp.c > index ee5c8bc..3d293b6 100644 > --- 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; > diff --git a/lib/stream-ssl.c b/lib/stream-ssl.c > index f2d5037..42690e4 100644 > --- a/lib/stream-ssl.c > +++ b/lib/stream-ssl.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. > @@ -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; > diff --git a/lib/util.h b/lib/util.h > index 809ae9c..ef464ea 100644 > --- a/lib/util.h > +++ b/lib/util.h > @@ -61,6 +61,16 @@ > #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; > > diff --git a/lib/vlog.c b/lib/vlog.c > index fc601e8..683cdfc 100644 > --- a/lib/vlog.c > +++ b/lib/vlog.c > @@ -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(). */ > diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c > index b70b070..a7826b2 100644 > --- a/ofproto/connmgr.c > +++ b/ofproto/connmgr.c > @@ -476,7 +476,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); > } > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index 6bc2cf4..b95179a 100644 > --- a/ofproto/ofproto-dpif.c > +++ b/ofproto/ofproto-dpif.c > @@ -1957,7 +1957,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: > @@ -1974,7 +1974,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; > > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c > index 4daa0cd..467dfda 100644 > --- a/ofproto/ofproto.c > +++ b/ofproto/ofproto.c > @@ -3450,7 +3450,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; > diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c > index 139acc6..54af6d5 100644 > --- a/ovsdb/ovsdb-server.c > +++ b/ovsdb/ovsdb-server.c > @@ -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; > } > > diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c > index f5412f3..b26f188 100644 > --- a/ovsdb/ovsdb-tool.c > +++ b/ovsdb/ovsdb-tool.c > @@ -254,7 +254,7 @@ compact_or_convert(const char *src_name, const char > *dst_name, > lockfile_unlock(dst_lock); > > if (in_place) { > - free((char *) dst_name); > + free(CONST_CAST(char *, dst_name)); > } > } > > diff --git a/ovsdb/row.c b/ovsdb/row.c > index 457869b..450c327 100644 > --- a/ovsdb/row.c > +++ b/ovsdb/row.c > @@ -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); > } > diff --git a/ovsdb/transaction.c b/ovsdb/transaction.c > index e785e21..cc890ad 100644 > --- a/ovsdb/transaction.c > +++ b/ovsdb/transaction.c > @@ -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; > > diff --git a/tests/test-stp.c b/tests/test-stp.c > index 87c12a0..0acc7e0 100644 > --- a/tests/test-stp.c > +++ b/tests/test-stp.c > @@ -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++) { > -- > 1.7.2.5 > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev