【问题标题】:Valgrind invalid writeValgrind 无效写入
【发布时间】:2014-08-04 17:35:55
【问题描述】:
==3905== ERROR SUMMARY: 14 errors from 2 contexts (suppressed: 2 from 2)
==3905== 
==3905== 6 errors in context 1 of 2:
==3905== Invalid write of size 4
==3905==    at 0x401BFE: EliminateXr (in /home/suraj/Desktop/project/fm)
==3905==    by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm)
==3905==    by 0x401395: name_fm (in /home/suraj/Desktop/project/fm)
==3905==    by 0x400C38: main (in /home/suraj/Desktop/project/fm)
==3905==  Address 0x51fc724 is 36 bytes inside a block of size 39 alloc'd
==3905==    at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3905==    by 0x401064: alloc_matrix (in /home/suraj/Desktop/project/fm)
==3905==    by 0x401A59: EliminateXr (in /home/suraj/Desktop/project/fm)
==3905==    by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm)
==3905==    by 0x401395: name_fm (in /home/suraj/Desktop/project/fm)
==3905==    by 0x400C38: main (in /home/suraj/Desktop/project/fm)
==3905== 
==3905== 
==3905== 8 errors in context 2 of 2:
==3905== Invalid write of size 4
==3905==    at 0x401B17: EliminateXr (in /home/suraj/Desktop/project/fm)
==3905==    by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm)
==3905==    by 0x401395: name_fm (in /home/suraj/Desktop/project/fm)
==3905==    by 0x400C38: main (in /home/suraj/Desktop/project/fm)
==3905==  Address 0x51fce4c is 12 bytes inside a block of size 15 alloc'd
==3905==    at 0x4C2A2DB: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3905==    by 0x401064: alloc_matrix (in /home/suraj/Desktop/project/fm)
==3905==    by 0x401A59: EliminateXr (in /home/suraj/Desktop/project/fm)
==3905==    by 0x402040: fm_elim (in /home/suraj/Desktop/project/fm)
==3905==    by 0x401395: name_fm (in /home/suraj/Desktop/project/fm)
==3905==    by 0x400C38: main (in /home/suraj/Desktop/project/fm)
==3905== 
--3905-- 
--3905-- used_suppression:      2 dl-hack3-cond-1
==3905== 
==3905== ERROR SUMMARY: 14 errors from 2 contexts (suppressed: 2 from 2)

我从 valgrind 收到错误。

它说错误位于 EliminateXr 但我看不到错误。 消除Xr:

void EliminateXr(float** t,float* q,float*** tnew,float** qnew,int n1,int n2,int* r,int* s,int sprime){

    float** matrix = (float**)alloc_matrix(sprime,(*r)-1, sizeof(float));
    float* vec= (float*)malloc(sprime*sizeof(float));
    int matrixIndex=0;
    int i,k,l;
    for(k = 0; k < n1; ++k){
        for(l = n1; l < n2; ++l){
            for(i=0; i < *r; ++i){
                matrix[matrixIndex][i]=t[k][i]-t[l][i];
            }
            vec[matrixIndex]=q[k]-q[l];
            matrixIndex++;
        }
    }
    for(k = n2; k < *s; ++k){
        for(i=0; i < *r; ++i){
            matrix[matrixIndex][i]=t[k][i];
        }
        vec[matrixIndex]=q[k];
        matrixIndex++;
    }
    *tnew=matrix;
    *qnew=vec;  
    *r=(*r)-1;
    *s=sprime;

}

我正在为浮点分配内存,所以我不应该得到大小为 4 的无效写入。 谁能解释我应该如何使用这些信息: 地址 0x51fc724 在大小为 39 的块内是 36 个字节,已分配 ==3905== 在 0x4C2A2DB:malloc(在 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 中)

如果我们查看我的 alloc_matrix 我有一个 malloc

s = m * n * block + m * sizeof(void*) + block - 1;
p = malloc(s);

block= 浮动的大小。

根据 valgrind 的错误在哪里?

【问题讨论】:

  • 当您计算 s 时,- 1 是什么?
  • 为对齐分配额外的(块-1)字节。
  • 你需要看alloc_matrix()中的代码,malloc'd内存大小的计算是错误的。
  • 如果添加block - 1 是为了对齐,那么您实际上是在预期数组的末尾访问一个浮点数。顺便说一句,添加block - 1 完全没有意义,malloc() 永远不会返回任何硬件数据类型未对齐的地址。但是没有alloc_matrix()的代码我也不能说太多。

标签: c valgrind


【解决方案1】:

我的精神力量在这一行说

float** matrix = (float**)alloc_matrix(sprime,(*r)-1, sizeof(float));

您正在分配一个能够容纳sprime 行浮点数的矩阵,每行包含*r - 1 列。

然而在你的内部循环中是这样的

for(i=0; i < *r; ++i){
    matrix[matrixIndex][i]=t[k][i]-t[l][i];
}

您正在访问矩阵,就好像它包含*r 列一样。 (i 从 0 变为 *r - 1)请注意,*r 的值直到函数结束时才会更改。

因此,您正试图写超出缓冲区的末尾,而 Valgrind 理所当然地抱怨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2016-07-23
    相关资源
    最近更新 更多