我目前正在学习C++,因为我还在学习,我一直在犯错.
使用像C++一样宽松的语言,通常需要花费很长时间来弄清楚究竟出了什么问题 - 因为编译器让我可以侥幸逃脱.我意识到这种灵活性是C++的主要优势之一,但它使得学习基本语言变得困难.
是否有一些工具可用于分析我的代码并根据最佳实践或合理编码提出建议?最好是作为Eclipse插件或linux应用程序.
在我的应用程序中,我有一个启动同步过程的表单,出于多种原因,我希望一次只允许一个同步运行.所以我在我的表单中添加了一个静态bool字段,指示是否正在进行同步,并添加了一个锁定,如果尚未设置此字段,则将该字段设置为true,以便第一个线程可以启动同步,但是当它运行其他每个线程时将尝试启动它将终止.
我的代码是这样的:
internal partial class SynchronizationForm : Form
{
private static volatile bool workInProgress;
private void SynchronizationForm_Shown(object sender, EventArgs e)
{
lock (typeof(SynchronizationForm))
{
if (!workInProgress)
{
workInProgress = true;
}
else
{
this.Close();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用但是当我在我的项目上运行Code Analysis时,我收到以下警告消息:
CA2002:Microsoft.Reliability:'SynchronizationForm.SynchronizationForm_Shown(object,EventArgs)'锁定类型为'Type'的引用.将其替换为具有强身份的对象的锁定.
任何人都可以向我解释我的代码有什么问题,如何改进它以使警告消失.对象具有强烈的身份意味着什么?
在visual studio中,我可以在我的.NET项目上运行代码分析.我正在运行基本正确性并有85个警告.这有点多了.其中大多数都是外部代码.
如何禁用特定警告,以便我可以专注于更重要的警告?我尝试了以下但它无法识别代码分析警告.(我第一次尝试没有CA)
#pragma warning disable CA1820 CA1065 CA2100
Run Code Online (Sandbox Code Playgroud) 我正在使用"Microsoft Minimal Rules"代码分析集构建我的项目,它给了我CA2000这个方法:
private Timer InitializeTimer(double intervalInSeconds)
{
Timer timer = null;
try
{
timer = new Timer { Interval = intervalInSeconds * 1000, Enabled = true };
timer.Elapsed += timer_Elapsed;
timer.Start();
}
catch
{
if (timer != null)
{
timer.Dispose();
}
}
return timer;
}
Run Code Online (Sandbox Code Playgroud)
此方法只是System.Timers.Timer以秒为单位创建一个新的.我有三个这样的计时器(每秒一个,每分钟一个,每半个小时一个).也许最好有一个计时器并检查已过时的事件处理程序是否已经过了一分钟或半小时,但我不知道,此时这更容易,它是继承的代码,我不想破坏一切然而.
这种方法让我臭名昭着
Warning 21 CA2000 : Microsoft.Reliability : In method 'TimerManager.InitializeTimer(double)', call System.IDisposable.Dispose on object '<>g__initLocal0' before all references to it are out of scope.
Run Code Online (Sandbox Code Playgroud)
现在我在捕获中调用Dispose并认为这就足够了?我也将所有计时器都放在了类自己的IDisposable实现中.
我在这里错过了什么?
我想知道为什么代码分析规则CA1305 - 指定IFormatProvider不适用于TryParse方法?
例如,使用"Microsoft All Rules"规则集,代码分析会针对以下代码提供CA1305警告:
static void Main(string[] args)
{
string text = args[0];
double value = double.Parse(text);
}
Run Code Online (Sandbox Code Playgroud)
但是没有给出以下代码的CA1305警告:
static void Main(string[] args)
{
string text = args[0];
double value;
if (!double.TryParse(text, out value))
value = 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现这非常不幸,因为如果输入字符串不可靠,TryParse方法是解析的正确方法.
有谁知道TryParse方法的CA1305规则是在某些较新版本的代码分析工具中实现还是由某些第三方实现?
我想做一些代码重构,特别是文件之间的"包含"关系.它们中有很多,要开始使用,有一个列表,图表甚至是柱状图会很有帮助,这样我就可以一目了然地看到从哪里包含的内容.
(在很多情况下,一个给定的文件是由其他多个文件包括,使图形将是一个DAG,没有一棵树.有没有循环.)
我使用TeX的(实际上上下文)的工作,但问题似乎适用于具有这样的设备的任何编程语言#include中的C.
很明显,简单的答案是做一个grep或所有相关的关键字.tex文件里"在文件中查找"( ,\usemodule,\input和几个其他的宏,我们已经定义).这比没有好,但是输出很长,而且仍然很难看到包含什么的模式.例如,文件A通常包含在文件B之前吗?文件C是否被同一个文件多次包含?
我想这会带来一个额外但可选的功能:这样的工具能够显示特定文件中的包含序列.因此,在这种情况下,DAG可以是多图,即从一个文件到另一个文件可能存在多个弧.
理想情况下,能够为每个文件添加注释会很好,并简要概述其中的内容.这将构成该文件的图形节点上的文本的一部分.
可能这种事情可以通过生成graphviz点语言的脚本来完成.但我想知道它是否已经完成,而不是重新发明轮子.
由于C++编译器可以(通常)检测违规的const湖,还有什么会确定申报的东西作为错失良机工具const?
我正在使用eclipse开普勒,我需要一个插件来确定项目正在使用工作空间/工作集的其他项目的哪些方法.很像"调用层次结构",但自动适用于所有类和方法.
是否有现成的插件可以做到这一点?不一定需要可视化,结果表就足够了.
我有一个很大的困惑,当我们有声纳服务器时声纳扫描仪有什么用?当我使用 soarqube 服务器分析一个项目时,它进行了分析并且运行良好。我仍然很困惑为什么我们也需要扫描仪。
与eclipse或maven或github集成时是否需要它?我对此进行了研究,但无法得到确切的答案来满足自己。
在 VS 2017 Enterprise 上复制的步骤:
没有“抑制”选项可用。
有谁知道为什么没有抑制警告?
c# code-analysis visual-studio .net-core roslyn-code-analysis