在尝试从源代码编译xtrabackup
时,我发现sql/sql_acl.cc
中有一行特别的代码,GCC拒绝在没有更宽松的设置的情况下对其进行编译。这一行是问题所在:
if (combo->plugin.str == NULL || combo->plugin.str == '\0')
立即引发以下错误:
error: ISO C++禁止指针和整数之间的比较
鉴于所涉及的代码,这似乎是完全合理的。 plugin
值属于此类型:
struct st_mysql_lex_string
{
char *str;
size_t length;
};
这是一个简单的MySQL内部结构,表示一个字符串指针 + 长度对。因此,在这种情况下,str
只是一个普通的 char*
指针。
我知道跨平台开发和处理复杂的编译器环境可能需要一定程度的谨慎,但是有什么理由来证明这个双重NULL检查的必要性呢?如果第一个子句不成立,我想不出第二个子句会如何成立,但我可能会忽略一些不寻常的边缘情况。
nullptr
可能吗? - Ed Healif (combo->plugin.str == NULL || *combo->plugin.str == '\0')
只有在不为 null 时才进行解引用操作? - Galik'\0'
。这说明为什么我们一开始就应该有一个nullptr
。 - Galik