私はMySQL 5.0.51aを使用していますが、プログラムの終了時に無限ループ (スタック オーバーフローと seqgfault で終了) を引き起こしているバグを発見しました。
という関数がある場合shutdown()
、 の呼び出し中に によって呼び出されることを発見しましたmysql_close()
。
実際の問題を示すために、最小限の C ソース ファイルと makefile の例を以下に示します。この例では、shutdown()
によって呼び出されていないにもかかわらず、 が呼び出されmain()
ます。
ここで何が起こっているのですか?libmysqlclientshutdown()
と衝突していshutdown()
ますか? もしそうなら、gccがそれを知らない理由はありますか?
gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4) を使用しています。
mysql_shutdown.c:
#include <stdio.h>
#include <mysql/mysql.h>
#define HOST "<hostname>"
#define USER "<username>"
#define PASSWD "<password>"
#define DB "<dbname>"
MYSQL *connection;
void shutdown(void)
{
printf("shutdown called\n");
}
int main()
{
connection = mysql_init(NULL);
mysql_real_connect(connection, HOST, USER, PASSWD, DB, 0, NULL, 0);
mysql_close(connection);
return 0;
}
メイクファイル:
mysql_shutdown: mysql_shutdown.c
gcc -Wall -Wextra -Werror `mysql_config --cflags` -o $@ $^ `mysql_config --libs`
出力:
$ ./mysql_shutdown
shutdown called
これは、 GCC function name conflictに示されているものとは反対の動作であるように見えることに注意してください。その場合、期待される関数は呼び出されていませんでしたが、私の場合、期待されていないときに関数が呼び出されています。