我正在使用MySQL 5.0.51a,当我的程序退出时,我发现了一个导致无限循环(以堆栈溢出和 seqgfault 结束)的错误。
我发现如果我有一个名为 的函数shutdown()
,它会在调用mysql_close()
.
我在下面包含了一个最小的示例 C 源文件和 makefile 以显示问题的实际情况。在示例中,shutdown()
尽管未被 调用,但仍被调用main()
。
这里发生了什么?我是否与libmysqlclientshutdown()
中的 a 发生冲突?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 函数名冲突中显示的行为相反。在那种情况下,预期的函数没有被调用,而在我的例子中,一个函数在不被预期的时候被调用。