【问题标题】:Blocks of code that can never be reached永远无法访问的代码块
【发布时间】:2012-05-28 14:04:08
【问题描述】:

我有一个 .NET 项目 (C#),在我的代码中有这样的函数:

public void myFunction(string myStr)
{
   myStr = "This is not an empty string";

   if(String.IsNullOrEmpty(myStr))
   {
       DoSomething();
   }
}

我想分析我的应用程序,看看是否有无法访问的代码块。我怎么能这样做?

【问题讨论】:

标签: .net profiling code-analysis


【解决方案1】:

使用ReSharper 让您的代码更高效。 检查其中一项功能中的不可用代码区域。

【讨论】:

  • 这能处理 OP 的例子吗?
  • 刚刚检查了主题中给出的代码,很惊讶,但是 resharper 保持沉默,没有给出警告。尽管它对我来说仍然是最有用的代码质量工具。
  • 所以,我知道 resharper 通常对您有用,但是为什么这会使 resharper 成为 OP 问题的答案?
  • 因为主要问题是“我想分析我的应用程序,看看是否有无法访问的代码块。我该怎么做?”如果 resharpers 在一种情况下没有用,那并不会成为整个应用程序检查的坏工具。这不是广告。
【解决方案2】:

一般来说,要做到这一点,您需要对所有控制路径上的值进行符号分析,并进行布尔符号简化以确定条件是否为真。例如:

void bar(...a) {
  ...
  x=2*a;
  if (...)  x=17;
  foo(x)
  ...
}
void foo(int x) {
  if (x<a && !x>5) { // dead code if called from bar ...
  ...

要知道死代码行真的死了,你必须找到所有个调用 foo 并验证每一个都会导致这种情况发生。所以你需要 一个全局调用图,您需要对其进行全局函数指针分析,对于 您需要全局分析,因此需要本地指向分析...

我不知道有任何现成的工具可以做到这一点。

一个程序转换系统可以通过一些努力来构建。我们的DMS Software Reengineering Toolkit 有所有提到的可用于 C 的机器。 虽然所有这些机制都不适用于 C#,但它在很大程度上是以与语言无关的方式实现的,因此 C# 实现这一目标是汗水,但并非不切实际。

【讨论】:

    【解决方案3】:

    您可能想要使用像 ReSharper 这样的工具,它们可以在开发时进行代码质量分析。它会向您发出警告,例如“代码在启发式上无法访问”

    【讨论】:

      猜你喜欢
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多