不确定Valgrind中导致此无效读取的原因

时间:2014-09-10 00:31:04

标签: c arrays struct valgrind

我有一个函数bar(S* x, uint y),一个结构S定义如下:

typedef struct S {
    T** arr;
    uint length;
} S;

其中lengtharr指针指向的数组的长度,T是其他结构。在我的代码中初始化结构时,所述数组使用calloc动态分配。

现在,在bar内,我有这样的电话:

uint left = y*2+1;
uint right = y*2+2;
uint boundary = x->length-1;
bool left_exists = (left <= boundary && x->arr[left]); 
bool right_exists = (right <= boundary && x->arr[right]);
if (left_exists && right_exists) {//do something}

现在,我的理解是,例如,如果right引用无效索引,则不会有任何内容破坏,因为条件的第一部分只会短路。

但是,我使用x对我的程序进行了测试,x->length为2,并且bary,其中bool right_exists = (right <= boundary && x->arr[right]); 为0。不会出现段错误(正如我所料),但我从Valgrind那里得到一条关于从这一行开始无效读取8个字节(我的架构上指针的大小)的警告:

x->arr[right]

我不确定导致这种情况的原因 - 如果我确实执行了{{1}},我会理解,但是我的代码不能阻止这种情况吗?

0 个答案:

没有答案