Tag: 静态分析

检测丢失处置的工具

即时搜索任何可以检测任何缺少处理调用的工具,这些调用可以执行数据访问和文件操作。 如果它检查另一个性能问题,那将是很好的。 顺便说一句,我需要在代码上运行该工具,而不是在执行上运行。 谢谢!

如何通过命令行在MSBuild中指定CodeAnalysisRules

我希望能够在命令行MSBuild中指定Code AnalysisRules(用于代码分析/ FXCOP)。 项目文件中会包含以下内容: -Microsoft.Globalization#CA1301;-Microsoft.Globalization#CA1302 所以我假设我使用这样的东西: MSBuild.exe /property:RunCodeAnalysis=true /property:CodeAnalysisRules=-Microsoft.Globalization#CA1301 哪个工作正常, 但是当我想添加另一个规则时,它不喜欢半冒号: MSBuild.exe /property:RunCodeAnalysis=true /property:CodeAnalysisRules=-Microsoft.Globalization#CA1301;-Microsoft.Globalization#CA1302 MSBUILD : error MSB1006: Property is not valid. Switch: -Microsoft.Globalization#CA1302 如何指定多个规则? 我很乐意引用一个文件,但我不想只更改项目文件。 Backgroud :我想为持续集成服务器创建一组规则(在我的例子中是Hudson)。 注意:我正在运行Visual Studio 2005

静态分析工具在访问变量之前检查锁定

我知道有很多针对C#或.Net的静态分析工具。 请参阅此问题以获取可用工具的良好列表。 我过去曾经使用过其中的一些,他们有很好的方法来发现问题。 我目前正在寻找一种方法来自动执行我们团队中的一些锁定规则。 例如,我想强制执行以下规则: “使用成员foo的每个公共方法必须获得一个锁定”或“每次对foob​​ar事件的调用都必须在锁定之外” 如果可行 ,编写自定义FxCop规则似乎相当复杂。 有没有更简单的方法呢?

代码合同:为什么有些不变量不在课堂之外考虑?

考虑这种不可变类型: public class Settings { public string Path { get; private set; } [ContractInvariantMethod] private void ObjectInvariants() { Contract.Invariant(Path != null); } public Settings(string path) { Contract.Requires(path != null); Path = path; } } 这里要注意两件事: 有一个契约不变量,它确保Path属性永远不能为null 构造函数检查path参数值以遵守先前的合约不变量 此时, Setting实例永远不能具有null Path属性。 现在,看看这种类型: public class Program { private readonly string _path; [ContractInvariantMethod] private void ObjectInvariants() { Contract.Invariant(_path […]

C#静态分析,变量/参数的可能值

在类似于以下每个示例的代码中,我希望能够静态分析代码以确定传递给SpecialFunction()的可能值列表。 SpecialFunction(5); // A int x = 5; SpecialFunction(x); // B int x = 5; x = condition ? 3 : 19; SpecialFunction(x); // C 我已经可以将C#解析成一个抽象语法树了,我已经可以处理像A这样的情况了,我想我可以跟踪值的初始赋值来猜测案例B,但像C一样简单的案例似乎很快就会变得复杂。 我几乎可以肯定,我们无法在所有情况下静态地解决x问题,这没关系。 我想知道尝试它的策略,以及识别何时无法完成的方法。 如果我们需要包含类级别字段和multithreading,该怎么办? 闭包? 如果我们知道x , |X| < 50的所有可能值的集合X ,它会有帮助吗? |X| < 50 ? 从@Vladimir Perevalov的建议来看,Pex中的概念如何应用于寻找目标代码点的可能值(而不是Pex似乎做的是发现代码路径和值导致未检查(?)exception情况)?

找到所有未使用的代码的工具

我需要一个可以运行的工具,它会显示一个未使用的方法,变量,属性和类的列表。 CSS课程将是一个额外的奖励。 我听说FXCop可以做到这一点吗? 还是NDepend还是什么?

Roslyn /查找引用 – 无法正确加载Workspace

我正在尝试编写一些代码来查找任何给定方法的所有方法调用,因为我正在寻找创建一个开源UML序列图表工具。 但是,我遇到了麻烦,越过前几行代码:/ API看起来已经发生了巨大的变化,我似乎无法通过查看代码来推断出正确的用法。 当我做: var workspace = new CustomWorkspace(); string solutionPath = @”C:\Workspace\RoslynTest\RoslynTest.sln”; var solution = workspace.CurrentSolution; 我发现workspace.CurrentSolution有0个项目。 我认为这将与之前的Workspace.LoadSolution( string solutionFile )相当,后者可能会包含解决方案中的任何项目,但我没有找到任何成功的路径。 我非常困惑0.o 如果有人可以提供一些关于我如何使用FindReferences API来识别特定方法的所有调用的额外指导,那将非常感谢! 或者,我会更好地采取静态分析方法吗? 我想支持lambdas,iterator方法和async之类的东西。 ================================================== ================== 编辑 – 以下是基于已接受答案的完整示例: using System.Linq; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.MSBuild; using Microsoft.CodeAnalysis.FindSymbols; using System.Diagnostics; namespace RoslynTest { class Program { static void Main(string[] args) { […]

在C#代码中查找未捕获的exception

我想知道是否有一个工具可以使用静态代码分析在C#中找到未捕获的exception? 基本上我想选择一个方法A(),并希望找到methodA()抛出的所有exception的列表以及methodA()调用的所有方法。 我尝试过ReSharper + Agent Johnson和AtomineerUtils ,都失败了这个简单的任务。 这是我的示例代码: public class Rectangle { public int Width { get; set; } public int Height { get; set; } public int Area() { CheckProperties(); long x = Width * Height; if (x > 10) throw new ArgumentOutOfRangeException(); return (int) x; } private void CheckProperties() { if (Width < […]

在代码合同中使用Contract.ForAll

好的,我还有另一个Code Contracts问题。 我有一个接口方法的合同,看起来像这样(为清楚起见省略了其他方法): [ContractClassFor(typeof(IUnboundTagGroup))] public abstract class ContractForIUnboundTagGroup : IUnboundTagGroup { public IUnboundTagGroup[] GetAllGroups() { Contract.Ensures(Contract.Result() != null); Contract.Ensures(Contract.ForAll(Contract.Result(), g => g != null)); return null; } } 我有代码消耗这样的接口: public void AddRequested(IUnboundTagGroup group) { foreach (IUnboundTagGroup subGroup in group.GetAllGroups()) { AddRequested(subGroup); } //Other stuff omitted } AddRequested需要一个非null的输入参数(它实现了一个具有Requires契约的接口),因此我在传入AddRequested组中得到一个’requires unproven:group!= null’错误。 我正确使用ForAll语法吗? 如果是这样并且求解器根本不理解,是否有另一种方法可以帮助求解器识别合同,或者我只需要在调用GetAllGroups()时使用Assume?