是否有去语般的静态分析工具lint
,pylint
等等?据我搜索,我没有找到任何相关的东西.
我可以在我所在部门担任本科高级项目.我必须确定以前没有这样做过.任何帮助表示赞赏.
从版本1.80开始,Cppcheck告诉我
表达式'msg [ipos ++] =校验和(&msg [1],ipos-1)'取决于副作用的评估顺序
在这个代码序列中(简化,data
是一个变量)
BYTE msg[MAX_MSG_SIZE]; // msg can be smaller, depending on data encoded
int ipos = 0;
msg[ipos++] = MSG_START;
ipos += encode(&msg[ipos], data);
msg[ipos++] = checksum(&msg[1], ipos-1); // <---- Undefined Behaviour?
msg[ipos++] = MSG_END; // increment ipos to the actual size of msg
Run Code Online (Sandbox Code Playgroud)
并将此视为错误,而不是可移植性问题.
它是C代码(包含在C++主导的项目中),使用C++ 98兼容编译器编译,同时按预期运行数十年.Cppcheck使用C++ 03,C89,自动检测语言运行.
我承认代码应该更好地重写.但在此之前,我试图弄清楚:它真的依赖于评估顺序吗?根据我的理解,正在首先评估正确的操作数(它需要在调用之前),然后msg[ipos]
使用ipos
最后完成的增量进行赋值(to ).
我错了这个假设,还是只是假阳性?
Javascript代码很难维护.
我正在寻找能够帮助我确保合理质量水平的工具.
到目前为止,我已经找到了JsUNit,一个非常好的javascript单元测试框架.可以在任何可用的浏览器上从ant自动运行测试.
我还没有找到一些相当于PMD,checkstyle,Findbug的javascript ...
你知道javascript的静态代码分析工具吗?
像pep8这样的工具可以查看源代码样式,但是它们不会根据pep257,pep287来检查docstrings是否已经过滤.有这样的工具吗?
更新
我决定自己实现这样一个静态分析工具,请参阅:
很多时候我想要一个函数来接收可变数量的参数,例如以NULL结尾
#define push(stack_t stack, ...) _push(__VARARG__, NULL);
func _push(stack_t stack, char *s, ...) {
va_list args;
va_start(args, s);
while (s = va_arg(args, char*)) push_single(stack, s);
}
Run Code Online (Sandbox Code Playgroud)
如果foo收到非char*
变量,我可以指示gcc或clang发出警告吗?类似的东西__attribute__(format)
,但是对于同一指针类型的多个参数.
在Linux上使用相当大的C++代码库和GCC工具链时,我遇到了执行布尔检查的代码,如下所示:
#include <stdio.h>
int main() {
bool foo = true;
if (~foo) {
// do some expensive operation
printf("This can be bad...\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这看起来像一个明显的错误,因为~
运算符在C++中表示逐位NOT,而不是逻辑NOT,就像在MATLAB中那样.上面的代码总是评估为true
幸运的是,这个错误造成的问题不是很重要(这只是一个小小的性能损失),但它让我想到如何在这么多时间内找不到这个错误.
由于逐位运算符触发从布尔值到整数的隐式转换(这是一个促销),因此它本身没有任何问题.然而,对我而言,似乎至少clang-tidy
应该能够将其视为逻辑错误,因为很明显,在大多数情况下,意图不是对bool应用逐位操作,而是而是一个逻辑的.
g++
即使-Wall -Wextra -Wconversion
启用也似乎并不关心这个问题,这是明智的,因为正如我之前提到的,这不符合标准.(我甚至试过g++
6.3,它应该有很多新的检查,但仍然没有任何结果
使用clang-tidy
所有启用的检查(真的很快就会变得嘈杂)会警告隐式转换本身("隐式转换bool - >'int'"),但似乎没有与应用bit-相关的特定警告聪明的操作员到布尔.
以不同的方式编写if语句if(~foo == true)
,虽然详细并导致始终为false的情况,但确实会导致更有意义的错误,从而引起注意,但是在使用terser if(~foo)
表单时不会发生这种情况.
是否有任何方法/工具来检查这些问题,这些问题是100%正确的C++,但很可能是错误?
我认为Coffeescript是一种很棒的语言!我正在寻找一些将静态分析添加到Coffeescript的项目/问题/功能.然而,经过一些搜索,我发现Coffeescript 常见问题解答和此页面表明静态分析可能不可行.
我想知道如果在Coffeescript中实现静态分析/静态类型检查存在根本问题,那么编译器中是否存在这种类型的东西?
此外,对于非平凡的检查,这是不可能的,但可能仅适用于直接分析?当我说直截了当时,我的意思是检查一些微不足道的东西,比如,用户是否使用相同的名称(在类中)或顶层(或者在相关的.coffee文件集合中的顶层)定义了两次函数.
如果有人能指出一些示例,说明为什么实施静态分析/类型检查不简单/可能/值得花时间,我将不胜感激?
非常感谢你!
javascript programming-languages static-analysis coffeescript
有没有办法禁用Sonar中选定软件包的某些指标?我使用Sonar来分析我的项目,在Entity和DTO包中我有一些相同的代码 - 带有注释的相同字段ID等被Sonar报告为重复.它绝对没有意义,所以我想禁用它.我怎样才能做到这一点?使用全局排除选项会禁用所选包上的所有指标,但如何仅为代码重复执行此操作?
我必须对数据集进行统计分析.我想创建所有可能的模型并使用挖泥功能测试它们但它不起作用.的确,当我输入:
glm1<-glm(presabs~dca1+dca2+se1+se2, family=binomial(logit))
dredge(glm1)
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
Erreur in dredge(glm1) :
'global.model''s 'na.action' argument is not set and options('na.action') is "na.omit"
Run Code Online (Sandbox Code Playgroud)
有人能帮我吗?