【问题标题】:How to find inadvertent object pointer comparisons?如何找到无意的对象指针比较?
【发布时间】:2012-12-05 19:40:27
【问题描述】:

快速提问 - 有没有一种好方法可以找到 == 与对象而不是 isEqual: 的用途?

全文:

我有一堆类似这样的代码:

typedef long DataKey;

DataKey x;
DataKey y;

if (x == y) {
    // do stuff
}

我现在需要用一个对象替换我的DataKeylong。创建类并进行大量全局搜索和替换后,我的代码现在是这样的:

@interface DataKey : NSObject

DataKey *x;
DataKey *y;

if (x == y) { // uh-oh - this is now bad
    // do stuff
}

我可以在编译器中启用一个警告,警告在指针中使用标量运算符吗?我将 Xcode 4.5.2 与 LLVM 4.1 编译器一起使用。我还没找到。

还有其他建议可以帮助修复所有这些代码吗?这不是一个简单的代码库。有数百个源文件需要处理。这是一项重大的重构工作。

编辑:

如果在if 条件中使用赋值而不是比较时出现警告,那就太好了。你可以得到一个警告并使用括号来停止警告。

更新:

根据 cmets 中的建议,我将 -Weverything 编译器选项添加到测试项目中。在将两个对象指针与== 进行比较时,这并没有产生任何期望的结果。

也许可以实现 C++ 的组合、重载 operator== 方法以及在尝试使用该运算符时获得一些编译器警告/错误。我可能会发布另一个关于此选项的问题。

【问题讨论】:

  • 好问题。 checking if it is a valid pointer 然后添加自定义编译器警告为#warning some text 怎么样。不确定这是您要找的。​​span>
  • @ACB 我不确定如何在此处应用来自该链接的信息。我正在寻找(理想情况下)编译时检查。该链接用于运行时检查。
  • 这将是一个合理的编译器选项,但我从未见过这样的,而且我想不出任何宏技巧或任何强制错误的东西。
  • (虽然我想知道你是否可以暂时用一个 C++ 类替换该类,该类会重载 == 以一种在编译期间会出错的方式。但不确定你是否可以重载 == in C++。)
  • 嗯,您可以通过文件属性窗口将您的文件的属性临时更改为Ob_C++。根据您的看法,比直接重命名文件更复杂或更简单。

标签: objective-c ios llvm compiler-warnings


【解决方案1】:

我很确定没有这样的警告,因为比较指针是否相等是很常见的,而且并非所有这些都经常出错。不幸的是,您最好的选择是通过任何可能以这种方式使用 DataKeys 的地方并搜索 ==。不是很有趣,我知道。

【讨论】:

  • 基于他们尝试使用== 比较两个NSString 对象的SO 新手问题的数量,我不得不不同意错误使用== 并不常见。我敢打赌,这就像在条件中意外使用赋值而不是比较一样常见,并且编译器支持该问题。
  • @rmaddy:我想 Chuck 的意思是比较指针是否相等也很常见;而条件语句中的赋值通常是一个错误。
  • @mipadi 我是说我不同意比较指针是否相等是常见的。至少在我自己的代码中这是非常罕见的。我总是添加评论以明确表示我确实打算使用== 进行比较。事实上,在将近 20 万行代码中,我只做了一次。不过,我毫不怀疑其他人这样做的频率更高。
  • @rmaddy:我们只是在解释为什么没有编译器选项。
  • @rmaddy:新手问题他们将 NSStrings 与 == 进行比较的地方就是:缺乏经验的症状。在 C 或 Objective-C 程序员中,这实际上并不是一个常见的错误,它很容易被更有经验的人发现。另一方面,即使在经验丰富的程序员中,意外分配也是一个常见错误,因为它实际上与您打算做的事情相去甚远。我并不是说我会反对这个特性——我只是在解释为什么编译器编写者通常不会考虑包含它。 (并且比较指针是相当依赖于域的。有些人经常这样做,有些人不这样做。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多