本文整理汇总了C#中Microsoft.PSharp.StaticAnalysis.ControlFlowGraphNode类的典型用法代码示例。如果您正苦于以下问题:C# ControlFlowGraphNode类的具体用法?C# ControlFlowGraphNode怎么用?C# ControlFlowGraphNode使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
ControlFlowGraphNode类属于Microsoft.PSharp.StaticAnalysis命名空间,在下文中一共展示了ControlFlowGraphNode类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: FlowsIntoTarget
/// <summary>
/// Returns true if the given expression flows in the target.
/// </summary>
/// <param name="variable">Variable</param>
/// <param name="target">Target</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="targetSyntaxNode">Target syntaxNode</param>
/// <param name="targetCfgNode">Target controlFlowGraphNode</param>
/// <param name="model">SemanticModel</param>
/// <returns>Boolean</returns>
internal static bool FlowsIntoTarget(VariableDeclaratorSyntax variable, ISymbol target,
SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode, SyntaxNode targetSyntaxNode,
ControlFlowGraphNode targetCfgNode, SemanticModel model)
{
ISymbol reference = model.GetDeclaredSymbol(variable);
return DataFlowAnalysis.FlowsIntoTarget(reference, target, syntaxNode,
cfgNode, targetSyntaxNode, targetCfgNode);
}
示例2: DoesResetInLoop
/// <summary>
/// Returns true if the given expression resets when flowing from the
/// target in the given loop body control flow graph nodes. The given
/// control flow graph nodes must be equal.
/// </summary>
/// <param name="expr">Expression</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="targetSyntaxNode">Target syntaxNode</param>
/// <param name="targetCfgNode">Target controlFlowGraphNode</param>
/// <param name="model">SemanticModel</param>
/// <returns>Boolean value</returns>
internal static bool DoesResetInLoop(ExpressionSyntax expr, SyntaxNode syntaxNode,
ControlFlowGraphNode cfgNode, SyntaxNode targetSyntaxNode,
ControlFlowGraphNode targetCfgNode, SemanticModel model)
{
ISymbol reference = null;
if (!cfgNode.Equals(targetCfgNode) ||
!Utilities.TryGetSymbolFromExpression(out reference, expr, model))
{
return false;
}
return DataFlowAnalysis.DoesResetInLoop(reference, syntaxNode, cfgNode,
targetSyntaxNode, targetCfgNode);
}
示例3: ResolveSideEffectsInCall
/// <summary>
/// Resolves the side effects from the given invocation summary.
/// </summary>
/// <param name="call">Call</param>
/// <param name="summary">MethodSummary</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="model">SemanticModel</param>
/// <param name="dataFlowMap">DataFlowMap</param>
/// <returns>Set of reachable field symbols</returns>
private static HashSet<ISymbol> ResolveSideEffectsInCall(InvocationExpressionSyntax call, MethodSummary summary,
SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode, SemanticModel model, DataFlowMap dataFlowMap)
{
if (summary == null)
{
return new HashSet<ISymbol>();
}
HashSet<ISymbol> reachableFields = new HashSet<ISymbol>();
var sideEffects = summary.GetResolvedSideEffects(call.ArgumentList, model);
foreach (var sideEffect in sideEffects)
{
dataFlowMap.MapRefsToSymbol(sideEffect.Value, sideEffect.Key, syntaxNode, cfgNode);
reachableFields.Add(sideEffect.Key);
}
foreach (var fieldAccess in summary.FieldAccessSet)
{
foreach (var access in fieldAccess.Value)
{
if (cfgNode.Summary.FieldAccessSet.ContainsKey(fieldAccess.Key as IFieldSymbol))
{
cfgNode.Summary.FieldAccessSet[fieldAccess.Key as IFieldSymbol].Add(access);
}
else
{
cfgNode.Summary.FieldAccessSet.Add(fieldAccess.Key as IFieldSymbol, new HashSet<SyntaxNode>());
cfgNode.Summary.FieldAccessSet[fieldAccess.Key as IFieldSymbol].Add(access);
}
}
}
return reachableFields;
}
示例4: ResolveObjectType
/// <summary>
/// Resolves the object type of the given symbol on the given syntax node.
/// </summary>
/// <param name="types">Set of object type symbols</param>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="dataFlowMap">DataFlowMap</param>
/// <returns>Boolean</returns>
private static bool ResolveObjectType(out HashSet<ITypeSymbol> types, ISymbol symbol,
SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode, DataFlowMap dataFlowMap)
{
types = new HashSet<ITypeSymbol>();
Dictionary<ISymbol, HashSet<ITypeSymbol>> objectTypeMap = null;
if (!dataFlowMap.TryGetObjectTypeMapForSyntaxNode(syntaxNode, cfgNode,
out objectTypeMap))
{
return false;
}
if (!objectTypeMap.ContainsKey(symbol))
{
return false;
}
types = objectTypeMap[symbol];
return true;
}
示例5: AnalyseControlFlowGraphNode
/// <summary>
/// Performs data flow analysis on the given control flow graph node.
/// </summary>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="previousCfgNode">Previous controlFlowGraphNode</param>
/// <param name="previousSyntaxNode">Previous syntaxNode</param>
/// <param name="dataFlowMap">DataFlowMap</param>
/// <param name="model">SemanticModel</param>
/// <param name="context">AnalysisContext</param>
/// <returns>Boolean</returns>
private static void AnalyseControlFlowGraphNode(ControlFlowGraphNode cfgNode, ControlFlowGraphNode previousCfgNode,
SyntaxNode previousSyntaxNode, DataFlowMap dataFlowMap, SemanticModel model, AnalysisContext context)
{
if (!cfgNode.IsJumpNode && !cfgNode.IsLoopHeadNode)
{
foreach (var syntaxNode in cfgNode.SyntaxNodes)
{
dataFlowMap.Transfer(previousSyntaxNode, previousCfgNode, syntaxNode, cfgNode);
var stmt = syntaxNode as StatementSyntax;
var localDecl = stmt.DescendantNodesAndSelf().OfType<LocalDeclarationStatementSyntax>().FirstOrDefault();
var expr = stmt.DescendantNodesAndSelf().OfType<ExpressionStatementSyntax>().FirstOrDefault();
var ret = stmt.DescendantNodesAndSelf().OfType<ReturnStatementSyntax>().FirstOrDefault();
if (localDecl != null)
{
var varDecl = (stmt as LocalDeclarationStatementSyntax).Declaration;
foreach (var variable in varDecl.Variables)
{
if (variable.Initializer == null)
{
continue;
}
DataFlowAnalysis.TryCaptureParameterAccess(variable.Initializer.Value,
syntaxNode, cfgNode, dataFlowMap, model, context);
DataFlowAnalysis.TryCaptureFieldAccess(variable.Initializer.Value,
syntaxNode, cfgNode, dataFlowMap, model, context);
ITypeSymbol declType = null;
if (variable.Initializer.Value is LiteralExpressionSyntax &&
variable.Initializer.Value.IsKind(SyntaxKind.NullLiteralExpression))
{
declType = model.GetTypeInfo(varDecl.Type).Type;
}
else
{
declType = model.GetTypeInfo(variable.Initializer.Value).Type;
}
if (context.IsTypeAllowedToBeSend(declType) ||
context.IsMachineType(declType, model))
{
continue;
}
var declSymbol = model.GetDeclaredSymbol(variable);
if (variable.Initializer.Value is IdentifierNameSyntax ||
variable.Initializer.Value is MemberAccessExpressionSyntax)
{
ISymbol varSymbol = null;
if (variable.Initializer.Value is IdentifierNameSyntax)
{
varSymbol = model.GetSymbolInfo(variable.Initializer.Value
as IdentifierNameSyntax).Symbol;
}
else if (variable.Initializer.Value is MemberAccessExpressionSyntax)
{
varSymbol = model.GetSymbolInfo((variable.Initializer.Value
as MemberAccessExpressionSyntax).Name).Symbol;
}
dataFlowMap.MapRefToSymbol(varSymbol, declSymbol, syntaxNode, cfgNode);
HashSet<ITypeSymbol> objectTypes = null;
if (DataFlowAnalysis.ResolveObjectType(out objectTypes, varSymbol, syntaxNode,
cfgNode, dataFlowMap))
{
dataFlowMap.MapObjectTypesToSymbol(objectTypes, declSymbol, syntaxNode, cfgNode);
}
else
{
dataFlowMap.EraseObjectTypesFromSymbol(declSymbol, syntaxNode, cfgNode);
}
}
else if (variable.Initializer.Value is LiteralExpressionSyntax &&
variable.Initializer.Value.IsKind(SyntaxKind.NullLiteralExpression))
{
dataFlowMap.ResetSymbol(declSymbol, syntaxNode, cfgNode);
}
else if (variable.Initializer.Value is InvocationExpressionSyntax)
{
var invocation = variable.Initializer.Value as InvocationExpressionSyntax;
var summary = MethodSummary.TryGetSummary(invocation, model, context);
var reachableSymbols = DataFlowAnalysis.ResolveSideEffectsInCall(invocation,
summary, syntaxNode, cfgNode, model, dataFlowMap);
var returnSymbols = DataFlowAnalysis.GetReturnSymbols(invocation, summary, model);
if (returnSymbols.Count == 0)
//.........这里部分代码省略.........
示例6: ExistsMapForSyntaxNode
/// <summary>
/// Returns true if there is a map for the given syntax node.
/// </summary>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <returns>Boolean value</returns>
internal bool ExistsMapForSyntaxNode(SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode)
{
if (this.Map.ContainsKey(cfgNode))
{
if (this.Map[cfgNode].ContainsKey(syntaxNode))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
示例7: DoesResetInLoop
/// <summary>
/// Returns true if the given symbol resets when flowing from the
/// target in the given loop body control flow graph nodes. The
/// given control flow graph nodes must be equal.
/// </summary>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="targetSyntaxNode">Target syntaxNode</param>
/// <param name="targetCfgNode">Target controlFlowGraphNode</param>
/// <returns>Boolean</returns>
internal static bool DoesResetInLoop(ISymbol symbol, SyntaxNode syntaxNode,
ControlFlowGraphNode cfgNode, SyntaxNode targetSyntaxNode,
ControlFlowGraphNode targetCfgNode)
{
if (cfgNode.ISuccessors.Count == 0)
{
return false;
}
var successor = cfgNode.ISuccessors.First();
while (!successor.IsLoopHeadNode)
{
if (!successor.IsLoopHeadNode &&
successor.ISuccessors.Count == 0)
{
return false;
}
else
{
successor = successor.ISuccessors.First();
}
}
var backwards = cfgNode.Summary.DataFlowMap.DoesSymbolReset(symbol,
syntaxNode, cfgNode, successor.SyntaxNodes.First(), successor);
var forwards = cfgNode.Summary.DataFlowMap.DoesSymbolReset(symbol,
successor.SyntaxNodes.First(), successor, syntaxNode, cfgNode);
return backwards || forwards;
}
示例8: GetAliases
/// <summary>
/// Returns all possible aliases of the given symbol.
/// </summary>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <returns>Set of aliases</returns>
internal static HashSet<ISymbol> GetAliases(ISymbol symbol, SyntaxNode syntaxNode,
ControlFlowGraphNode cfgNode)
{
HashSet<ISymbol> aliases = new HashSet<ISymbol>();
Dictionary<ISymbol, HashSet<ISymbol>> dataFlowMap = null;
if (!cfgNode.Summary.DataFlowMap.TryGetMapForSyntaxNode(syntaxNode,
cfgNode, out dataFlowMap) || !dataFlowMap.ContainsKey(symbol))
{
return aliases;
}
foreach (var reference in dataFlowMap[symbol].Where(v => !v.Equals(symbol)))
{
aliases.Add(reference);
}
return aliases;
}
示例9: ResetSymbol
/// <summary>
/// Resets the references of the given symbol.
/// </summary>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">CfgNode</param>
internal void ResetSymbol(ISymbol symbol, SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode)
{
if (!this.Map.ContainsKey(cfgNode))
{
this.Map.Add(cfgNode, new Dictionary<SyntaxNode, Dictionary<ISymbol, HashSet<ISymbol>>>());
this.Map[cfgNode].Add(syntaxNode, new Dictionary<ISymbol, HashSet<ISymbol>>());
}
else if (!this.Map[cfgNode].ContainsKey(syntaxNode))
{
this.Map[cfgNode].Add(syntaxNode, new Dictionary<ISymbol, HashSet<ISymbol>>());
}
if (this.Map[cfgNode][syntaxNode].ContainsKey(symbol))
{
this.Map[cfgNode][syntaxNode][symbol] = new HashSet<ISymbol> { symbol };
}
else
{
this.Map[cfgNode][syntaxNode].Add(symbol, new HashSet<ISymbol> { symbol });
}
this.MarkSymbolReassignment(symbol, syntaxNode, cfgNode);
}
示例10: TryCaptureReturnSymbols
/// <summary>
/// Tries to capture potential return symbols.
/// </summary>
/// <param name="returnSymbols">Set of return symbols</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="model">SemanticModel</param>
/// <param name="dataFlowMap">DataFlowMap</param>
private static void TryCaptureReturnSymbols(HashSet<ISymbol> returnSymbols, SyntaxNode syntaxNode,
ControlFlowGraphNode cfgNode, SemanticModel model, DataFlowMap dataFlowMap)
{
Dictionary<ISymbol, HashSet<ISymbol>> map = null;
if (returnSymbols == null ||
!dataFlowMap.TryGetMapForSyntaxNode(syntaxNode, cfgNode, out map))
{
return;
}
Dictionary<ISymbol, int> indexMap = new Dictionary<ISymbol, int>();
var parameterList = cfgNode.Summary.Method.ParameterList.Parameters;
for (int idx = 0; idx < parameterList.Count; idx++)
{
var paramSymbol = model.GetDeclaredSymbol(parameterList[idx]);
indexMap.Add(paramSymbol, idx);
}
foreach (var symbol in returnSymbols)
{
if (symbol.Kind == SymbolKind.Parameter)
{
if (dataFlowMap.DoesSymbolReset(symbol, cfgNode.Summary.Node.SyntaxNodes.
First(), cfgNode.Summary.Node, syntaxNode, cfgNode, true))
{
continue;
}
cfgNode.Summary.ReturnSet.Item1.Add(indexMap[symbol]);
}
else if (symbol.Kind == SymbolKind.Field)
{
cfgNode.Summary.ReturnSet.Item2.Add(symbol as IFieldSymbol);
}
else if (map.ContainsKey(symbol))
{
foreach (var reference in map[symbol].Where(v => v.Kind == SymbolKind.Field))
{
cfgNode.Summary.ReturnSet.Item2.Add(reference as IFieldSymbol);
}
}
}
}
示例11: MapSymbolIfNotExists
/// <summary>
/// Maps the given symbol if its not already mapped.
/// </summary>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">CfgNode</param>
internal void MapSymbolIfNotExists(ISymbol symbol, SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode)
{
if (!this.Map.ContainsKey(cfgNode))
{
this.Map.Add(cfgNode, new Dictionary<SyntaxNode, Dictionary<ISymbol, HashSet<ISymbol>>>());
this.Map[cfgNode].Add(syntaxNode, new Dictionary<ISymbol, HashSet<ISymbol>>());
}
else if (!this.Map[cfgNode].ContainsKey(syntaxNode))
{
this.Map[cfgNode].Add(syntaxNode, new Dictionary<ISymbol, HashSet<ISymbol>>());
}
if (!this.Map[cfgNode][syntaxNode].ContainsKey(symbol))
{
this.Map[cfgNode][syntaxNode][symbol] = new HashSet<ISymbol> { symbol };
}
}
示例12: Print
/// <summary>
/// Prints the data flow map of the given syntax node.
/// </summary>
internal void Print(ControlFlowGraphNode cfgNode)
{
Output.Print("\nPrinting data flow map of cfgNode {0}: ", cfgNode.Id);
if (this.Map.ContainsKey(cfgNode))
{
foreach (var syntaxNode in this.Map[cfgNode])
{
Output.Print(" > syntaxNode: " + syntaxNode.Key);
foreach (var pair in syntaxNode.Value)
{
foreach (var symbol in pair.Value)
{
Output.Print(" " + pair.Key.Name + " ::= " + symbol.Name);
}
}
}
}
}
示例13: MapRefToSymbol
/// <summary>
/// Maps the given reference to the given symbol.
/// </summary>
/// <param name="reference">Reference</param>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">CfgNode</param>
/// <param name="markReset">Should mark symbol as reset</param>
internal void MapRefToSymbol(ISymbol reference, ISymbol symbol, SyntaxNode syntaxNode,
ControlFlowGraphNode cfgNode, bool markReset = true)
{
if (!this.Map.ContainsKey(cfgNode))
{
this.Map.Add(cfgNode, new Dictionary<SyntaxNode, Dictionary<ISymbol, HashSet<ISymbol>>>());
this.Map[cfgNode].Add(syntaxNode, new Dictionary<ISymbol, HashSet<ISymbol>>());
}
else if (!this.Map[cfgNode].ContainsKey(syntaxNode))
{
this.Map[cfgNode].Add(syntaxNode, new Dictionary<ISymbol, HashSet<ISymbol>>());
}
HashSet<ISymbol> additionalRefs = new HashSet<ISymbol>();
if (this.Map[cfgNode][syntaxNode].ContainsKey(reference))
{
foreach (var r in this.Map[cfgNode][syntaxNode][reference])
{
if (!reference.Equals(r))
{
additionalRefs.Add(r);
}
}
}
if (this.Map[cfgNode][syntaxNode].ContainsKey(symbol) && additionalRefs.Count > 0)
{
this.Map[cfgNode][syntaxNode][symbol] = new HashSet<ISymbol>();
}
else if (additionalRefs.Count > 0)
{
this.Map[cfgNode][syntaxNode].Add(symbol, new HashSet<ISymbol>());
}
else if (this.Map[cfgNode][syntaxNode].ContainsKey(symbol))
{
this.Map[cfgNode][syntaxNode][symbol] = new HashSet<ISymbol> { reference };
}
else
{
this.Map[cfgNode][syntaxNode].Add(symbol, new HashSet<ISymbol> { reference });
}
foreach (var r in additionalRefs)
{
this.Map[cfgNode][syntaxNode][symbol].Add(r);
}
if (markReset)
{
this.MarkSymbolReassignment(symbol, syntaxNode, cfgNode);
}
}
示例14: MapReachableFieldsToSymbol
/// <summary>
/// Maps the given set of reachable field symbols to the given symbol.
/// </summary>
/// <param name="fields">Set of field symbols</param>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">CfgNode</param>
internal void MapReachableFieldsToSymbol(HashSet<ISymbol> fields, ISymbol symbol,
SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode)
{
if (!this.ReachabilityMap.ContainsKey(cfgNode))
{
this.ReachabilityMap.Add(cfgNode, new Dictionary<SyntaxNode,
Dictionary<ISymbol, HashSet<ISymbol>>>());
this.ReachabilityMap[cfgNode].Add(syntaxNode, new Dictionary<ISymbol,
HashSet<ISymbol>>());
}
else if (!this.ReachabilityMap[cfgNode].ContainsKey(syntaxNode))
{
this.ReachabilityMap[cfgNode].Add(syntaxNode, new Dictionary<ISymbol,
HashSet<ISymbol>>());
}
if (this.ReachabilityMap[cfgNode][syntaxNode].ContainsKey(symbol))
{
this.ReachabilityMap[cfgNode][syntaxNode][symbol].Clear();
foreach (var reference in fields)
{
this.ReachabilityMap[cfgNode][syntaxNode][symbol].Add(reference);
}
}
else
{
this.ReachabilityMap[cfgNode][syntaxNode].Add(symbol, new HashSet<ISymbol>());
foreach (var reference in fields)
{
this.ReachabilityMap[cfgNode][syntaxNode][symbol].Add(reference);
}
}
}
示例15: MapObjectTypesToSymbol
/// <summary>
/// Maps the given set of object types to the given symbol.
/// </summary>
/// <param name="types">Set of object types</param>
/// <param name="symbol">Symbol</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">CfgNode</param>
internal void MapObjectTypesToSymbol(HashSet<ITypeSymbol> types, ISymbol symbol,
SyntaxNode syntaxNode, ControlFlowGraphNode cfgNode)
{
if (!this.ObjectTypeMap.ContainsKey(cfgNode))
{
this.ObjectTypeMap.Add(cfgNode, new Dictionary<SyntaxNode,
Dictionary<ISymbol, HashSet<ITypeSymbol>>>());
this.ObjectTypeMap[cfgNode].Add(syntaxNode, new Dictionary<ISymbol,
HashSet<ITypeSymbol>>());
}
else if (!this.ObjectTypeMap[cfgNode].ContainsKey(syntaxNode))
{
this.ObjectTypeMap[cfgNode].Add(syntaxNode, new Dictionary<ISymbol,
HashSet<ITypeSymbol>>());
}
if (this.ObjectTypeMap[cfgNode][syntaxNode].ContainsKey(symbol))
{
this.ObjectTypeMap[cfgNode][syntaxNode][symbol].Clear();
foreach (var type in types)
{
this.ObjectTypeMap[cfgNode][syntaxNode][symbol].Add(type);
}
}
else
{
this.ObjectTypeMap[cfgNode][syntaxNode].Add(symbol, new HashSet<ITypeSymbol>());
foreach (var type in types)
{
this.ObjectTypeMap[cfgNode][syntaxNode][symbol].Add(type);
}
}
}