GArray溢出

时间:2013-05-07 09:49:55

标签: c glib integer-overflow

g_array_append_val()或GLib中的其他一个追加/前置函数使得GArray的长度大于guint(unsigned int)可以容纳的长度时会发生什么?

文档没有说明任何内容,所以我应该假设在附加之前我必须自己检查一下(除非我知道列表永远不会超过65535个元素)?

1 个答案:

答案 0 :(得分:3)

GArray定义如下:

struct GArray {
  gchar *data;
  guint len;
};

因此它可以包含与内存一样多的数据。 并且,guint是unsigned int,最高可达4Gb,而不是65536。

深入研究GLib源代码,您可以看到,g_array_append_val将调用g_array_expand,后者将依赖g_realloc重新分配内存。在g_realloc源代码中,您可以看到:

newmem = glib_mem_vtable.realloc (mem, n_bytes);
TRACE (GLIB_MEM_REALLOC((void*) newmem, (void*)mem, (unsigned int) n_bytes, 0));
if (newmem)
  return newmem;

g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes", G_STRLOC, n_bytes);

因此它将失败并显示消息'未能分配%d字节'。