我正在开启旧项目的代码分析.大多数评论结果我都能理解,但 CA2000:在丢失范围之前处理对象很难做到.
例如,来自ASP.Net页面的此代码:
private void BuildTable()
{
HtmlTableRow tr = new HtmlTableRow();
HtmlTableCell td = new HtmlTableCell();
tr.Cells.Add(td);
// add some controls to 'td'
theTable.Rows.Insert(0, tr);
// 'theTable' is an HtmlTable control on the page
}
Run Code Online (Sandbox Code Playgroud)
提供CA消息:
CA2000:Microsoft.Reliability:在方法'BuildTable()'中,在对所有引用超出范围之前,在对象'tr'上调用System.IDisposable.Dispose.
CA2000:Microsoft.Reliability:在方法'BuildTable()'中,对象'td'未沿所有异常路径放置.在对对象'td'的所有引用都超出范围之前调用System.IDisposable.Dispose.(以及关于添加到'td'的控件的类似消息.)
我可以解决第二个问题:
private void BuildTable()
{
HtmlTableRow tr = new HtmlTableRow();
HtmlTableCell td = new HtmlTableCell();
try
{
tr.Cells.Add(td);
// add some controls to 'td'
td = null; // this line is only reached when there were no exceptions
}
finally …Run Code Online (Sandbox Code Playgroud) function foo(a, opt_b) {
opt_b = opt_b || 1;
...
}
foo(1); // IntelliJ will yell at me, saying "Invalid number of parameters, expected 2"
Run Code Online (Sandbox Code Playgroud)
有没有办法记录foo()IntelliJ不会对我大喊大叫?
具有以下带有泛型类型参数属性的C#代码:
[System.AttributeUsage(System.AttributeTargets.GenericParameter)]
public class GenericParameterAttribute : System.Attribute
{
}
public class GenericClass<[GenericParameter] T>
{
}
Run Code Online (Sandbox Code Playgroud)
打开StyleCop集成(在.csproj文件中导入StyleCop.targets)StyleCop返回错误并且编译失败:
错误1 SA0102:CSharp.CsParser:在文件中发现语法错误...
没有在.csproj文件中导入的StyleCop.targets编译好了.
环境
我在StyleCop文档站点http://www.stylecop.com/docs/StyleCop%20Rules.html上找不到代码SA0102 - 似乎SA0102不是StyleCop规则,可能是内部StyleCop错误的代码.
那么问题:如何压制StyleCop错误SA0102?
我刚刚介绍了"程序切片"这个术语.人们想要这样的功能是完全合理的,但是它存在于任何地方吗?
这个词现在已经20岁了,我看到有很多出版物,研究论文等等.但实际的工具在哪里?人们是否真的将这个概念付诸实践,或者只是在学术上研究它?
什么在那里,以及什么语言?
编辑:我想我正在寻找什么,我作为一个接受的答案奖励,是一些出版物/组织/等的参考,特别是面向程序切片和维护工具/技术等的列表.
code-analysis static-analysis dynamic-analysis analysis utility
默认情况下,代码分析仅针对已编译的项目进行.所以当我从命令行运行MSBuild时,它只是第一次运行代码分析.在后续调用中,将跳过代码分析.
背景:我想评估CA规则,并查看启用规则时代码中会有多少警告.为此,我不想重新编译所有内容 - 这需要一些时间 - 但只需重新运行代码分析.你怎么能实现这个目标?
我正在使用Visual Studio 2013和MSBuild 12.0.
即使明确地开启代码分析也无济于事:
msbuild DesktopBuild.proj /p:RunCodeAnalysis=true
Run Code Online (Sandbox Code Playgroud) 我在我们拼着性英国LL两个L的编辑.我想使用代码分析规则"CA1726:UsePreferredTerms"但我不希望它将"已取消"标记为违规.
我已经尝试添加<CodeAnalysisCulture>en-GB</CodeAnalysisCulture>到项目文件中以鼓励代码分析使用英语拼写
我已经尝试将<Recognized><Word>Cancelled</Word></Recognized>项目添加到CustomDictionary.xml中
每次使用取消的单词时,我都不热衷于添加抑制.
我想要一个可以检查到源代码控制的解决方案,供其他开发人员使用,所以我不想改变我的本地
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Static Analysis Tools\FxCop\CustomDictionary.xml
我正在使用Visual Studio 2013.
有没有办法实现这个目标?
culture code-analysis fxcop visual-studio visual-studio-2013
我只使用代码分析进行清理,组织并确保针对特定警告的所有实例全局执行这些更改.我到了决赛,这是CA2227.
CA2227集合属性应该是只读的通过删除属性setter将''变为只读.
请注意,这是用于EDI文档的映射.这些类代表EDI文档的全部或部分.
public class PO1Loop
{
public SegmentTypes.PO1LoopSegmentTypes.PO1 PO1 { get; set; }
public Collection<SegmentTypes.PO1LoopSegmentTypes.PID1> PIDRepeat1 { get; set; }
public Collection<SegmentTypes.PO1LoopSegmentTypes.PID2> PIDRepeat2 { get; set; }
public SegmentTypes.PO1LoopSegmentTypes.PO4 PO4 { get; set; }
/* Max Use: 8 */
public Collection<SegmentTypes.PO1LoopSegmentTypes.ACK> ACKRepeat { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以看到所有Collection属性都会给我这个警告,并且有数百个.使用上面的类时,我实例化它没有任何数据.然后在外部我添加数据并通过其公共访问器设置每个单独的变量.我没有使用构造函数方法准备和传递所有数据来实例化这个类(IMO的大小可以达到它可以轻易地对眼睛造成严重破坏).完成并分配所有属性后,整个类将用于生成它所代表的文档的那一部分.
我的问题是,对于上面描述的用法,什么是更好的方法来正确设置它?我是否保留公共访问者并完全抑制此警告,或者是否有完全不同的解决方案可行?
无论我们是维护不熟悉的代码还是检查Apache模块的实现细节,如果我们能够快速遍历代码并构建我们正在查看的内容的概述,它将会有所帮助.Grep服务于我的大部分日常需求,但有些情况下它不会做.
以下是它可以提供帮助的常见示例.要找到我感兴趣的PHP函数的定义,我可以在命令行输入:
grep -r "function myfunc" .
Run Code Online (Sandbox Code Playgroud)
如果我们知道返回类型,这可以很快适应C或C++,但是如果我要列出我的类提供的每个方法,事情会变得更复杂:
grep "function " ./src/mine.class.php
Run Code Online (Sandbox Code Playgroud)
由于没有单个关键字表示C++中的函数或方法,并且因为它通常是更复杂的语法,我认为我需要某种静态代码分析工具,智能使用C预处理器或盲目信任编码器遵循严格的代码指南(空白的数量,curites的位置等)以获得这些结果.
你会推荐什么?
我希望与多个线程并行运行命令行程序的某些部分,我担心可能会有一些静态变量,我必须修复(例如通过制作它[ThreadStatic]).在我的项目中是否有任何工具或简单的方法可以找到这些?
当然,简单地搜索"static"并没有多大帮助:我有很多静态方法可以很好地工作并且可以使用任意数量的线程
请考虑以下代码,这些代码会引发 CA2104: Do not declare read only mutable reference types.
public class Test
{
// This provokes CA2104: "Do not declare read only mutable reference types".
protected readonly ImmutableClass ImmutableMember;
}
public class ImmutableClass
{
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道一种方法将一个类标记为不可变的方式会抑制警告CA2104?
我试着装饰MutableClass而[ImmutableObject(true)]没有成功的希望(因为表格编辑器使用的属性非常清楚),而且确实它不起作用.
我假设Code Analysis在确定是否发出CA2104时使用已知的不可变类型列表,因此我们不能使用相同的方法.
我想即使你可以将一个类标记为不可变,编译器也无法实际检查它是否为真,但至少它可能是一个有用的指标.
无论如何,我有什么属性可以忽略吗?如果没有,则必须进行抑制.
目前似乎没有替代方法可以做到这一点.
我找到了一个有趣的博客,来自Joe Duffy("Windows上的并发编程"一书的作者)关于这种事情.
他从"想象我们有一个ImmutableAttribute"开始....... :)
这很有意思 - 他遇到了编写一些新的FxCop规则来分析属于不可变的类型的麻烦.