[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 08/25] tools/xenstore: make hashtable key and value parameters const



Hi Juergen,

On 26/07/2023 07:19, Juergen Gross wrote:
On 25.07.23 18:08, Julien Grall wrote:
Hi,

On 24/07/2023 12:02, Juergen Gross wrote:
The key and value are never modified by hashtable code, so they should
be marked as const.

You wrote this but...


Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V3:
- make value const, too.
---
  tools/xenstore/hashtable.c | 7 ++++---
  tools/xenstore/hashtable.h | 4 ++--
  2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/tools/xenstore/hashtable.c b/tools/xenstore/hashtable.c
index 11f6bf8f15..670dc01003 100644
--- a/tools/xenstore/hashtable.c
+++ b/tools/xenstore/hashtable.c
@@ -11,7 +11,8 @@
  struct entry
  {
-    void *k, *v;
+    const void *k;
+    void *v;


... this is not const and ...

      unsigned int h;
      struct entry *next;
  };
@@ -140,7 +141,7 @@ static int hashtable_expand(struct hashtable *h)
      return 0;
  }
-int hashtable_add(struct hashtable *h, void *k, void *v)
+int hashtable_add(struct hashtable *h, const void *k, const void *v)
  {
      /* This method allows duplicate keys - but they shouldn't be used */
      unsigned int index;
@@ -164,7 +165,7 @@ int hashtable_add(struct hashtable *h, void *k, void *v)
      e->k = k;
      if (h->flags & HASHTABLE_FREE_KEY)
          talloc_steal(e, k);
-    e->v = v;
+    e->v = (void *)v;

... you cast-away the const here. I think this is a pretty bad idea.

Can you clarify why you are doing like that?

The value is never changed by the hashtable code, but it might be changed by e.g. a caller of hashtable_search() (see e.g. callers of find_domain_struct()).

Somewhere I need to cast the const away. I could do so in hashtable_search()
in case you prefer me to do so.

My problem is not with the placement of the const but the fact you are removing the const.

I agree that the hashtable code is not meant to modify the content. However, as you wrote, the caller of hashtable_search() could modify the content. So, for me, the value should not be const in the hashtable code.

To give a concrete example, with the current interface we are telling the user that what they store in the hashtable can be modified at some point. By adding 'const' for the value in hashtable_add(), we can mislead a user to think it is fine to store static string, yet this is not enforced all the way through. So one could mistakenly think that values returned hashtable_search() can be modified. And the compiler will not be here to help enforcing it because you cast-away the const.

Do you have any code in this series that requires the 'const' in hashtable_add()? If so, can you point me to the patch and I will have a look?

If not, then I will strongly argue that this should be dropped because dropping a const is always a recipe for disaster.

Cheers,

--
Julien Grall



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.