如何警告类型转换导致的潜在算术错误?

时间:2012-12-12 13:02:54

标签: c# math compiler-warnings implicit-conversion arithmetic-expressions

我正在使用C#开发一个计算模块,我对此有所了解:

double v = 4 / 100;

我知道这是一个错误的初始化,返回v = 0.0而不是v = 0.04

c#规则说我必须确保其中至少有一个成员是双,如下所示:

double v = (double) 4 / 100;
double v = 4.0 / 100;

但是,我有很多这种涉及整数变量操作的初始化,我觉得懒得逐行浏览我的代码来检测这样的错误。

相反,是否有可能被编译器警告?

2 个答案:

答案 0 :(得分:4)

好吧,经过一些游戏,什么不玩,我有一个解决方案。我使用this article来解决此问题。我使用StyleCop,因此您需要获取并安装该解决方案。然后,您可以下载我的C#项目MathematicsAnalyzer

首先,我没有考虑所有类型转换不匹配。事实上,我只容纳一部分。

基本上,我检查一下该行是否包含“double”后跟一个空格。我知道这可能导致错误的警告,因为课程的结尾可能是双重的或任何其他数量的东西,但我会留给你弄清楚如何正确地隔离类型。

如果找到匹配项,我会检查它是否与此正则表达式匹配:

double[ ][A-Za-z0-9]*[ ]?=(([ ]?[0-9]*d[ ]?/[ ]?[0-9]*;)|[ ]?[0-9]*[ ]?/[ ]?[0-9]*d;)

如果它 - 不匹配此正则表达式,那么我添加违规。这个正则表达式将匹配的是以下任何一个:

  • double i = 4d / 100;
  • double i = 4d / 100;
  • double i = 4 / 100d;
  • double i = 4 / 100d;
  • double i = 4 / 100d;
  • double i = 4 / 100d;
  • double i = 4d / 100;
  • double i = 4 / 100d;
  • double i = 4 / 100d;

以上任何一项都不会造成违规行为。正如目前所写的那样,如果不使用'd',它就会违反规定。您需要添加额外的逻辑来考虑显式转换操作数的其他可能方法。在我写这篇文章的时候,我刚刚意识到在两个操作数上都有'd'很可能会抛出异常。糟糕。

最后,我无法让StyleCop正确显示我的违规行为。它一直给我一个关于不存在的规则的错误,即使用第二双眼睛,我们找不到解决方案,所以我砍了它。该错误显示您尝试查找的规则的名称,因此我只是将规则的名称作为描述性内容并在其中包含行号。

要安装自定义规则,请构建MathematicalAnalyzer项目。关闭Visual Studio并将DLL复制到StyleCop安装目录中。当您打开Visual Studio时,您应该在StyleCop设置中看到规则。我使用的文章的第5步和第6步显示了在哪里做。

这在整个解决方案中一次只能获得一次违规,因此您必须修复它显示的违规,然后再次运行StyleCop以查找下一个。可能有办法解决这个问题,但是我没有果汁而停在这里。

享受!

答案 1 :(得分:3)

本文介绍如何设置自定义代码分析规则,当您运行代码分析时,可以显示警告以及不显示警告。

http://blog.tatham.oddie.com.au/2010/01/06/custom-code-analysis-rules-in-vs2010-and-how-to-make-them-run-in-fxcop-and-vs2008-too/