我对几个项目运行了静态代码分析,并从生成的报告中获取了这些项目中每个文件的循环复杂度。现在我想计算整个项目的平均圈复杂度。
我怎样才能最好地实现这一目标?
对我来说,仅将每个文件的循环复杂度值相加然后除以文件数似乎是错误的,因为短头文件与很长的文件具有相同的影响。另外,我想避免通过代码行来衡量文件的重要性。
还有其他方法吗?例如,用中位数?
我有ViewState
POJO 类,它们的构造函数带有许多参数。问题是 PMDExcessiveParameterList
对他们施加了违规行为。
现在我试图抑制所有以ViewState.java
(例如 in DashboardViewState.java
)结尾的类的这种违规行为。我已将其添加到我的rules-pmd.xml
:
<rule ref="category/java/design.xml/ExcessiveParameterList">
<properties>
<!--Ignore ExcessiveParameterList on ViewState classes -->
<property name="violationSuppressXPath" value="//ClassOrInterfaceDeclaration['*ViewState.java']"/>
</properties>
</rule>
Run Code Online (Sandbox Code Playgroud)
问题是,这将压制所有针对ExcessiveParameterList
哪个阶级的违规行为。我究竟做错了什么?
java static-analysis pmd suppress-warnings static-code-analysis
我有错误文本的问题。
如果我使用下面显示的错误消息,编辑器的 linter 会发出这样的警告:“错误字符串不应以标点符号或换行符结尾”:
return errors.New("Test!")
^
Run Code Online (Sandbox Code Playgroud)
问题是:为什么我不应该使用标点符号?背后的真正原因是什么?
我有以下嵌套函数
from typing import Optional
def outer(
outer_foo:int,
outer_bar:Optional[int] = 5
):
return inner(outer_foo, outer_bar)
def inner(
inner_foo:int,
inner_bar:int
):
return inner_foo+inner_bar
print(outer((1)))
Run Code Online (Sandbox Code Playgroud)
并mypy
抛出以下错误:
error: Argument 2 to "inner" has incompatible type "Optional[int]"; expected "int"
Run Code Online (Sandbox Code Playgroud)
鉴于我给出了int
默认值outer_bar
,我没有看到潜在的问题。但是,我能够解决 mypy 错误,将代码更改为:
from typing import Optional
def outer(
outer_foo:int,
outer_bar:Optional[int] = None
):
if outer_bar is None:
outer_bar = 5
return inner(outer_foo, outer_bar)
def inner(
inner_foo:int,
inner_bar:int
):
return inner_foo+inner_bar
print(outer((1)))
Run Code Online (Sandbox Code Playgroud)
这似乎破坏了声明中默认参数的用处。这是最好的/Python式的方法吗?
我从gosec
linter 收到此消息:
foo/cloud.go:34:2: G101: Potential hardcoded credentials (gosec)
fooAPIKeyENVVar = "Foo_API_KEY"
Run Code Online (Sandbox Code Playgroud)
如何禁用此警告?
让我们考虑以下代码:
function f(x : number) {
if (x === 1) {
if (x === 2) {} // error
}
else {
if (x === 1) {} // OK
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,编译器给了我一个错误x === 2
。原因很简单:如果执行已经到达此块,则x
应该1
通过x === 1
。由于1
和2
没有重叠,因此不可能x
同时是1
和2
。
但编译器完全可以x === 1
接受else
. 这应该是不可能的,因为语句中的x
检查已经失败。由于不能满足两者,第二个应该给我与 相同的错误。x === 1
if
x
x === 1
!(x === 1)
if
x === 2
这怎么可能?这是高级流量分析的某种未实现的功能吗?这是一个错误吗?又或许这个案例有一些隐藏的逻辑,最终还是有一定道理的? …
需要通过Eclipse插件获取有关Java代码的静态工具分析选项,特别是针对Struts,Spring和Hibernate的框架.目的主要是引用的分析(而不是质量度量)(类似于Eclipse中的References选项).完成的任务是对具有大量基于框架的代码的应用程序进行影响分析.
我正在处理一个使用a的类DelayQueue
.我注意到,由于DelayQueue
实现Delayed
接口中的对象,所述对象也需要实现一个compareTo()
已经完成的方法.
这是否隐含意味着我也应该考虑实施equals()
方法和hashCode()
方法?
对代码执行静态分析(SA)时收到警告。我在下面做了简化(带有第一个警告)-
typedef struct testStruct_ {
int *ptr;
} testStruct;
testStruct a;
testStruct *a_ptr;
a_ptr = &a;
a_ptr->ptr = NULL; #WARNING: Directly dereferencing pointer a_ptr.
Run Code Online (Sandbox Code Playgroud)
该代码继续对进行一些操作a_ptr
。为了完成起见,我发布了一个示例-
rc = fn_a (filename, a_ptr);
rc = fn_b (a_ptr);
rc = fn_c (a_ptr->ptr);
Run Code Online (Sandbox Code Playgroud)
fn_a定义为-
fn_a (const char *filename, testStruct *a_ptr)
{
a_ptr->ptr = fn_a_2(filename);
if (!a_ptr->ptr) {
ERR("Loading (%s) failed", filename);
return (FALSE);
}
return (TRUE);
}
Run Code Online (Sandbox Code Playgroud)
稍后,我又收到另一条警告:
if (a_ptr && a_ptr->ptr) {
freeFn(a_ptr->ptr);
}
#WARNING: Dereference before NULL check - NULL checking …
Run Code Online (Sandbox Code Playgroud) 我想检查流中的所有语法和语义错误,同时又不浪费时间等待每次编译。
gcc使用的编译器架构是否可能?
如果可能的话,怎么办?
static-analysis ×10
java ×3
c ×2
go ×2
code-metrics ×1
coverity ×1
findbugs ×1
gcc ×1
gosec ×1
java-ee ×1
metrics ×1
mypy ×1
pmd ×1
pointers ×1
python ×1
python-3.x ×1
types ×1
typescript ×1