しばらく前にプログラム (Mac OS X、C++、SDL、FMOD) を書きましたが、かなり良いパフォーマンスが得られました。しかし最近、その機能を拡張したいと思い、さらにコードを追加しました。そして今、それを実行して新しい機能をテストしようとすると、プログラムが SIGABRT でクラッシュします。
デバッガーを調べると、関数スタックで次のように表示されます。
- _殺す
- kill$UNIX2003
- 高める
- __アボート
- __stack_chk_fail
- odtworz <- 変更された関数
私の知る限り、「__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」に設定されています。そして想像してみてください - このモードでは決して実行されない 3 番目の if ステートメント (モード == 3) を削除しても、プログラムはクラッシュしません! 実行されることさえないコードを削除すると、状況が改善されます!
このコードはプログラムの他のモード用であるため、削除したくありません。そして、それはそこでうまく機能します。それで、私が検索できるヒントはありますか?これで何が間違っている可能性がありますか?