これと似たような問題だったのだが、strftimeを使用したSQLをデバッグのためSYSLOGで出力したところ、gccの-O0では何も問題なく出力されるのだが、-O1以上の最適化をかけるとセグメンテーション違反で落ちた。
環境は以下。
- gcc 4.3.2
- SQLite 3.5.9
- rsyslogd 3.18.6
以下のようなコードで発生。
char *sql = sqlite3_mprintf("SELECT strftime(\'%%s\', \'now\');"); syslog(LOG_DEBUG, sql); sqlite3_free(sql);
どうやら原因はsyslog関数の中でvfprintfを行っており、エスケープした%sを再評価して存在しない可変引数を参照して落ちてるらしい。
最適化させないと、うまいことメモリ空間かレジスタを初期化して変なところに飛ばないようにしてくれてるんだと思われ。詳細は追わず。
仕方が無いので、エスケープしなおすのも面倒だから、strftimeを使用したSQLはデバッグ出力しないようにした。
Comments are closed here.