在尝试从xtrabackup
编译source时,我在sql/sql_acl.cc
中发现了一条特殊的代码行,GCC拒绝在没有更宽松设置的情况下编译。这一行是问题所在:
if (combo->plugin.str == NULL || combo->plugin.str == '\0')
立即引发以下错误:
错误:ISO C ++禁止指针和整数之间的比较
考虑到相关代码,这似乎完全合理。 plugin
值属于此类型:
struct st_mysql_lex_string
{
char *str;
size_t length;
};
这是一个简单的MySQL内部结构,表示字符串指针+长度对,所以在这种情况下str
只是char*
,没什么特别的。
我知道跨平台开发和处理巴洛克式编译器环境可能需要一定程度的偏执,但是对于这种双重NULL检查有什么理由呢?我想不出如果第一个条款没有,第二个条款将如何成真,但我可能会遗漏一些不寻常的边缘情况。
答案 0 :(得分:3)
我的假设是,意图是支持空终止是可选的字符串(因此有一个长度字段)。在这种情况下,包含' \ 0'的无效字符串将具有有效大小1.这就是为什么这个健全状况不使用长度。无论如何,有一个错误,使第二个条件始终"真"因此毫无意义,代码可能看起来像:
if (combo->plugin.str == NULL || combo->plugin.str [0] == '\0')