繁体   English   中英

这行C代码对哈希映射实现有什么作用?

[英]What is this line of C code doing for a hash map implementation?

在工作中,我们一直在尝试弄清楚这段代码的作用,并且我们认为它可能会引起问题。 这是C语言中的hashmap实现。

static thrift_map_node_t *thrift_map_newnode (thrift_map_base_t *m, union keyDataTypes key, void * value, int vsize)

thrift_map_node_t *node;
  int ksize = strlen(key) + 1;
  int voffset = ksize + ((sizeof(void*) - ksize) % sizeof(void*));
  node = malloc(sizeof(*node) + voffset + vsize);
  if (!node) return NULL;
  memcpy(node + 1, key, ksize);
  node->hash = thrift_hash(key);
  node->value = ((char*) (node + 1)) + voffset;
  memcpy(node->value, value, vsize);
return node;

我们认为的问题在这里

  int voffset = ksize + ((sizeof(void*) - ksize) % sizeof(void*));

我们认为这可能会产生负值,例如C中的-9%4 = -1。

解决这个问题或对此做任何帮助都是很好的。

不, 如果 size_t秩高于或等于int ,它就永远不会产生负值(而且它可能在某些具有32位整数的真正奇怪的16位寻址系统上除外),因为

sizeof (void*) - ksize

将为size_t类型,该类型为无符号类型,并且始终为正。 因此,如果void指针的宽度为8个字节,而ksize的值为17,则在64位计算机上,相减的结果为(size_t)-9或18446744073709551607。 该模8为7,将其加到17将得到24,这是sizeof (void *)的倍数。

但是,这取决于sizeof (void *)2 ,因此,如果使用

sizeof (void*) - (ksize + sizeof (void*)) % sizeof (void *)

用于填充,因为这完全避免了负数


确实可以对结果减法进行签名 ,因为C99的模数始终为负: (-3) % 4例如为-3

顺便说一句,代码不应使用sizeof (void *) ,而应使用_Alignof (void *)


代码中还有另外一件事值得怀疑。 假设某人实际上可以输入长度超过2 GiB的字符串-那么在大多数平台上都会发生有符号溢出,而且看起来不会很漂亮!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM