Skip to content

Commit

Permalink
Merge pull request #2883 from mavasani/FixNRE
Browse files Browse the repository at this point in the history
Fix NRE in recently added AssigningSymbolAndItsMemberInSameStatement …
  • Loading branch information
mavasani committed Oct 1, 2019
2 parents 789704f + 8570e00 commit 4bc7bc6
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 18 deletions.
Expand Up @@ -50,29 +50,21 @@ private void AnalyzeAssignment(OperationAnalysisContext context)
}

// This analyzer makes sense only for reference type objects
if (operationTarget.Instance?.Type.IsValueType == true)
if (operationTarget.Instance?.Type?.IsReferenceType != true)
{
return;
}

// Search for object equal to operationTarget.Instance further in assignment chain
bool isViolationFound = false;
if (operationTarget.Instance is ILocalReferenceOperation localInstance)
bool isViolationFound = operationTarget.Instance switch
{
isViolationFound = AnalyzeAssignmentToMember(assignmentOperation, localInstance, (a, b) => a.Local.Equals(b.Local));
}
else if (operationTarget.Instance is IMemberReferenceOperation memberInstance)
{
isViolationFound = AnalyzeAssignmentToMember(assignmentOperation, memberInstance, (a, b) => a.Member.Equals(b.Member) && a.Instance?.Syntax.ToString() == b.Instance?.Syntax.ToString());
}
else if (operationTarget.Instance is IParameterReferenceOperation parameterInstance)
{
isViolationFound = AnalyzeAssignmentToMember(assignmentOperation, parameterInstance, (a, b) => a.Parameter.Equals(b.Parameter));
}
else
{
return;
}
ILocalReferenceOperation localInstance =>
AnalyzeAssignmentToMember(assignmentOperation, localInstance, (a, b) => a.Local.Equals(b.Local)),
IMemberReferenceOperation memberInstance =>
AnalyzeAssignmentToMember(assignmentOperation, memberInstance, (a, b) => a.Member.Equals(b.Member) && a.Instance?.Syntax.ToString() == b.Instance?.Syntax.ToString()),
IParameterReferenceOperation parameterInstance =>
AnalyzeAssignmentToMember(assignmentOperation, parameterInstance, (a, b) => a.Parameter.Equals(b.Parameter)),
_ => false,
};

if (isViolationFound)
{
Expand Down
Expand Up @@ -316,5 +316,20 @@ public void Method()
}
", TestValidationMode.AllowCompileErrors);
}

[Fact]
public void CSharpAssignmentInCodeWithOperationNone()
{
VerifyCSharpUnsafeCode(@"
public struct Test
{
public System.IntPtr PtrField;
public unsafe void Method(Test a, Test *b)
{
b->PtrField = a.PtrField;
}
}
");
}
}
}

0 comments on commit 4bc7bc6

Please sign in to comment.