Я написал программу некоторое время назад (Mac OS X, C ++, SDL, FMOD), и она работала довольно хорошо. Но в последнее время я хотел расширить его функциональность и добавил еще немного кода. И теперь, когда я запускаю его и пытаюсь протестировать новую функциональность, программа падает с SIGABRT.
Глядя в отладчик, в стеке функций я вижу:
- _kill
- убить $ UNIX2003
- 1010 * подъем *
- __ * прервать 1012 *
- __ stack_chk_fail
- odtworz <- моя функция, которая была изменена </li>
Насколько я знаю, "__stack_chk_fail" указывает на переполнение стека. Но это не самая странная вещь об этом. В этой функции "odtworz" у меня есть такой код:
...
koniec = 0;
while ( koniec == 0 ) {
...
if (mode == 1) {
...
}
else if (mode == 2) {
...
}
else if (mode == 3) {
piesniOrkiestrowe[0] = '\0';
while ( piesniOrkiestrowe[0] == '\0' ) {
losowaPiesn();
char * piesnOrkiestrowa = szukajPiesniOrkiestrowej();
if ( piesnOrkiestrowa != NULL )
strcpy(piesniOrkiestrowe, piesnOrkiestrowa);
}
char nowyPiesnPlik[25];
sprintf(nowyPiesnPlik, "%sorch/%s", PIESNI_DIR.c_str(), piesniOrkiestrowe);
}
}
mode - это глобальная переменная, для которой в функции задано значение "2". А теперь представьте - если я удаляю третий оператор if (mode == 3), который никогда не выполняется в этом режиме, программа не падает Удаление кода, который даже не выполняется, помогает ситуации!
Теперь я не хочу удалять этот код, потому что он предназначен для другого режима моей программы. И там все отлично работает. Так какие-нибудь подсказки, где я могу искать? Что может быть не так с этим?