int Sequence::scoreDegeneracy() { cout << "Score Degeneracy" << name << seqLen << endl; int f = 0; if (degenComputed == false) { char _2foldTest = '*'; char _4foldTest = '*'; int aaseqLen = seqLen/3; int i = 0; for (i; i < aaseqLen; i++) { _4foldTest = is4FoldDegenerateSite(i); _2foldTest = is2FoldDegenerateSite(i,_4foldTest); degScores.totalCodons++ if (_2foldTest != '*') { degScores.totalCodons_2fold++; if (_2foldTest == 'A') { degScores.total_2fold_A++; } else if (_2foldTest == 'T') { degScores.total_2fold_T++; } else if (_2foldTest == 'G') { degScores.total_2fold_G++; } else { degScores.total_2fold_C++; } }else if (_4foldTest != '*') { degScores.totalCodons_4fold++; if (_4foldTest == 'A') { degScores.total_4fold_A++; } else if (_4foldTest == 'T') { degScores.total_4fold_T++; } else if (_4foldTest == 'C') { degScores.total_4fold_C++; } else { degScores.total_4fold_G++; } } cout << "Crashes right here when i = 0." << endl; } } degenComputed = true; return 1; }
Driving me! SegFault happens right at the end of the first iteration of the for loop. Behaves EXACTLY, as expected, the first test returns the correct results. A segmentation error occurs before I even increase ....
What am I missing?
...
char Sequence::is4FoldDegenerateSite(int codonIndex){ char aminoAcid = aaSeq[codonIndex]; //cout << "Amino acid of codon number " << codonIndex << " is: " << aminoAcid << endl; int loc = readingFrame + (codonIndex * 3) + 2; int locR = loc - 2; switch (aminoAcid){ case 'A': return seq[loc]; case 'T': return seq[loc]; case 'V': return seq[loc]; case 'G': return seq[loc]; case 'P': return seq[loc]; case 'S'://Can also be 2 fold degenerate if (seq[locR] == 'T'){ return seq[loc]; }else{ return '*'; } case 'R'://Can also be 2 fold degenerate if (seq[locR] == 'C'){ return seq[loc]; }else{ return '*'; } case 'L'://Can also be 2 fold degenerate if (seq[locR] == 'C'){ return seq[loc]; }else{ return '*'; } } return '*'; } char Sequence::is2FoldDegenerateSite(int codonIndex, char _4FoldResults){ char aminoAcid = aaSeq[codonIndex]; int loc = readingFrame + (codonIndex * 3) + 2; //char doubleDegeneracyTest = is4FoldDegenerateSite(codonIndex); //bool doubleDegeneracy = false; //if (doubleDegeneracyTest != '*') doubleDegeneracy = true; switch (aminoAcid){ case 'N': return seq[loc]; case 'D': return seq[loc]; case 'C': return seq[loc]; case 'Q': return seq[loc]; case 'E': return seq[loc]; case 'H': return seq[loc]; case 'K': return seq[loc]; case 'F': return seq[loc]; case 'Y': return seq[loc]; case 'X': return seq[loc]; case 'S'://Can also be 2 fold degenerate if (_4FoldResults == '*'){ return seq[loc]; }else{ return '*'; } case 'R'://Can also be 2 fold degenerate if (_4FoldResults == '*'){ return seq[loc]; }else{ return '*'; } case 'L'://Can also be 2 fold degenerate if (_4FoldResults == '*'){ return seq[loc]; }else{ return '*'; } } return '*'; }
Valgrind Results:
**17043** new/new[] failed and should throw an exception, but Valgrind ==17043== at 0x4024E35: VALGRIND_PRINTF_BACKTRACE (valgrind.h:3720) ==17043== by 0x40253C2: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D83AF: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804BA7F: std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:2168) ==17043== by 0x804ACDF: GenomeSeq::setup() (GenomeSeq.C:108) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) **17043** cannot throw exceptions and so is aborting instead. Sorry. ==17043== at 0x4024E35: VALGRIND_PRINTF_BACKTRACE (valgrind.h:3720) ==17043== by 0x40253D0: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D83AF: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804BA7F: std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:2168) ==17043== by 0x804ACDF: GenomeSeq::setup() (GenomeSeq.C:108) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) Loading sequence..==17043== ==17043== HEAP SUMMARY: ==17043== in use at exit: 2,749,679 bytes in 10 blocks ==17043== total heap usage: 39,043 allocs, 39,032 frees, 80,022,672,644 bytes allocated ==17043== ==17043== 27 bytes in 1 blocks are definitely lost in loss record 1 of 10 ==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7340: ??? (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7525: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804969E: main (Main2.C:143) ==17043== ==17043== 28 bytes in 1 blocks are definitely lost in loss record 2 of 10 ==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7340: ??? (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7525: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x80496C3: main (Main2.C:143) ==17043== ==17043== 83 bytes in 1 blocks are definitely lost in loss record 3 of 10 ==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D814A: std::string::append(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40B3F3E: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40C9799: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804ACB5: GenomeSeq::setup() (GenomeSeq.C:106) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) ==17043== ==17043== 100 bytes in 1 blocks are definitely lost in loss record 4 of 10 ==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D814A: std::string::append(char const*, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40B3F3E: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40C9799: std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804AC07: GenomeSeq::setup() (GenomeSeq.C:101) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) ==17043== ==17043== 100 bytes in 1 blocks are definitely lost in loss record 5 of 10 ==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7340: ??? (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D75D1: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D33C5: std::basic_istringstream<char, std::char_traits<char>, std::allocator<char> >::basic_istringstream(std::string const&, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804AC42: GenomeSeq::setup() (GenomeSeq.C:103) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) ==17043== ==17043== 8,192 bytes in 1 blocks are definitely lost in loss record 8 of 10 ==17043== at 0x4025024: operator new[](unsigned int) (vg_replace_malloc.c:258) ==17043== by 0x40A2592: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40A65B1: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40A7EAF: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804ABBF: GenomeSeq::setup() (GenomeSeq.C:97) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) ==17043== ==17043== 8,192 bytes in 1 blocks are definitely lost in loss record 9 of 10 ==17043== at 0x4025024: operator new[](unsigned int) (vg_replace_malloc.c:258) ==17043== by 0x40A2592: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40A65B1: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40A7EAF: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(char const*, std::_Ios_Openmode) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804AC9D: GenomeSeq::setup() (GenomeSeq.C:105) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) ==17043== ==17043== 2,732,253 bytes in 1 blocks are definitely lost in loss record 10 of 10 ==17043== at 0x4025390: operator new(unsigned int) (vg_replace_malloc.c:214) ==17043== by 0x40D6435: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D70A7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D7EDC: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x40D83AF: std::string::append(std::string const&) (in /usr/lib/libstdc++.so.6.0.13) ==17043== by 0x804BA7F: std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:2168) ==17043== by 0x804ACDF: GenomeSeq::setup() (GenomeSeq.C:108) ==17043== by 0x804A4FE: GenomeSeq::GenomeSeq(std::string, std::string) (GenomeSeq.C:52) ==17043== by 0x80496DF: main (Main2.C:143) ==17043== ==17043== LEAK SUMMARY: ==17043== definitely lost: 2,748,975 bytes in 8 blocks ==17043== indirectly lost: 0 bytes in 0 blocks ==17043== possibly lost: 0 bytes in 0 blocks ==17043== still reachable: 704 bytes in 2 blocks ==17043== suppressed: 0 bytes in 0 blocks ==17043== Reachable blocks (those to which a pointer was found) are not shown. ==17043== To see them, rerun with: --leak-check=full --show-reachable=yes ==17043== ==17043== For counts of detected and suppressed errors, rerun with: -v ==17043== ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 19 from 8)
Sequence.h:
#ifndef SEQUENCE_H