标签: static-code-analysis

在源代码,字节代码,机器代码等上执行静态分析有哪些权衡?

在各种代码级别上执行静态分析的各种权衡是什么?例如对于Java,为什么有人会对Java源代码与Jasmin代码与Java字节码进行静态分析?选择是否限制或扩展了可以进行的各种类型的分析?选择是否会影响分析的正确性?谢谢.

java bytecode static-code-analysis

14
推荐指数
1
解决办法
1295
查看次数

Pylint:避免检查INSIDE DOCSTRINGS(全局指令/ rcfile)

考虑一下这段代码:

def test():
    """This line is longer than 80 chars, but, for me this is ok inside a DOCSTRING,
    this one is shorter.
    """

    if 'This is toooooooooooooooooooooooooooooooooooo longggggggggggggggggggggggg':
        print 'True'
Run Code Online (Sandbox Code Playgroud)

pylint 输出:

C:  5, 0: Line too long (84/80) (line-too-long)
C:  9, 0: Line too long (83/80) (line-too-long)
Run Code Online (Sandbox Code Playgroud)

是否有任何指令 avaliable( rcfile)排除 DOCSTRINGSpylint检查?

一个 regexignore-long-lines(感谢 @fredtantini)似乎被忽略.

周边文档字符串# pylint: dis/enable=line-too-long(感谢 @Evert)将导致所要求的效果,不过,我正在寻找一个 …

python pylint static-code-analysis

14
推荐指数
1
解决办法
1626
查看次数

自定义ESLint规则中的异步代码

故事和动机:

我们有一个相当庞大的端到端Protractor测试代码库.有时,测试会等待实现特定修复 - 通常作为TDD方法的一部分,并演示如何重现问题以及预期的行为是什么.我们目前正在做的是使用pending()带有Jira问题编号的Jasmine's .例:

pending("Missing functionality (AP-1234)", function () {
    // some testing is done here
});
Run Code Online (Sandbox Code Playgroud)

现在,我们想知道我们什么时候可以重命名pending()it()和运行测试.或者,换句话说,当问题AP-1234得到解决或发送到测试时.

目前的方法:

目前,我试图用解决它自定义ESLint规则,jira的NodeJS模块,和Q.自定义ESLint规则搜索pending()至少包含一个参数的调用.AP-以4位数字的形式提取票号,并用于jira.findIssue()检查其在Jira中的状态.如果状态为Resolved- 报告错误.

这是我到目前为止所得到的:

"use strict";

var JiraApi = require("jira").JiraApi,
    Q = require('q');
var jira = new JiraApi("https",
    "jira.url.com",
    "443",
    "user",
    "password",
    "2");

module.exports = function (context) {
    var jiraTicketRegex = /AP\-\d+/g;

    return { …
Run Code Online (Sandbox Code Playgroud)

javascript static-code-analysis protractor eslint

14
推荐指数
1
解决办法
571
查看次数

我应该声明这些方法是什么?

我正在研究一些C++代码,其中我有几个私有方法的管理器对象,如

void NotifyFooUpdated();
Run Code Online (Sandbox Code Playgroud)

OnFooUpdated()在该对象的侦听器上调用该方法.

请注意,它们不会修改此对象的状态,因此它们在技术上可以成为const方法,即使它们通常会修改整个系统的状态.特别是,侦听器对象可能会回调此对象并对其进行修改.

就我个人而言,我想留下它们,而不是宣布它们const.

但是,我们的静态代码检查器QAC将此标记为偏差,因此我要么必须声明它们const,要么我必须争论为什么它们应该保持非常量并获得偏差的授权.

没有声明这些方法的论据是什么const
或者我应该关注QAC并宣布它们const
我应该采用仅限于此对象的严格本地观点,还是将系统视为一个整体?

c++ const static-code-analysis const-method

13
推荐指数
1
解决办法
1020
查看次数

用于检测将wchar_t*传递给BSTR的静态代码分析

由于BSTR只是typedefwchar_t*我们的代码库,其中字符串文字传递给方法的几个(许多?)的地方期待BSTR这可以胡来了marshallers或任何人谁尝试使用任何BSTR特定的方法(比如SysStringLen).

有没有办法静态检测这种滥用?

我尝试使用VC10 /Wall和静态代码分析Microsoft All Rules进行编译,但是以下任何一个代码都没有被其中任何一个标记.

void foo(BSTR str)  
{
    std::cout << SysStringLen(str) << std::endl; 
}

int _tmain()
{
    foo(L"Don't do that");
}
Run Code Online (Sandbox Code Playgroud)

更新:在试图破坏wtypes.h我已经放弃的这些违法行为之后.

我尝试了两条路径,这两条路径都是我上面的示例程序,但是一旦我尝试了一个真正的项目,它们就失败了.

  1. 创建一个名为BSTR但是由于一个VARIANT有一个BSTR联合成员的类,新类不能有任何构造函数或赋值运算符,这个被破坏的每个地方都NULL被视为一个BSTR.我尝试NULL用具有转换运算符的类型替换但在添加了几十个新运算符(比较,转换等)之后,我开始遇到模糊的调用而放弃了.
  2. 然后我尝试了@CashCow和@Hans建议的方式(BSTR使用typedef另一种类型的指针).这也没有用,在添加toBSTRfromBSTR乱丢comutil.h(_bstr_t)和其他转换的地方之后,我终于到了编译器在IDL生成的标题处被阻塞的点(默认值被转换为文字宽字符串).

总之,如果有人知道一个代码分析工具可以帮助我很高兴听到它,我已经放弃了尝试自己实现这个目标.

c++ bstr visual-c++ static-code-analysis

13
推荐指数
1
解决办法
1247
查看次数

在ESLint中扩展多个推荐配置

故事:

目前,我们正在扩展推荐的ESLint配置:

{
  "extends": "eslint:recommended",
  ...
  "plugins": [
    "angular",
    "jasmine",
    "protractor"
  ],
  "rules": {
    "no-multiple-empty-lines": 2,
    "no-trailing-spaces": 2,
    "jasmine/valid-expect": 2
  }
}
Run Code Online (Sandbox Code Playgroud)

并且还使用angular,jasmineprotractorESLint插件,这也与船自己的推荐配置(默认规则的严格水平和默认规则参数).

问题:

我们如何使用在同一时间所有的推荐配置 - 在一个ESLint和所有使用的插件附带?


尝试以下方法:

{
  "extends": [
    "eslint:recommended",
    "plugin:protractor/recommended",
    "plugin:jasmine/recommended",
    "plugin:angular/recommended"
  ],
  ...
}
Run Code Online (Sandbox Code Playgroud)

但得到以下错误:

无法读取未定义的"推荐"属性

javascript static-code-analysis jasmine angularjs eslint

13
推荐指数
1
解决办法
6662
查看次数

如何防止返回指向临时变量的指针?

在最近的一次bug搜索中,我发现了一个返回指向临时变量成员的指针的问题.违规(简化)代码是:

struct S {
    S(int i) : i(i) {}
    int i;
    int* ptr() { return &i; }
};

int* fun(int i) { return S(i).ptr(); }  // temporary S dies but pointer lives on

int main() {
    int* p = fun(1);
    return *p;  // undefined
}
Run Code Online (Sandbox Code Playgroud)

怎么预防这个?海湾合作委员会和铿锵有-Waddress-of-temporary,-Wreturn-stack-address但他们似乎因为ptr()肮脏的行为充当中间人而松散.它们仅在直接获取指针时触发:

int* fun(int i) { return &S(i).i; }  // rightly fails to compile
Run Code Online (Sandbox Code Playgroud)

我的项目还将cppcheck整合到持续集成中,但它也无法获取(在这里提出).

哪种静态分析工具可以防止这类错误?

编辑:GCC确实从版本6.1.0开始接收-Wreturn-local-addr并且(令人惊讶地)-O2开启.

c++ pointers temporary static-code-analysis cppcheck

13
推荐指数
1
解决办法
407
查看次数

使用MSBuild禁用某些项目的代码分析

我继承了一个使用MSBuild脚本编译多个解决方案的解决方案文件.大多数项目都配置了分析和规则集,我有一些单元测试项目没有.

打开分析的项目:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <DefineConstants>CODE_ANALYSIS;DEBUG;TRACE</DefineConstants>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug</OutputPath>
  <PlatformTarget>x86</PlatformTarget>
  <CodeAnalysisRuleSet>..\OurRules.ruleset</CodeAnalysisRuleSet>
  <RunCodeAnalysis>true</RunCodeAnalysis>
 </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

关闭分析的项目:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug</OutputPath>
  <PlatformTarget>x86</PlatformTarget>
  <RunCodeAnalysis>false</RunCodeAnalysis>
 </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

当我运行构建脚本时,看起来有些项目不尊重项目设置:

msbuild.exe BuildScript.proj /p:SolutionRoot=%cd%; /p:Configuration=Debug /p:Platform:x86 /p:RunCodeAnalysis=True
Run Code Online (Sandbox Code Playgroud)

当我检查输出文件夹时,我看到将RunCodeAnalysis标志设置为false的项目的覆盖率分析xml输出.有人能帮我理解这里发生了什么吗?

visual-studio-2010 static-code-analysis

12
推荐指数
2
解决办法
1万
查看次数

自动检测相同的连续std :: string :: find()调用

在代码审查期间,我找到了这样的源代码:

void f_odd(std::string &className, std::string &testName)
{
   if (className.find("::") != std::string::npos)
   {
     testName = className.substr(className.find("::") + 2);
     (void)className.erase(className.find("::"), std::string::npos);
   }
}
Run Code Online (Sandbox Code Playgroud)

在这个函数中,std :: string :: find()被调用三次,具有相同的模式(这里是"::").

这个代码当然可以重构为

void f(std::string &className, std::string &testName)
{
   const size_t endOfClassNamePos = className.find("::");
   if (endOfClassNamePos != std::string::npos)
   {
     testName = className.substr(endOfClassNamePos + 2);
     (void)className.erase(endOfClassNamePos, std::string::npos);
   }
}
Run Code Online (Sandbox Code Playgroud)

find只被调用一次.

有人知道检测这种模式的策略吗?我有一个巨大的代码库,我打算发现这种模式.我计划使用Windows或Linux环境.

潜在的策略

  1. 使用/调整静态代码分析工具,如cppcheck来检测这些奇怪的东西.
  2. 使用正则表达式在代码库中搜索.
  3. 使用/ adapt clang-tidy来检测这种模式.
  4. 用某种语言编写自定义检查器(例如Python)来检测这些问题.在这种情况下,应该对预处理的代码执行检查.

没有Go

  • 手动审查

更新1

我决定从潜在的策略开始1).我打算让cppcheck适应这个问题.

Cppcheck提供了基于PCRE正则表达式编写自定义规则的可能性.为此,必须使用启用的PCRE支持编译cppcheck.由于当前测试环境是基于Linux的,因此可以使用以下命令下载最新版本的cppcheck:

git clone https://github.com/danmar/cppcheck.git && cd cppcheck

之后,编译并安装该工具,如下所示:

sudo make install HAVE_RULES=yes

现在基本工具设置完成了.为了开发一个cppcheck规则,我准备了一个简单的测试用例(file:test.cpp),类似于本文第一部分中的示例代码.此文件包含三个功能和cppcheck规则应在发出警告f_odd …

c++ regex pcre static-code-analysis cppcheck

12
推荐指数
1
解决办法
276
查看次数

如何找到 C++ 虚假复制操作?

最近,我有以下情况

struct data {
  std::vector<int> V;
};

data get_vector(int n)
{
  std::vector<int> V(n,0);
  return {V};
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题在于,在创建结构体时会发生一个副本,而解决方案是编写return {std::move(V)}

是否有可以检测这种虚假复制操作的 linter 或代码分析器?cppcheck、cpplint 和 clang-tidy 都做不到。

编辑:几点让我的问题更清楚:

  1. 我知道发生复制操作是因为我使用了编译器资源管理器,它显示了对memcpy的调用。
  2. 我可以通过查看标准 yes 来确定发生了复制操作。但我最初的错误想法是编译器会优化掉这个副本。我错了。
  3. 这(很可能)不是编译器问题,因为 clang 和 gcc 都产生产生memcpy 的代码。
  4. memcpy 可能很便宜,但我无法想象复制内存和删除原始内存比通过std::move传递指针便宜的情况。
  5. 添加std::move是一个基本操作。我想代码分析器将能够建议此更正。

c++ code-analysis static-code-analysis cppcheck

12
推荐指数
1
解决办法
951
查看次数