我问的是,我错过了一些明显的东西,但我想我可能偶然发现了.NET编译器中的一个错误.
我在.NET解决方案中有两个项目,一个是Visual Basic,一个是C#.
C#代码,由三个带有默认值的重载静态方法组成:
public static class Class1
{
public static void TestFunc(int val1, int val2 = 0)
{
}
public static void TestFunc(int val1 = 0)
{
}
public static void TestFunc(string val1, int val2 = 0)
{
}
}
Run Code Online (Sandbox Code Playgroud)
Visual Basic代码,调用其中一个重载方法:
Option Explicit On
Option Strict On
Imports ClassLibrary1
Module Module1
Sub Main()
Dim x As Integer
Class1.TestFunc(x, 0)
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)
编译此代码将失败,说:
'TestFunc'是不明确的,因为类'ClassLibrary1.Class1'中存在多种具有此名称的成员.
为什么它会看到这种方法含糊不清?只有一个带有(int,int)签名的Class1.TestFunc.这是一个错误,还是我错过了什么?
假设我正在使用以下C片段:
void inc(int *num) {*num++;}
void dec(int *num) {*num--;}
void f(int var) {
inc(&var);
dec(&var);
}
Run Code Online (Sandbox Code Playgroud)
通过使用静态分析器,我希望能够判断var的值在函数执行期间是否没有改变.我知道我必须自己保持状态(这是编写一个Clang检查器的重点),但是我遇到麻烦得到这个变量的唯一引用.
例如:如果我使用以下API
void MySimpleChecker::checkPostCall(const CallEvent &Call,
CheckerContext &C) const {
SymbolRef MyArg = Call.getArgSVal(0).getAsSymbol();
}
Run Code Online (Sandbox Code Playgroud)
我希望它在我的检查器上下文中返回指向此符号表示的指针.但是,我总是以这种方式使用它来进入MyArg 0.对于回调前和后回调中的inc和dec函数都会发生这种情况.
我在这里错过了什么?我出错了什么概念?
注意:我目前正在阅读Clang CFE Internals Manual,我已经阅读了24小时内如何编写Checker材料.到目前为止我还是找不到答案.
我试图找出编译器为什么有这个功能的问题.它给了我"并非所有代码路径返回值"错误,但是我看不到控制流将传递给if( a )
表达式而a
不是真的情况(所以这if( a )
是多余的,但编译器似乎没有认识到这一点) .
public static Boolean Foo(Boolean x)
{
Boolean a = false;
if( x )
{
a = true;
}
else
{
try
{
SomethingThatMightThrow();
Assert.IsFalse( a );
return a;
}
catch(Exception)
{
a = true;
}
}
if( a )
{
return x;
}
}
Run Code Online (Sandbox Code Playgroud)
立即解决方法是简单地立即删除if( a )
guard语句return x
- 但是为什么编译器会抱怨,即使它应该能够静态地证明所有可能的代码路径都会出现return
声明?至关重要的是,没有循环,这通常是它无法证明的主要原因return
.
我正在使用VS2015 Update 3.
我帮助维护和构建一个相当大的Swing GUI,有很多复杂的交互.我经常发现自己修复了由于某些其他竞争条件导致事情进入奇怪状态的错误.
随着代码库变大,我发现通过文档指定哪些方法具有线程限制已经不那么一致了:最常见的是必须在Swing EDT上运行的方法.类似地,知道并提供静态感知将是有用的,其中(我们的自定义)侦听器通过规范在EDT上被通知.
因此,我认为这应该可以使用注释轻松实施.请注意,至少存在一个静态分析工具CheckThread,它使用注释来完成此任务.它似乎允许你声明一个方法被限制在一个特定的线程(最常见的是EDT),并将标记尝试调用该方法的方法,而不会将自己声明为局限于该线程.
所以从表面上看,这似乎是对源和构建周期的低痛苦,巨大收益.我的问题是:
我知道它是否适合我们取决于我们的情况.但是我从来没有听说过人们在实践中使用过这样的东西,说实话,它似乎并没有从一些普通的浏览中获得太多.所以我想知道为什么.
大多数编程语言中方法的复杂性可以使用静态源代码分析器在圈复杂度中进行测量.是否有类似的度量标准来衡量SQL查询的复杂性?
它很简单,可以衡量返回查询所需的时间,但如果我只想量化查询的复杂程度呢?
[编辑/注意]虽然获得执行计划很有用,但在这种情况下,这并不一定是我想要识别的.我不是在寻找服务器执行查询的难度,我正在寻找一个指标来确定开发人员编写查询的难度,以及包含缺陷的可能性.
[编辑/注释2]不可否认,有时候测量复杂性没有用,但有时也是如此.有关该主题的进一步讨论,请参阅此问题.
pyLint看起来像是运行python代码分析的好工具.但是,我们的主要目标是捕获任何潜在的错误而不是编码约定.启用所有pyLint检查似乎会产生很多噪音.关于你使用的一组pyLint功能的任何建议是否有效?
我正在为C做一个静态分析器.我已经使用ANTLR完成了词法分析器和解析器,其中生成了Java代码.
ANTLR会自动为我们构建AST options {output=AST;}
吗?或者我必须自己制作树?如果是,那么如何吐出AST上的节点?
我目前认为AST上的节点将用于制作SSA,然后进行数据流分析以制作静态分析器.我在正确的道路上吗?
一位同事最近向我透露,我们的一个源文件在编译期间包含了超过3,400个标题.我们有超过1,000个翻译单元在构建中进行编译,导致对标题的巨大性能损失,这些标题肯定不会全部使用.
是否有任何静态分析工具可以揭示这样一片森林中的树木,特别是让我们有能力决定我们应该在哪些方面进行削减?
UPDATE
是否有一些工具能够分析Java源文件,从中构建图形并以某种标准/可理解的格式提供图形数据?
它绝对不需要GUI,我更喜欢命令行的东西,所以我可以通过各种工具处理输出(用于分段,可视化,......).
为了更好或更坏,我们现在有一个VB.NET编码标准文档,它基于StyleCop强制执行的C#编码标准.
例如
我倾向于认为:
如果它在需求文档中,则应由自动系统检查
我正在寻找(理想上是免费的)工具来检查VB.NET代码上的那些规则,因为这些是没有进入编译输出的样式问题,FxCop没用.
(我会亲自匹配,而我们只是检查像重复的代码和一个合理重要的事情为每个类(所以没有更多的多万人班线!),但我需要保持编码标准文档我希望有一个工具帮助我这样做.)
关于赏金.
我正在寻找一个VB.NET代码检查工具列表,简要总结了每个工具可以做什么及其局限性.如果工具不是免费的,请包含一些理想的费用.
有没有人有使用CodeRush/Refactor的经验!还是用VB.NET的ReSharper来检查这种类型的编码风格问题?
static-analysis ×10
c ×2
c# ×2
java ×2
vb.net ×2
.net ×1
antlr ×1
c++ ×1
clang ×1
coding-style ×1
dependencies ×1
header-files ×1
pylint ×1
python ×1
sql ×1