private static void CheckForNullDereference(ExplodedGraph explodedGraph, SyntaxNodeAnalysisContext context) { var nullPointerCheck = new NullPointerCheck(explodedGraph); explodedGraph.AddExplodedGraphCheck(nullPointerCheck); var nullIdentifiers = new HashSet<IdentifierNameSyntax>(); EventHandler<MemberAccessedEventArgs> memberAccessedHandler = (sender, args) => CollectMemberAccesses(args, nullIdentifiers, context.SemanticModel); nullPointerCheck.MemberAccessed += memberAccessedHandler; try { explodedGraph.Walk(); } finally { nullPointerCheck.MemberAccessed -= memberAccessedHandler; } foreach (var nullIdentifier in nullIdentifiers) { context.ReportDiagnostic(Diagnostic.Create(Rule, nullIdentifier.GetLocation(), nullIdentifier.Identifier.ValueText)); } }
private static void CollectMemberAccesses(MemberAccessedEventArgs args, HashSet <IdentifierNameSyntax> nullIdentifiers, SemanticModel semanticModel) { if (!NullPointerCheck.IsExtensionMethod(args.Identifier.Parent, semanticModel)) { nullIdentifiers.Add(args.Identifier); } }