两者有什么区别?两者似乎都意味着该值可以为null并且应该相应地处理,即检查为null.
更新: 上面的两个注释是JSR-305/FindBugs的一部分:http: //findbugs.sourceforge.net/manual/annotations.html
有没有一个工具可以分析.NET代码并找到竞争条件?
我有一些代码,它有一个公共静态属性,可以获取或创建一个私有静态字段.它还有一个公共静态方法,将此字段设置为null(...是的,我知道!..)
由于这些方法中没有任何一种方法可以锁定,因此可以肯定的是,未来的事情将会出现严重错误.我需要一个工具,它递归地遍历调用这些方法之一的东西,看看是否有任何东西在另一个线程上产生.
我正在寻找一个工具或者一个nDepend SQL脚本(如果可能的话).
注释受保护的字段的正确/首选方法是什么,ReadWriteLock以便像FindBugs这样的工具可以利用注释?应该ReadWriteLock简单地在@GuardedBy注释中写下名称.是否有理由在@GuardedBy注释中写入只读锁的名称,或只写写锁?不FindBugs的,或其他工具,甚至支持ReadWriteLock的@GuardedBy?
我编写的大多数代码都是在Ruby中,每隔一段时间,我会做一些错字,只会在一段时间后被捕获.当我的脚本运行很长的任务时,这很烦人,并返回发现我有一个错字.
是否有一个积极开发的Ruby工具lint工具可以帮助我克服这个问题?是否可以在一个使用大量源文件的系统中使用它,其中一些是动态加载的?
以此片段为例:
a = 20
b = 30
puts c
Run Code Online (Sandbox Code Playgroud)
要获得赏金,请告诉我一个工具,它将检测c变量为未创建/未定义.
我正在为嵌入式系统编写启动代码 - 在跳转到main()函数之前加载初始堆栈指针的代码 - 我需要告诉它我的应用程序将使用多少字节的堆栈(或更大的,保守估计).
我被告知gcc编译器现在有一个-fstack-usage选项和-fcallgraph-info选项,它可以以某种方式用于静态计算我的"最大堆栈使用率".(" Botcazou,Comar和Hainque的编译时堆栈需求分析与GCC").
奈杰尔琼斯说,递归在嵌入式系统中是一个非常糟糕的主意("计算你的堆栈大小"2009),所以我一直小心不要在这段代码中做任何相互递归的函数.
另外,我确保我的中断处理程序都没有重新启用中断,直到它们最终从中断返回指令,所以我不需要担心重入中断处理程序.
如果没有递归或重入中断处理程序,则应该可以静态地确定最大堆栈使用情况.(所以大多数答案如何确定最大堆栈使用量?不适用).我的理解是我(或者最好是我的PC上的一些代码在每次重建可执行文件时自动运行)首先找到每个中断处理程序的最大堆栈深度,当它没有被更高优先级的中断中断时,最大值当main()函数没有被中断时,它的堆栈深度.然后我将它们全部添加到找到总(最坏情况)最大堆栈深度.当main()后台任务在被最低优先级中断中断时处于最大深度时发生(在我的嵌入式系统中),并且当中断被下一个最低优先级中断时,该中断处于其最大深度中断,等等.
我正在使用YAGARTO和gcc 4.6.0来编译LM3S1968 ARM Cortex-M3的代码.
那么如何使用-fstack-usage选项和-fcallgraph-info选项与gcc一起计算最大堆栈深度?或者是否有更好的方法来确定最大堆栈使用量?
(有关针对Keil编译器的几乎相同问题,请参阅如何确定嵌入式系统中的最大堆栈使用情况?)
一旦警告级别达到第二级或更高级别,为什么我会在这个简单的代码示例中收到以下警告?
public int Foo(int a)
{
if (a >= 0) throw new ArgumentException("a should be negative", "a");
Contract.EndContractBlock();
return a;
}
Run Code Online (Sandbox Code Playgroud)
CodeContracts:建议要求:此前提条件是多余的:请考虑将其删除.您是否将结构值与null进行比较?
显然,整数可以是负数,因此前提条件几乎不是多余的,为什么我会收到此警告?
编辑:这是ILSpy在查看exe时为创建的函数显示的内容:
public int Foo(int a)
{
if (a >= 0)
{
ContractHelper.RaiseContractFailedEvent(ContractFailureKind.Precondition, null, "a < 0", null);
throw new ArgumentException("a should be negative", "a");
}
return a;
}
Run Code Online (Sandbox Code Playgroud)

是否有适用于Delphi/Pascal的静态代码分析工具?
我已经看到了很多C++和.NET的选项,但Delphi/Pascal没有.
理想情况下可以集成到持续集成系统中.
(也发布在MSDN论坛上 - 但据我所知,这并没有太大的流量.)
我一直试图提供一个Assert和的例子Assume.这是我得到的代码:
public static int RollDice(Random rng)
{
Contract.Ensures(Contract.Result<int>() >= 2 &&
Contract.Result<int>() <= 12);
if (rng == null)
{
rng = new Random();
}
Contract.Assert(rng != null);
int firstRoll = rng.Next(1, 7);
Contract.Assume(firstRoll >= 1 && firstRoll <= 6);
int secondRoll = rng.Next(1, 7);
Contract.Assume(secondRoll >= 1 && secondRoll <= 6);
return firstRoll + secondRoll;
}
Run Code Online (Sandbox Code Playgroud)
(关于能够传入空引用而不是现有Random引用的业务当然是纯粹的教学法.)
我曾希望如果检查员知道firstRoll并且secondRoll每个都在范围内[1, 6],那么就可以计算出总和在范围内[2, 12].
这是一个无理的希望吗?我意识到这是一项棘手的事情,确切地说明可能会发生什么......但我希望检查器足够聪明:)
如果现在不支持这个,那么这里是否有人知道它是否可能在近期未来得到支持? …
我发现JSLint会产生很多关于表单的警告:
Expected 'foo' to have an indentation at X instead at Y.
Run Code Online (Sandbox Code Playgroud)
所述的JSLint选项文档描述了一种indent识别表示的空间缩进的每个级别的量的数值选项.这个选项允许我说每个级别的缩进使用2个空格.我只是在我的JavaScript文件的顶部写这样的东西:
/*jslint indent: 2 */
Run Code Online (Sandbox Code Playgroud)
太好了.现在JSLint知道每个缩进级别缩进多少,但JSLint似乎是硬编码来决定每行应该具有什么级别的缩进.
假设我想以不同于JSLint规定的方式缩进我的代码.我可以使用一些JSLint选项吗?如果没有,我至少可以关闭缩进警告吗?我试过了:
/*jslint indent: false */
Run Code Online (Sandbox Code Playgroud)
但这并没有导致缩进警告被忽略; 它导致了JSLint错误.
static-analysis ×10
.net ×2
annotations ×2
c# ×2
findbugs ×2
java ×2
actionscript ×1
concurrency ×1
delphi ×1
embedded ×1
formatting ×1
gcc ×1
jslint ×1
lint ×1
math ×1
ndepend ×1
pascal ×1
ruby ×1