Valgrind:大小为4的无效读取

时间:2019-07-23 13:21:32

标签: valgrind

我无法弄清楚为什么我输入k = 10时代码会中断(假设k始终在[2-10]范围内),仅当k = 10时才有错误报告。这是我创建的程序,基本上将序列转换为4个基数,然后转换回十进制,我认为转换为十进制的方法很干净,因此我不在此发布它们,如果需要查看该方法,请告诉我 代码:

void convert4base(char arr[])//convert from base-10 to base-4
{
    int z=k;
    int countersize = pow(4.0,k);
    int counterarray[countersize]={0};


for(int j=0; j<size-k+1;j++)// convert from decimal to base-4.
{
    str="";
    for(int i=j;i<z;i++)
    {
        str+=arr[i];
    }
    z+=1;

//output string
    int sum =0;
    int p=0;
    for(int d= str.size()-1; d>-1; d--)
    {
        int power =pow(4.0,p);
        p++;
        if(str[d]=='A')
        {
            sum+=0*power;
        }
        if(str[d]=='C')
        {
            sum+=1*power;
        }
        if(str[d]=='G')
        {
            sum+=2*power;
        }
        if(str[d]=='T')
        {
            sum+=3*power;
        }
    }
    counterarray[sum]+=1;

}

for(int i=0;i<countersize;i++){
    if(counterarray[i]>=t)
    {
        convertdecimal(i);
        std::cout<<str<<" "<<counterarray[i]<<std::endl;

    }

}
}

int main(int argc, char* argv[])
{
    t=std::stoi(argv[3]);
    k = std::stoi(argv[2]);
    std::string dna_seq;
    std::ifstream file(argv[1]);
    getline(file,dna_seq); 
    size = dna_seq.length();
    char* input_array = new char[size];
    for(int s=0;s<size;s++)
    {
        input_array[s]=dna_seq[s];
        if(input_array[s]=='A')
        {
            As+=1;
        }
        if(input_array[s]=='C')
        {
            Cs+=1;
        }
        if(input_array[s]=='G')
        {
            Gs+=1;
        }
        if(input_array[s]=='T')
        {
            Ts+=1;
        }
    }

    if(k>size)
    {
        std::cout<<"0 "<<k<<" "<<size<<std::endl;
        std::cout<<"1 "<<As<<" "<<Cs<<" "<<Gs<<" "<<Ts<<std::endl;
        std::cout <<"error"<<std::endl;
    }
    else
    {
        std::cout<<"0 "<<k<<" "<<size<<std::endl;
        std::cout<<"1 "<<As<<" "<<Cs<<" "<<Gs<<" "<<Ts<<std::endl;
        convert4base(input_array);
    }

    delete[] input_array;
    return 0;
}

valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes --track-origins=yes  ./a1 foo.txt 10 4
==9366== Warning: client switching stacks?  SP change: 0x1ffefffd10 --> 0x1ffebffd00
==9366==          to suppress, use: --max-stackframe=4194320 or greater
==9366== Invalid write of size 4
==9366==    at 0x109F0F: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366==    by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366==  Address 0x1ffebffd00 is on thread 1's stack
==9366==  in frame #0, created by convert4base(char*) (???:)
==9366== 
==9366== Invalid write of size 4
==9366==    at 0x109F30: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366==    by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366==  Address 0x1ffebffd04 is on thread 1's stack
==9366==  in frame #0, created by convert4base(char*) (???:)

==9366== Invalid read of size 8
==9366==    at 0x4F61965: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==9366==    by 0x109F8E: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366==    by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366==  Address 0x1ffebffcf8 is on thread 1's stack
==9366==  in frame #0, created by std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned long) (???:)
==9366== 
==9366== Invalid read of size 4
==9366==    at 0x10A0D4: convert4base(char*) (in /home/siquanwa/A1/a1)
==9366==    by 0x1097F1: main (in /home/siquanwa/A1/a1)
==9366==  Address 0x1ffec78484 is on thread 1's stack
==9366==  in frame #0, created by convert4base(char*) (???:)

0 个答案:

没有答案