我有一个开源代码,大约15 MB.我想了解那里使用的主要算法.我开始分析该代码的每个部分,但我认为这将花费很多时间.有没有办法让过程更容易?我之前没有这样做,所以这是我的第一次体验.
这一个,可能有人知道:https://launchpad.net/cuneiform-linux
无论我们是维护不熟悉的代码还是检查Apache模块的实现细节,如果我们能够快速遍历代码并构建我们正在查看的内容的概述,它将会有所帮助.Grep服务于我的大部分日常需求,但有些情况下它不会做.
以下是它可以提供帮助的常见示例.要找到我感兴趣的PHP函数的定义,我可以在命令行输入:
grep -r "function myfunc" .
Run Code Online (Sandbox Code Playgroud)
如果我们知道返回类型,这可以很快适应C或C++,但是如果我要列出我的类提供的每个方法,事情会变得更复杂:
grep "function " ./src/mine.class.php
Run Code Online (Sandbox Code Playgroud)
由于没有单个关键字表示C++中的函数或方法,并且因为它通常是更复杂的语法,我认为我需要某种静态代码分析工具,智能使用C预处理器或盲目信任编码器遵循严格的代码指南(空白的数量,curites的位置等)以获得这些结果.
你会推荐什么?
我们想要解析我们庞大的C++源代码树,以获取足够的信息来提供给另一个工具来制作类和对象关系图,识别事物的整体组织等.
到目前为止,我最好的尝试是扫描所有.cpp和.h文件的Python脚本,运行正则表达式搜索以尝试检测类声明,方法等.我们不需要一个完整的分析器来捕获每个细节,或者一些重型UML图生成器 - 我们想要忽略很多细节,我们正在发明新类型的图.该脚本八九不离十工作,但由天哪它是真实的:C++ 是难以解析!
所以我想知道从我们的资源中提取我们想要的信息的工具是什么?我不是语言专家,也不想要有陡峭学习曲线的东西.我们低眉蓝领程序员咕噜声可以使用的东西:P
Python是首选的标准语言之一,但它并不重要.
错误CA1822:Microsoft.Performance:从不使用'SomeController.AnAction(string,string)'中的'this'参数(或Visual Basic中的'Me').将成员标记为静态(或在Visual Basic中为Shared)或在方法体中使用"this"/"Me"或至少使用一个属性访问器(如果适用).
当通过URL请求时,静态操作产生404未找到.该操作正在按预期工作,代码分析已关闭.这有什么意义,什么是适当的补救措施?
请注意,操作的返回类型是PartialViewResult,如果返回类型为ActionResult,则代码分析似乎不会抱怨此情况.
[HttpPost]
public PartialViewResult BlankEditorRow(string formId, Common.Entities.Common.ObjTypeEnum objType)
{
if (objType == Common.Entities.Common.ObjTypeEnum.Regular)
return new AjaxPartialViewResult("_RowEditor", new ProcedureEntryEntity()) { UpdateValidationForFormId = formId };
else
return new AjaxPartialViewResult("_TemplateRowEditor", new ProcedureEntryEntity()) { UpdateValidationForFormId = formId };
}
Run Code Online (Sandbox Code Playgroud)
更新:看起来将返回类型更改为ActionResult可以解决错误,而PartialViewResult是ActionResult,因此它应该可以正常工作.
我试图在开源项目中压制警告,并且
/[\.\,\;\:\(\)\[\]\{\}\<\>\"\'\`\~\/\|\?\!\&\@\#\s\x00-\x1f\x7f]+/
Run Code Online (Sandbox Code Playgroud)
给了我
(irb):1: warning: character class has duplicated range
Run Code Online (Sandbox Code Playgroud)
是否有任何工具可以自动指出正则表达式的哪些部分导致重叠?
请考虑以下代码,这些代码会引发 CA2104: Do not declare read only mutable reference types.
public class Test
{
// This provokes CA2104: "Do not declare read only mutable reference types".
protected readonly ImmutableClass ImmutableMember;
}
public class ImmutableClass
{
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道一种方法将一个类标记为不可变的方式会抑制警告CA2104?
我试着装饰MutableClass而[ImmutableObject(true)]没有成功的希望(因为表格编辑器使用的属性非常清楚),而且确实它不起作用.
我假设Code Analysis在确定是否发出CA2104时使用已知的不可变类型列表,因此我们不能使用相同的方法.
我想即使你可以将一个类标记为不可变,编译器也无法实际检查它是否为真,但至少它可能是一个有用的指标.
无论如何,我有什么属性可以忽略吗?如果没有,则必须进行抑制.
目前似乎没有替代方法可以做到这一点.
我找到了一个有趣的博客,来自Joe Duffy("Windows上的并发编程"一书的作者)关于这种事情.
他从"想象我们有一个ImmutableAttribute"开始....... :)
这很有意思 - 他遇到了编写一些新的FxCop规则来分析属于不可变的类型的麻烦.
我正在尝试使用MSBuildWorkspace类.我的项目中有所有程序集引用.当我在对象浏览器中打开引用时,我看到了命名空间和我尝试使用的类.但在我的以下使用声明中,
using Microsoft.CodeAnalysis.MSBuild
我得到了一个
The type or namespace name 'MSBuild' does not exist in the namespace 'Microsoft.CodeAnalysis' (are you missing an assembly reference?)
Run Code Online (Sandbox Code Playgroud)
但有趣的是,Syntax荧光笔识别出类型名称,它的编译器抱怨

这是构建日志
1>c:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3258: The primary reference "Microsoft.CodeAnalysis.Workspaces" could not be resolved because it has an indirect dependency on the .NET Framework assembly "Microsoft.Build, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" which has a higher version "12.0.0.0" than the version "4.0.0.0" in the current target framework.
1>c:\windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3258: The primary reference "Microsoft.CodeAnalysis.VisualBasic.Workspaces" could not be resolved because …Run Code Online (Sandbox Code Playgroud) 我正在编写一个带有Roslyn的代码分析器,我需要检查它是否ExpressionSyntax是类型Task或Task<T>.
到目前为止我有这个:
private static bool IsTask(ExpressionSyntax expression, SyntaxNodeAnalysisContext context)
{
var type = context.SemanticModel.GetTypeInfo(expression).Type;
if (type == null)
return false;
if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task")))
return true;
if (type.Equals(context.SemanticModel.Compilation.GetTypeByMetadataName("System.Threading.Tasks.Task`1")))
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理为Task,但不适合Task<int>或Task<string>...我可以核对姓名和命名空间,但它是不切实际的,因为我要检查每个命名空间的"级别".
有推荐的方法吗?
我们有几个Flex项目,其中一个刚被重构.我想知道是否有一种简单的方法来判断哪些类和功能(如果有的话)不再被使用了?
我发现我们肯定有一些未使用的代码,因为在整个项目中运行ASDoc会报告一些编译错误,这些错误不会被Flex Builder报告(暗示这些类不再被使用).我希望找到一个更强大和完整的方法,最好也可以在功能级别工作.
代码分析抛出错误CA1006:每当我们在接口契约中定义自定义定义时,不要将泛型类型嵌套在成员签名中.处理这个所谓的设计问题的最佳方法是什么.对此有任何深刻的想法.
感谢您花费宝贵的时间来完成这项工作.
例:-
Task<IList<Employee>> LoadAllEmployeeAsync();
Run Code Online (Sandbox Code Playgroud) code-analysis ×10
c# ×4
.net ×2
c++ ×2
roslyn ×2
apache-flex ×1
c ×1
fxcop ×1
grep ×1
immutability ×1
open-source ×1
parsing ×1
python ×1
regex ×1
ruby ×1