【问题标题】:Valgrind error: Invalid read of size 1Valgrind 错误:大小为 1 的读取无效
【发布时间】:2012-07-02 04:09:04
【问题描述】:

我在这段代码中找不到错误,我看了好几个小时... Valgrind 说:

==23114== Invalid read of size 1
==23114== Invalid write of size 1

我尝试使用一些 printfs 进行调试,我认为错误出在这个函数中。

void rdm_hide(char *name, Byte* img, Byte* bits, int msg, int n, int size)
{
    FILE *fp;
    int r;/
    Byte* used;
    int i = 0, j = 0;
    int p;

    fp = fopen(name, "wb");

    used = malloc(sizeof(Byte) * msg);


    for(i = 0; i < msg; i++)
        used[i] = -1;


    while(i < 3)
    {
        if(img[j] == '\n')
            i++;
        j++;
    }

    for(i = 0; i < msg; i++)
    {
        r = genrand_int32();
        p = r % n;

        if(!search(p, used, msg))
        {
            used[i] = (Byte)p;

            if(bits[i] == (Byte)0)
                img[j + p] = img[j + p] & (~1);
            else if(bits[i] == (Byte)1)
                img[j + p] = img[j + p] | 1;
        }
        else
            i --;
    }

    for(i = 0; i < size; i++)
        fputc( (char) img[i], fp);

    fclose(fp);
    free(used);
}

感谢您的帮助!

【问题讨论】:

  • 你能用选项 --read-var-info=yes 运行 valgrind 并分享输出吗?
  • 当您对 img 指向的数组进行写入和读取时,可能会发生这种情况。使用 gdb 查明这是发生在哪一行。

标签: pointers valgrind


【解决方案1】:

==23114== 大小为 1 的读取无效
==23114== 大小为 1 的无效写入

我很确定这不是 全部 valgrind 所说的。

你应该

  1. 使用调试信息(很可能是-g 标志)构建您的程序。这会让 valgrind 准确地告诉你哪一行触发了无效的读写
  2. 如果问题不明显,请编辑您的问题并包含整个 valgrind 输出。
  3. 重新运行 valgrind --track-origins=yes your-exe 可能会提供更多有用的信息。

最后,您的算法似乎完全是假的。据我所知,j 在第一个 while 循环之后变为 3,并且此后不再更改(在这种情况下,您应该只使用 const int j = 3; 并取消 j++)。此外,您引用img[j + p],其中p 介于0n 之间。如果n 确实是img 的大小,那么j + p 索引超出img 限制并触发这两个错误也就不足为奇了。

【讨论】:

    猜你喜欢
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2017-11-17
    • 2020-09-30
    • 2014-11-30
    • 1970-01-01
    相关资源
    最近更新 更多