Resharper 4(甚至是Visual Studio本身......)中是否有一个设置,如果我忘记将代码包装在一个using块中,或者在一个块中省略正确的Dispose调用,它会强制发出警告finally?
我熟悉一些可用于Java的免费静态分析工具,例如FindBugs和PMD.我想知道的是Klocwork和Coverity等商业产品如何与这些产品相抗衡.他们的优点和缺点是什么?
这是Googles静态分析仪CodePro AnalytiX的规则之一:
摘要
数组初始值设定项不应静态初始化数组.
描述
此审计规则使用数组初始值设定项检查初始化(在初始值设定项或赋值语句中)的数组变量.
例
由于使用了数组初始值设定项,因此将标记以下数组声明:
int[] values = {0, 1, 2};
Run Code Online (Sandbox Code Playgroud)
现在,如果我不喜欢它,我可以禁用它,这不是问题.但我想知道为什么这会成为一个问题,以及保持代码不被审计规则标记的解决方案是什么?
有没有人知道如何更改StyleCop规则SA1600,说明必须记录元素,以便它只适用于属性而不适用于私有成员?
我们的ORM(DevExpress XPO)要求您拥有所有公共属性的私有成员(因为您必须在setter中调用一个函数来保存它并将其存储在私有成员中),并对公共属性和私有属性进行注释.考虑到一些表有超过50个字段,同样的事情的成员正在杀了我.
考虑由两个文件组成的C程序,
在f1.c:
int x;
Run Code Online (Sandbox Code Playgroud)
f2.c:
int x=2;
Run Code Online (Sandbox Code Playgroud)
我对C99标准第6.9.2段的解读是该程序应该被拒绝.在我对6.9.2的解释中,变量x是暂定的f1.c,但是这个暂定的定义在翻译单元的末尾变成了一个实际的定义,并且(在我看来),应该表现得好像f1.c包含了定义int x=0;.
对于所有编译器(以及重要的是,链接器)我能够尝试,这不是发生的事情.我试过的所有编译平台都链接了上面两个文件,两个文件中的值x都是2.
我怀疑这是偶然发生的,或者只是作为标准要求提供的"简单"功能.如果你考虑一下,这意味着链接器中对那些没有初始化器的全局变量有特殊支持,而不是那些显式初始化为零的全局变量.有人告诉我,无论如何编译Fortran可能都需要链接器功能.那将是一个合理的解释.
有什么想法吗?对标准的其他解释?文件f1.c和f2.c拒绝链接在一起的平台名称?
注意:这很重要,因为问题出现在静态分析的上下文中.如果这两个文件可能拒绝在某个平台上链接,分析器应该抱怨,但是如果每个编译平台都接受它,那么就没有理由对它进行警告.
我正在考虑对现有的PHP项目进行一些静态代码分析,而我无法理解PHP_CodeSniffer,PHPMD和PHP Depend之间的区别.这些只是这些问题的替代方案,还是它们在某些方面相互补充?为什么开发人员可以选择其中一个?
存在用于Python的静态分析工具,但编译时间检查往往与Python所包含的运行时绑定哲学截然相反.这可能与一个静态分析工具来执行一些"包装标准Python解释器使用严格 "般的约束,但我们没有看到任何广泛采用的这样的事情.
有没有关于Python的东西会使"使用严格"的行为变得不必要或特别不受欢迎?
或者,Perl中的"使用严格"行为是否已被广泛采用?
注意:"必要"是指"实际必要",并非绝对必要.显然你可以在没有"use strict"的情况下编写Perl,但是(从我所见过的)大多数Perl程序员都会使用它.
注意:Python解释器包装器不需要 "使用严格"类似的约束 - 您可以使用类似于"use strict"的伪编译指示,这将被普通解释器忽略.我不是在谈论添加语言级功能.
更新:解释Perl每条评论中"use strict"的作用.(官方文档链接在第一段.)
"use strict"指令有三个不同的组件,其中只有两个非常有趣:
use strict vars:在程序中静态检查词法范围的变量用法.(请记住,在Python中,基本上只有global范围和local范围).许多Python短信检查这种事情.因为它是他们可以做的唯一的静态分析,所以直言不讳地假设你使用简单的词汇范围,并在你告诉他们闭嘴之前警告你那些看似错误的东西; 即
FOO = 12
foo += 3
Run Code Online (Sandbox Code Playgroud)
如果您没有对命名空间做任何想法,那么检查拼写错误就很有用.
use strict refs:防止符号命名空间解除引用.Python最接近的模拟是使用locals()和globals()进行符号绑定和标识符查找.
use strict subs:在Python中没有真正的模拟.
python compiler-construction perl static-analysis use-strict
我们的管理层最近一直在与一些销售C++ 静态分析工具的人交谈.当然销售人员说他们会发现大量的错误,但我持怀疑态度.
这些工具如何在现实世界中发挥作用?他们发现真正的错误吗?他们帮助更多初级程序员学习吗?
他们值得这么麻烦吗?
注意不是"功能依赖".是否有可用的工具允许我从源代码构建静态函数依赖图?向我指示哪些功能以图形方式依赖于哪些功能的东西.
在多线程嵌入式软件(用C或C++编写)中,必须为线程提供足够的堆栈空间,以使其能够完成其操作而不会溢出.在某些实时嵌入式环境中,正确调整堆栈大小至关重要,因为(至少在我使用过的某些系统中),操作系统不会为您检测到这一点.
通常,在创建线程时(即在pthread_create()等的参数中)指定新线程(除主线程之外)的堆栈大小.通常,这些堆栈大小被硬编码为在最初编写或测试代码时已知良好的值.
但是,对代码的未来更改通常会破坏硬编码堆栈大小所基于的假设,并且在一个重要的日子里,您的线程进入其调用图的更深层分支之一并溢出堆栈 - 从而导致整个系统崩溃或者默默地腐蚀记忆.
在线程中执行的代码在堆栈上声明struct实例的情况下,我个人已经看到了这个问题.当结构体被扩充以容纳额外数据时,堆栈大小相应地膨胀,可能允许堆栈溢出发生.我想这对于已建立的代码库来说可能是一个巨大的问题,其中无法立即知道向结构添加字段的全部效果(太多的线程/函数来查找使用该结构的所有位置).
由于对"堆栈大小"问题的通常响应是"它们不可移植",因此我们假设编译器,操作系统和处理器都是此调查的已知数量.我们也假设没有使用递归,所以我们没有处理"无限递归"场景的可能性.
有哪些可靠的方法来估计线程所需的堆栈大小?我更喜欢离线(静态分析)和自动方法,但欢迎所有想法.