Questions tagged «static-analysis»

在不执行程序的情况下分析源代码或目标代码。这可以通过自动化工具或人工分析来完成。

5
项目规模和语言的严格程度之间是否存在关联?
我向我的一位同事解释了语言严格性和范式之间的区别,最后我断言: 诸如动​​态语言和解释语言之类的宽容语言最适合用于原型和小型项目或中型Web应用程序。当选择带有Node.js的优雅动态语言(例如Python或JavaScript)时,其好处是: 快速发展, 减少样板代码, 能够吸引年轻的,有创造力的程序员,他们逃离 Java之类的“企业语言”。 静态类型化/编译语言最适合要求更高严格性的应用程序,例如业务关键型应用程序或中型到大型应用程序。 数十年来发展起来的著名范例和模式, 易于进行静态检查, 能够找到许多具有数十年经验的专业开发人员。 严格的语言(例如Haskell,Ada)或技术(例如C#中的代码合同)更适合于优先考虑安全性而不是灵活性(即使Haskell可以非常灵活)的系统,例如生命攸关的系统和预计非常稳定的系统。好处是: 能够在编译时捕获尽可能多的错误, 易于进行静态检查, 易于形式证明。 但是,通过查看大型公司用于大型项目的语言和技术,看来我的主张是错误的。例如,Python已成功用于大型系统,例如YouTube或其他需要大量严格性的Google应用程序。 项目规模与应使用的语言/范例的严格程度之间是否仍然存在关联? 我忘记了要考虑的第三个因素吗? 我哪里错了?

4
为什么方法不应该引发多种类型的检查异常?
我们使用SonarQube分析我们的Java代码,它具有以下规则(设置为关键): 公共方法最多应引发一个检查异常 使用检查的异常会强制方法调用者通过传播错误或通过处理错误来处理错误。这使得这些异常完全成为方法API的一部分。 为了使调用者的复杂度保持合理,方法不应抛出一种以上的检查异常。” 声纳的另一点是这样的: 公共方法最多应引发一个检查异常 使用检查的异常会强制方法调用者通过传播错误或通过处理错误来处理错误。这使得这些异常完全成为方法API的一部分。 为了使调用者的复杂度保持合理,方法不应引发超过一种检查异常。 如下代码: public void delete() throws IOException, SQLException { // Non-Compliant /* ... */ } 应该重构为: public void delete() throws SomeApplicationLevelException { // Compliant /* ... */ } 覆盖方法不受此规则检查,并允许引发多个检查的异常。 在阅读有关异常处理的文章时,我从没有遇到过这个规则/建议,也没有尝试找到有关该主题的一些标准,讨论等。我从CodeRach中发现的唯一东西是:一个方法最多应抛出多少个异常? 这是一个公认的标准吗?

4
为什么有人会花时间在微软“罗斯林”上?
我刚刚阅读了Microsoft“ Roslyn”的一些白皮书和示例,这个概念似乎非常有趣。据我所知,它打开了一个黑框,即编译器,并提供了一个接口,我们可以使用该接口来获取有关在Visual Studio中编写的代码的信息和指标。 Roslyn似乎也具有“编写”代码并即时编译/执行代码的能力(类似于CodeDom),但是根据我的经验,我在使用该功能时仅遇到了有限的使用。 虽然代码分析和指标元素是一个有趣的领域,但是它已经存在了很长时间,并且很多提供商已经在代码分析和重构工具(例如ReSharper,CodeRush)上投入了大量资金。 ,nCover等),他们做得很好! 为什么任何公司都会竭尽全力去实施一些可以通过购买现有工具之一的许可证而以很小的成本提供的东西? 也许我错过了Roslyn项目的一些关键功能,这些功能使它超出了所提及工具的范围...

8
如何反对降低传统代码库的质量标准?[关闭]
我们这里有一个庞大的遗留代码库,其中包含您无法想象的错误代码。 现在,我们定义了一些质量标准,并希望在全新的代码库中实现这些标准,而且还可以通过触摸旧代码来实现。 而且,我们使用Sonar(代码分析工具)来执行这些操作,而Sonar已经有数千次违规。 现在开始讨论降低对遗留物的侵犯。因为它是遗产。 讨论是关于可读性规则。像它可以有多少个嵌套的ifs / for..。 现在,我该如何反对降低传统代码的编码质量?



3
静态分析类型是否可以替代?
编程语言中的静态类型有助于在编译时强制执行某些保证,但是类型是此工作的唯一工具吗?还有其他指定不变式的方法吗? 例如,一种语言或环境可以帮助强制执行有关数组长度或函数输入之间关系的保证。我只是在类型系统之外还没有听说过这样的事情。 我想知道一个相关的事情是,如果有任何非陈述方式做静态分析(类型声明,大部分)。

3
复杂性和可及性之间是否存在关联?
我最近在uni上研究了循环复杂度(McCabe)和软件的可达性。今天,我的讲师说这两个指标之间没有关联,但事实确实如此吗? 我认为肯定会有一定的相关性,因为较不复杂的程序(从我们看过的很少的程序中)在可访问性方面似乎有“更好”的结果。 有谁知道尝试同时查看这两个指标的情况,如果没有,那么对于找到大量程序的复杂性和可访问性而言,在哪里找到数据的好地方呢?

7
静态代码分析的真正好处是什么?
诸如pc-lint或QAC之类的工具可用于在代码库上执行静态代码分析。 以我的经验,静态分析通常会产生大量的噪音,例如,警告不是真正的错误,但却以某种方式违反给定规则集中的规则之一。关闭某些规则(无论是完善规则集还是通过代码中的特殊注释)可能都是一个麻烦的过程。 静态代码分析的真正好处是什么?

7
如何避免静态分析的陷阱
我在一家在Joel Test(至少在纸上)上获得11分的公司工作。 但是实际上,没有什么能比预期的要好,该项目已经在DEFCON 1上进行了半年。现在,我的大多数同僚都高兴,如果他们可以在周日下午6:00回家。 使用静态分析工具是使我不工作的显而易见的好习惯之一。该项目都跟踪gcc -Wall警告和专有且非常昂贵的“ C / C ++”工具。 Gcc警告的确经常指向真实的(如果大部分时间都是无礼的)错误。 但是,专用工具列出了诸如隐式强制转换和字符串文字的sizeof之类的内容。隐式演员表也在其样式表中列入黑名单。 标准做法是迫使人们关闭每个警告。请注意,这确实排除了主要是误报的警告,这不是问题。 结果是: 人们向每个右值和每个参数添加类型转换,以隐藏过程中真正存在问题的类型不匹配。 人们引入一个错误,或者使用其他有问题的语言功能(用strlen代替sizeof,用strncpy代替strcpy,等等)。 警告被静默。 错误报告开始滚动。 主要要点是原始代码是由在语言能力范围内安全地工作的人编写的,而修正不是。 现在,我真的不认为可以挽救这家公司。但是,我想知道是否有一种更好的方法,最好是可以使用“专业”工具的方法,还是我应该避免完全使用它们,以防将来我自己做出决定。 不能假定所有程序员都是不能犯错的天才的解决方案。因为如果可以的话,那么首先就不需要使用这些工具。

5
以编程方式找到算法的Landau表示法(Big O或Theta表示法)?
我习惯于手动搜索我的算法的Landau(Big O,Theta ...)表示法,以确保它们已尽可能地优化,但是当函数变得真正又大又复杂时,它就在不断发展。手工做的时间太多。它也容易出现人为错误。 我花了一些时间在Codility(编码/算法练习)上,并注意到它们会为您提交的解决方案(时间和内存使用量)提供Landau表示法。 我想知道他们是怎么做到的...你会怎么做? 除了词法分析或代码解析之外,还有其他方法吗? 这个问题主要涉及PHP和/或JavaScript,但是我对任何语言和理论都开放。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.