Dobrze,
napisałem taką oto funkcję, która przechodzi sobie moje drzewo metodą inorder i zbiera klucze (nazwane identyfikatorami węzła) wrzucając je na listę stringów:
Oto i ta funkcyjka:
void DrzewoBST::tworzCiagId(BST *wezel){
if(wezel){
this->tworzCiagId(wezel->syn_lewy);
this->listaId.append(QString::number(wezel->id));
this->tworzCiagId(wezel->syn_prawy);
}
}
Debuger Qt wyrzuca segfaulta w tej funkcji systemu Windows (plik ntdll.dll):
ntdll!RtlQueryEnvironmentVariable_U
Jeżeli ktoś kojarzy coś w assemblerze to wrzucę jeszcze kod po deassemblacji ze wskazaniem miejsca segfaulta:
Function: ntdll!RtlQueryEnvironmentVariable_U
0x77573de3 <+0x005a> clc
0x77573de4 <+0x005b> add (%eax),%eax
0x77573de6 <+0x005d> add %dl,-0x6f6f6f70(%eax)
0x77573dec <+0x0063> mov %edi,%edi
0x77573dee <+0x0065> push %ebp
0x77573def <+0x0066> mov %esp,%ebp
0x77573df1 <+0x0068> sub $0x18,%esp
0x77573df4 <+0x006b> mov 0xc(%ebp),%al
// Poniższa linijka wywala segfault.
0x77573df7 <+0x006e> push %ebx
0x77573df8 <+0x006f> push %esi
0x77573df9 <+0x0070> push %edi
0x77573dfa <+0x0071> mov 0x8(%ebp),%edi
0x77573dfd <+0x0074> mov %ecx,%ebx
0x77573dff <+0x0076> mov %al,0x2(%edi)
0x77573e02 <+0x0079> movb $0x0,0x7(%edi)
Patrząc na kod asm wnioskuję jakieś przepełnienie tylko gdzie? Jedyna możliwa odpowiedź to przekroczenie limitu elementów na liście stringów.
Może jest coś o czym nie wiem? :-D
[EDIT] - QStringList::append wyrzuca segfault kiedy chcę dodać 43101 element do listy. Nadal nie wiem dlaczego. Kiedy usunę z powyższej funkcji linijkę odpowiedzialną za dodawanie wartości do listy przechodzenie drzewa działa.
Pozdrawiam
Grzegorz