本文整理汇总了C#中Microsoft.PSharp.StaticAnalysis.ControlFlowGraphNode类 的典型用法代码示例。如果您正苦于以下问题:C# ControlFlowGraphNode类的具体用法?C# ControlFlowGraphNode怎么用?C# ControlFlowGraphNode使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
ControlFlowGraphNode类 属于Microsoft.PSharp.StaticAnalysis命名空间,在下文中一共展示了ControlFlowGraphNode类 的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的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);
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:19, 代码来源:DataFlowAnalysis.cs
示例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);
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:26, 代码来源:DataFlowAnalysis.cs
示例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;
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:44, 代码来源:DataFlowAnalysis.cs
示例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;
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:29, 代码来源:DataFlowAnalysis.cs
示例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)
//.........这里部分代码省略.........
开发者ID:huangpf, 项目名称:PSharp, 代码行数:101, 代码来源:DataFlowAnalysis.cs
示例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;
}
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:24, 代码来源:DataFlowMap.cs
示例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;
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:41, 代码来源:DataFlowAnalysis.cs
示例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;
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:26, 代码来源:DataFlowAnalysis.cs
示例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);
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:29, 代码来源:DataFlowMap.cs
示例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);
}
}
}
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:51, 代码来源:DataFlowAnalysis.cs
示例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 };
}
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:23, 代码来源:DataFlowMap.cs
示例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);
}
}
}
}
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:21, 代码来源:DataFlowMap.cs
示例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);
}
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:60, 代码来源:DataFlowMap.cs
示例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);
}
}
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:40, 代码来源:DataFlowMap.cs
示例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);
}
}
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:40, 代码来源:DataFlowMap.cs
示例16: TryCaptureParameterAccess
/// <summary>
/// Tries to capture a potential parameter acccess in the given expression.
/// </summary>
/// <param name="expr">Expression</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="dataFlowMap">DataFlowMap</param>
/// <param name="model">SemanticModel</param>
/// <param name="context">AnalysisContext</param>
private static void TryCaptureParameterAccess(ExpressionSyntax expr, SyntaxNode syntaxNode,
ControlFlowGraphNode cfgNode, DataFlowMap dataFlowMap, SemanticModel model,
AnalysisContext context)
{
if (!(expr is MemberAccessExpressionSyntax))
{
return;
}
var name = (expr as MemberAccessExpressionSyntax).Name;
var identifier = context.GetFirstNonMachineIdentifier(expr, model);
if (identifier == null || name == null)
{
return;
}
var type = model.GetTypeInfo(identifier).Type;
if (context.IsTypeAllowedToBeSend(type) ||
context.IsMachineType(type, model) ||
name.Equals(identifier))
{
return;
}
var symbol = model.GetSymbolInfo(identifier).Symbol;
if (symbol == null)
{
return;
}
Dictionary<ISymbol, HashSet<ISymbol>> map = null;
if (!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);
}
if (map.ContainsKey(symbol))
{
foreach (var reference in map[symbol])
{
if (reference.Kind == SymbolKind.Parameter)
{
if (reference.Equals(symbol) && dataFlowMap.DoesSymbolReset(
reference, cfgNode.Summary.Node.SyntaxNodes.First(),
cfgNode.Summary.Node, syntaxNode, cfgNode, true))
{
continue;
}
int index = indexMap[reference];
if (cfgNode.Summary.AccessSet.ContainsKey(index))
{
cfgNode.Summary.AccessSet[index].Add(syntaxNode);
}
else
{
cfgNode.Summary.AccessSet.Add(index, new HashSet<SyntaxNode>());
cfgNode.Summary.AccessSet[index].Add(syntaxNode);
}
}
}
}
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:80, 代码来源:DataFlowAnalysis.cs
示例17: Transfer
/// <summary>
/// Transfers the data flow map from the previous node to the new node.
/// </summary>
/// <param name="previousSyntaxNode">Previous syntaxNode</param>
/// <param name="previousCfgNode">Previous cfgNode</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">CfgNode</param>
internal void Transfer(SyntaxNode previousSyntaxNode, ControlFlowGraphNode previousCfgNode,
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>>());
}
Dictionary<ISymbol, HashSet<ISymbol>> previousMap = null;
if (this.TryGetMapForSyntaxNode(previousSyntaxNode, previousCfgNode, out previousMap))
{
foreach (var pair in previousMap)
{
if (!this.Map[cfgNode][syntaxNode].ContainsKey(pair.Key))
{
this.Map[cfgNode][syntaxNode].Add(pair.Key, new HashSet<ISymbol>());
}
foreach (var reference in pair.Value)
{
this.Map[cfgNode][syntaxNode][pair.Key].Add(reference);
}
}
}
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>>());
}
Dictionary<ISymbol, HashSet<ISymbol>> previousReachabilityMap = null;
if (this.TryGetReachabilityMapForSyntaxNode(previousSyntaxNode, previousCfgNode,
out previousReachabilityMap))
{
foreach (var pair in previousReachabilityMap)
{
if (!this.ReachabilityMap[cfgNode][syntaxNode].ContainsKey(pair.Key))
{
this.ReachabilityMap[cfgNode][syntaxNode].Add(pair.Key, new HashSet<ISymbol>());
}
foreach (var reference in pair.Value)
{
this.ReachabilityMap[cfgNode][syntaxNode][pair.Key].Add(reference);
}
}
}
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>>());
}
Dictionary<ISymbol, HashSet<ITypeSymbol>> previousObjectTypeMap = null;
if (this.TryGetObjectTypeMapForSyntaxNode(previousSyntaxNode, previousCfgNode,
out previousObjectTypeMap))
{
foreach (var pair in previousObjectTypeMap)
{
if (!this.ObjectTypeMap[cfgNode][syntaxNode].ContainsKey(pair.Key))
{
this.ObjectTypeMap[cfgNode][syntaxNode].Add(pair.Key, new HashSet<ITypeSymbol>());
}
foreach (var type in pair.Value)
{
this.ObjectTypeMap[cfgNode][syntaxNode][pair.Key].Add(type);
}
}
}
}
开发者ID:jerickmsft, 项目名称:PSharp, 代码行数:95, 代码来源:DataFlowMap.cs
示例18: TryCaptureFieldAccess
/// <summary>
/// Tries to capture a potential field acccess in the given expression.
/// </summary>
/// <param name="expr">Expression</param>
/// <param name="syntaxNode">SyntaxNode</param>
/// <param name="cfgNode">ControlFlowGraphNode</param>
/// <param name="dataFlowMap">DataFlowMap</param>
/// <param name="model">SemanticModel</param>
/// <param name="context">AnalysisContext</param>
private static void TryCaptureFieldAccess(ExpressionSyntax expr, SyntaxNode syntaxNode,
ControlFlowGraphNode cfgNode, DataFlowMap dataFlowMap, SemanticModel model,
AnalysisContext context)
{
if (!(expr is MemberAccessExpressionSyntax))
{
return;
}
var name = (expr as MemberAccessExpressionSyntax).Name;
var identifier = context.GetFirstNonMachineIdentifier(expr, model);
if (identifier == null || name == null)
{
return;
}
var type = model.GetTypeInfo(identifier).Type;
if (context.IsTypeAllowedToBeSend(type) ||
context.IsMachineType(type, model) ||
name.Equals(identifier))
{
return;
}
var symbol = model.GetSymbolInfo(identifier).Symbol;
var definition = SymbolFinder.FindSourceDefinitionAsync(symbol,
context.Solution).Result;
if (!(definition is IFieldSymbol))
{
return;
}
var fieldDecl = definition.DeclaringSyntaxReferences.First().GetSyntax().
AncestorsAndSelf().OfType<FieldDeclarationSyntax>().First();
if (dataFlowMap.DoesSymbolReset(symbol, cfgNode.Summary.Node.SyntaxNodes.First(),
cfgNode.Summary.Node, syntaxNode, cfgNode, true))
{
return;
}
if (cfgNode.Summary.FieldAccessSet.ContainsKey(symbol as IFieldSymbol))
{
cfgNode.Summary.FieldAccessSet[symbol as IFieldSymbol].Add(syntaxNode);
}
else
{
cfgNode.Summary.FieldAccessSet.Add(symbol as IFieldSymbol, new HashSet<SyntaxNode>());
cfgNode.Summary.FieldAccessSet[symbol as IFieldSymbol].Add(syntaxNode);
}
}
开发者ID:huangpf, 项目名称:PSharp, 代码行数:59, 代码来源:DataFlowAnalysis.cs
示例19: TryGetReachabilityMapForSyntaxNode
六六分期app的软件客服如何联系?不知道吗?加qq群【895510560】即可!标题:六六分期
阅读:18271| 2023-10-27
今天小编告诉大家如何处理win10系统火狐flash插件总是崩溃的问题,可能很多用户都不知
阅读:9677| 2022-11-06
今天小编告诉大家如何对win10系统删除桌面回收站图标进行设置,可能很多用户都不知道
阅读:8179| 2022-11-06
今天小编告诉大家如何对win10系统电脑设置节能降温的设置方法,想必大家都遇到过需要
阅读:8549| 2022-11-06
我们在使用xp系统的过程中,经常需要对xp系统无线网络安装向导设置进行设置,可能很多
阅读:8457| 2022-11-06
今天小编告诉大家如何处理win7系统玩cf老是与主机连接不稳定的问题,可能很多用户都不
阅读:9392| 2022-11-06
电脑对日常生活的重要性小编就不多说了,可是一旦碰到win7系统设置cf烟雾头的问题,很
阅读:8430| 2022-11-06
我们在日常使用电脑的时候,有的小伙伴们可能在打开应用的时候会遇见提示应用程序无法
阅读:7865| 2022-11-06
今天小编告诉大家如何对win7系统打开vcf文件进行设置,可能很多用户都不知道怎么对win
阅读:8414| 2022-11-06
今天小编告诉大家如何对win10系统s4开启USB调试模式进行设置,可能很多用户都不知道怎
阅读:7394| 2022-11-06
请发表评论