【问题标题】:Possible heap corruption, debugging with valgrind可能的堆损坏,使用 valgrind 进行调试
【发布时间】:2014-09-20 10:47:02
【问题描述】:

我正在开发一个使用字符串缓冲区的项目。我一直在使用 free() 和 malloc() 出现随机错误——比如“无效的下一个大小(快速)”,并怀疑它是否是由于一些内存堆损坏。我正在使用 gcc。我在二进制文件上使用了 valgrind,这是总结:

ERROR SUMMARY: 26887 errors from 39 contexts (suppressed: 0 from 0)

我认为这有点太高了。我附上了 valgrind memcheck 输出 here 的 pastebin 大多数问题似乎都来自一个函数:strbuf_addc()。 strbuf 是一个可以自动增长的字符串缓冲区。我在这里粘贴了一些 strbuf 函数。

int strbuf_add(struct strbuf *string, const char *c)
{
    if(string == NULL || c == NULL) return 0;

    while(*c != '\0') {
        if(!strbuf_addc(string, *c++))
            return 0;
    }

    return 1;
}

 int strbuf_addc(struct strbuf *string, char c)
    {
        size_t space_available;

        assert(string != NULL);

        space_available = string->allocated - string->length;
        if(space_available <= 1) {
            if(!grow_buffer(string)) {
                return 0;
            }
        }
        string->buffer[string->length++] = c;
        string->buffer[string->length] = '\0';

        return 1;
    }
    static int grow_buffer(struct strbuf *string)
{
    char *tmp;
    size_t toallocate;

    assert(string != NULL);

    toallocate = string->allocated + (string->allocated / 2);
    tmp = (char*) realloc(string->buffer, toallocate);
    if(tmp) {
        string->buffer = tmp;
        string->allocated = toallocate;
        return 1;
    }
    return 0;
}

我不确定 strbuf_addc 是罪魁祸首还是我编写的其他函数。请看一下。我基本上将字符串文字作为第二个参数传递给 strbuf_add。我不确定它们是否会以 null 结尾,但我想 c 中的字符串文字是以 null 结尾的。我也试过从文件中读取字符串,仍然有一些错误。

【问题讨论】:

  • 好的,我想我找到了问题所在。如果我的初始 strbuf 大小为 1,则在 grow_buffer() string->allocated/2 中将失败,这正是我一直在做的。 Valgrind 现在没有任何错误。让我对此进行更多测试:)

标签: c string valgrind heap-memory heap-corruption


【解决方案1】:
toallocate = string->allocated + (string->allocated / 2);

可能存在toallocate 不会大于string-&gt;allocated 的情况。因此,realloc 不会为您的字符串保留更多空间,并且您将无法添加字符。 valgrind 一直在说:

==4755== Invalid write of size 1

所以你只是没有空间来附加一个字符。

【讨论】:

  • 谢谢。这正是我一直在做的事情(正如我之前的评论中提到的)——strbuf_init(1)。所以当字符串想要增长时,1/2 = 0 因此它实际上不会增长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多