Valgrind错误:大小为1的读取无效

时间:2012-07-02 04:09:04

标签: pointers valgrind

我无法在此代码中找到错误,我看了几个小时...... 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);
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

  

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

我很确定不是所有 valgrind说的。

你应该

  1. 使用调试信息构建程序(很可能是-g标志)。这将让valgrind告诉你完全哪一行触发了无效的读写
  2. 如果问题不明显,请编辑您的问题并添加整个 valgrind输出。
  3. 重新运行valgrind --track-origins=yes your-exe可能会提供其他有用信息。
  4. 最后,您的算法出现完全是假的。据我所知,j在第一个while循环后变为3,并且在此之后永远不会更改(在这种情况下,您应该只使用const int j = 3;并取消j++ })。另外,您引用img[j + p],其中p介于0n之间。如果n确实是img的大小,那么j + p超出img限制的索引就不足为奇了,并且会触发这两个错误。