mysql_options设置MYSQL_OPT_SSL_MODE参数正确传值问题咨询
问题结论
你当前的写法不合规,会触发未定义行为,无法正确配置SSL模式。
错误原因
MYSQL_OPT_SSL_MODE 选项的参数要求是 unsigned int * 类型(指向无符号整型的指针),你当前代码直接传入枚举常量SSL_MODE_DISABLED,本质是把整型常量值当成内存地址传递给MySQL驱动。由于mysql_options是可变参数函数,编译阶段不会严格校验参数类型,这种写法大概率只会触发编译警告,不会直接报编译错误,但运行时驱动读取该地址对应的内存时会触发非法内存访问:轻则配置不生效、拿到随机的SSL模式值,重则程序直接段错误崩溃。
正确写法
参考你第一行MYSQL_OPT_RECONNECT的传参逻辑即可:先定义对应类型的变量存储目标SSL模式值,再把变量的内存地址传入mysql_options,示例代码如下:
unsigned int ssl_mode = SSL_MODE_DISABLED; mysql_options(&self->handle, MYSQL_OPT_SSL_MODE, &ssl_mode);
注意事项
- 虽然
SSL_MODE_DISABLED、SSL_MODE_PREFERRED等值是mysql.h中定义的mysql_ssl_mode枚举成员,但枚举本质是整型常量,不符合该选项要求的指针传参规则,必须传入存储了目标值的变量地址。 - 该选项的调用必须放在
mysql_real_connect执行之前,否则SSL模式配置不会生效。 - 不要尝试把枚举值强转为指针类型传入(例如写
(void*)SSL_MODE_DISABLED),这种写法在32位/64位不同位宽的系统上存在严重兼容性问题,属于标准未定义行为。
内容的提问来源于stack exchange,提问作者nickyb
相关产品推荐
相关产品推荐

