使用Valgrind进行程序调试

时间:2018-04-13 12:31:48

标签: c valgrind

我正在尝试解决一个问题"将数字乘以11" .Number可以是任何长的。我收到SIGABRT错误。

我尝试使用valgrind进行调试,但我不知道如何解决它(在stackoverflow上看到很多关于valgrind的问题,但没有成功)。自上周以来我一直坚持这个问题。

代码是:

#include <stdio.h>
#include <stdlib.h>
#define CHUNK 10

void get_input(char *val,int *i){
    char ch,*tmp=NULL;
    int size;
    size=CHUNK;
    while(ch=getc(stdin),ch!=EOF && ch!='\n'){
        val[(*i)++]=ch;
        if(*i>=size){
            size+=CHUNK;
            tmp=realloc(val,size);
            if(!tmp){
                free(val);
                val=NULL;
                break;
            }
            val=tmp;
        }
    }
    val[*i]='\0';
}

void mul_11(char *val,int *i){
    int *digit,iter,j,carry=0,num,temp;
    iter=*i;
    digit=(int*)malloc((iter+2)*sizeof(int));
    for(j=iter-1;j>=0;j--){
        temp=val[j]-'0';
        num=temp*11+carry;
        digit[j+2]=num%10;
        carry=num/10;
    }
    digit[1]=carry%10;
    digit[0]=carry/10;
    if(digit[0]==0)
        temp=1;
    else
        temp=0;

    for(j=temp;j<=iter+1;j++)
        printf("%d",digit[j]);
    free(digit);
    digit=NULL;
    *i=0;
}
int main() {
    int t,i=0;
    char *val=NULL;
    scanf("%d ",&t);
    while(t--){
        val=(char*)malloc(CHUNK*sizeof(char));
            get_input(val,&i);
            mul_11(val,&i);
            printf("\n");
        free(val);
        val=NULL;
    }
    return 0;
}

可以在Geeksforgeeks code here

中找到包含输入的整个代码

Valgrind错误:

5555555555555555555555555555555555555
==2349== Invalid read of size 1
==2349==    at 0x4008CE: mul_11 (mul11.c:30)
==2349==    by 0x400A8A: main (mul11.c:55)
==2349==  Address 0x52044a4 is 20 bytes after a block of size 16 in arena "client"
==2349== 
6111111105-3-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-6-60-8
==2349== Invalid free() / delete / delete[] / realloc()
==2349==    at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2349==    by 0x400AA0: main (mul11.c:57)
==2349==  Address 0x5204480 is 0 bytes inside a block of size 10 free'd
==2349==    at 0x4C2FD5F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2349==    by 0x400809: get_input (mul11.c:13)
==2349==    by 0x400A77: main (mul11.c:54)
==2349==  Block was alloc'd at
==2349==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2349==    by 0x400A60: main (mul11.c:53)
==2349== 

1 个答案:

答案 0 :(得分:0)

如果get_input重新分配了您的val并获得了新地址,则不会告知来电者(main)其val的值已失效({ {1}}释放了它)。 realloc将使用释放的内存,然后mul_11将第二次释放它。

一种解决方案是发送一个指向该地址的指针,如果该函数可以重新分配它,那么调用者将获得新值。

main