2015-01-14 4 views
1

File.WriteAllText, Request.Files["filename"].SaveAs("out") 등과 같은 IO 작업을 호출하는 모든 코드를 찾는 방법이 있습니까?C# 코드의 모든 파일 IO 작업 찾기 (정적 분석을 통해)

지금은 단지 예를 들어 그런 식으로 파일을 읽기/쓰기 가능한 모든 일반적인 방법을 grep을 할 경우 :

나는 모든 가능한 방법 파일을 생각할 수 없기 때문에이 만족스럽지
grep 'SaveAs' -I -r . -l | grep "\.cs" 

수 읽고 쓸 수 있어야합니다. 어쩌면 리플렉션을 통해 또는 컴파일 된 바이너리에서 시스템 호출을 분석하여 수행 할 수 있습니까? 어떤 아이디어?

EDIT : 메서드 A가 메서드 B를 호출하고 메서드 B가 메서드 C를 호출하고 메서드 C가 파일 연산을 수행하면 해당 코드도 식별되는 것이 좋습니다. 그러나 IO를 직접 호출하는 문제를 단순화하는 것으로 충분합니다.

+1

@Rawling 오른쪽, 내 코멘트를 삭제했습니다. – smiech

+0

메서드 A가 메서드 B를 호출하고 메서드 B가 메서드 C를 호출하고 메서드 C가 파일 작업을 수행하면이 목록에 A가 필요합니까? –

답변

1

이 도구를 개발하려는 경우 here을 시작할 수 있습니다.

이 기사에서는 어셈블리 및 메서드 종속성을 검색하는 방법을 설명하므로 FileStream.Write과 같이 IO 프리미티브를 호출하는 모든 메서드를 찾을 수 있습니다.

1

그래서 나는 변덕스럽게 Mono.Cecil을 사용하여 이것을 시도하기로 결정했습니다.

그것은 재귀 적 방법을 호출하는 모든 메소드의 목록을 얻으려면 아주 간단 :

static IEnumerable<MethodDefinition> GetMethodsCalledInMethod(MethodDefinition md) 
{ 
    if (md.Body == null) 
    { 
     return Enumerable.Empty<MethodDefinition>(); 
    } 

    return md.Body.Instructions 
     .Select(i => i.Operand) 
     .OfType<MethodReference>() 
     .Select(mr => mr.Resolve()) 
     .Where(mr => mr != null); 
} 

당신은 당신이 검사 할 어셈블리에있는 모든 방법을 얻을 수 있습니다 :

var ad = AssemblyDefinition.ReadAssembly(typeof(ATypeInTheAssembly).Assembly.Location); 
var allMethodsInAssembly = ad.Modules 
    .SelectMany(m => m.Types) 
    .SelectMany(t => t.Methods)); 

당신을 IO 호출처럼 보이는 메소드 호출을 찾을 때까지이 메소드 호출 트리를 통해 재귀 할 수 있습니다.

Func<MethodDefinition, bool> isFileOperation = md => 
    md.DeclaringType.Name == "FileStream"; 

충분합니까? 나는 모른다. File.WriteAllTextFileStream을 사용합니다. 예를 들어 SaveAs도 제공합니다. 그러나 마다 파일 액세스는 FileStream을 통과합니까? 나는 말할 수 없다. 당신은 그렇지 않으면 재귀 무한 루프로 전환하고 당신이 당신의 스택을 날려 것이기 때문에, 재귀 호출을 위해 밖으로 볼 필요가

  • :

    이러한 접근 방식은 또한 문제가 있습니다.

  • 이것은 sloooow입니다. File.WriteAllLines이라는 간단한 콘솔 애플리케이션을 분석했을 때 즉시 결과가 나왔지만 분석기 자체를 분석하려고 시도했을 때 트리에서 길을 잃었습니다.
  • 인터페이스를 실행하거나 가상 메서드를 실행하는 경우 구현이 어떻게 될지 알 수 없으므로 IO 작업을 수행 할 것인지 여부를 알 수 없습니다.
+0

인터페이스에 관한 좋은 지적입니다. 문제는 가능한 런타임 환경 (DLL/구현) 측면에서 해결되어야한다고 생각합니다. – user3816466

1

깊이 분석에서 얼마만큼하고 싶습니까?
'System.IO'메서드 호출을 모두 잡는 것이 정말 중요하다면 NRefactory을 사용하는 것이 좋습니다. C# 코드를 구문 분석하고 구문 트리 및 코드 분석기를 생성 할 수있는 프런트 엔드 C# 파서입니다.
시작하는 데 도움이되는 code project에서 사용하는 방법에 대한 좋은 자습서가 있습니다. 또한 코드 프로젝트 튜토리얼 샘플에는 전체 솔루션을로드하고 코드 분석기를 제공하는 보조 클래스가 있습니다.
더 많은 샘플이 필요한 경우 내 blog에서 찾을 수 있습니다.

추신 : 몇 시간 후 코드 샘플로이 답변을 확장 해 보겠습니다.