在各种代码级别上执行静态分析的各种权衡是什么?例如对于Java,为什么有人会对Java源代码与Jasmin代码与Java字节码进行静态分析?选择是否限制或扩展了可以进行的各种类型的分析?选择是否会影响分析的正确性?谢谢.
考虑一下这段代码:
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)排除只 DOCSTRINGS从pylint检查?
一个多 regex对ignore-long-lines(感谢 @fredtantini)似乎被忽略.
周边文档字符串用# pylint: dis/enable=line-too-long(感谢 @Evert)将导致所要求的效果,不过,我正在寻找一个 …
故事和动机:
我们有一个相当庞大的端到端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) 我正在研究一些C++代码,其中我有几个私有方法的管理器对象,如
void NotifyFooUpdated();
Run Code Online (Sandbox Code Playgroud)
它OnFooUpdated()在该对象的侦听器上调用该方法.
请注意,它们不会修改此对象的状态,因此它们在技术上可以成为const方法,即使它们通常会修改整个系统的状态.特别是,侦听器对象可能会回调此对象并对其进行修改.
就我个人而言,我想留下它们,而不是宣布它们const.
但是,我们的静态代码检查器QAC将此标记为偏差,因此我要么必须声明它们const,要么我必须争论为什么它们应该保持非常量并获得偏差的授权.
没有声明这些方法的论据是什么const?
或者我应该关注QAC并宣布它们const?
我应该采用仅限于此对象的严格本地观点,还是将系统视为一个整体?
由于BSTR只是typedef对wchar_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我已经放弃的这些违法行为之后.
我尝试了两条路径,这两条路径都是我上面的示例程序,但是一旦我尝试了一个真正的项目,它们就失败了.
BSTR但是由于一个VARIANT有一个BSTR联合成员的类,新类不能有任何构造函数或赋值运算符,这个被破坏的每个地方都NULL被视为一个BSTR.我尝试NULL用具有转换运算符的类型替换但在添加了几十个新运算符(比较,转换等)之后,我开始遇到模糊的调用而放弃了.BSTR使用typedef另一种类型的指针).这也没有用,在添加toBSTR和fromBSTR乱丢comutil.h(_bstr_t)和其他转换的地方之后,我终于到了编译器在IDL生成的标题处被阻塞的点(默认值被转换为文字宽字符串).总之,如果有人知道一个代码分析工具可以帮助我很高兴听到它,我已经放弃了尝试自己实现这个目标.
故事:
目前,我们正在扩展推荐的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,jasmine并protractorESLint插件,这也与船自己的推荐配置(默认规则的严格水平和默认规则参数).
问题:
我们如何使用在同一时间所有的推荐配置 - 在一个ESLint和所有使用的插件附带?
尝试以下方法:
{
"extends": [
"eslint:recommended",
"plugin:protractor/recommended",
"plugin:jasmine/recommended",
"plugin:angular/recommended"
],
...
}
Run Code Online (Sandbox Code Playgroud)
但得到以下错误:
无法读取未定义的"推荐"属性
在最近的一次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开启.
我继承了一个使用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输出.有人能帮我理解这里发生了什么吗?
在代码审查期间,我找到了这样的源代码:
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环境.
潜在的策略
没有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 …
最近,我有以下情况
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 都做不到。
编辑:几点让我的问题更清楚:
c++ ×5
cppcheck ×3
eslint ×2
javascript ×2
angularjs ×1
bstr ×1
bytecode ×1
const ×1
const-method ×1
jasmine ×1
java ×1
pcre ×1
pointers ×1
protractor ×1
pylint ×1
python ×1
regex ×1
temporary ×1
visual-c++ ×1