More Progress on Json support.

This commit is contained in:
Diego 2018-02-06 20:11:31 -08:00
Родитель 14dbdce955
Коммит d871ca4410
2 изменённых файлов: 69 добавлений и 34 удалений

Просмотреть файл

@ -547,7 +547,13 @@ namespace Backend.Analyses
return instance.Type.TypeEquals(this.iteratorDependencyAnalysis.iteratorClass);
}
private bool ISClousureField(IVariable instance, IFieldReference field)
private bool IsClousureInternalField(IVariable instance, IFieldReference field)
{
return this.iteratorDependencyAnalysis.iteratorClass.Equals(field.ContainingType);
}
private bool ISClousureField(IVariable instance, IFieldReference field)
{
if(SongTaoDependencyAnalysis.IsScopeType(field.Type))
{
@ -780,7 +786,7 @@ namespace Backend.Analyses
// TODO: Check this. I think it is too conservative to add a2[o]
// this is a2[o]
if (SongTaoDependencyAnalysis.IsScopeType(fieldAccess.Instance.Type) || ISClousureField(fieldAccess.Instance, fieldAccess.Field))
if (SongTaoDependencyAnalysis.IsScopeType(fieldAccess.Instance.Type) || IsClousureInternalField(fieldAccess.Instance, fieldAccess.Field))
{
var itState = this.State.IteratorState;
}
@ -804,7 +810,7 @@ namespace Backend.Analyses
// return;
//}
if (traceables.OfType<TraceableJson>().Any())
if (!IsClousureInternalField(fieldAccess.Instance,fieldAccess.Field) && traceables.OfType<TraceableJson>().Any())
{
var jsonTraceables = traceables.OfType<TraceableJson>()
.Select(jsonTraceable => new TraceableJsonField(jsonTraceable.TColumn, fieldAccess.FieldName));
@ -840,6 +846,7 @@ namespace Backend.Analyses
var isReducerField = iteratorClass!=null
&& iteratorClass.ContainingType.TypeEquals(fieldAccess.Field.ContainingType);
// TODO: Hack. I need to check for private fields and properly model
// DIEGODIEGO: I should try to get read of this method
if (ISClousureField(SimplePointsToAnalysis.GlobalVariable, fieldAccess.Field))
// if (isClousureField || isReducerField)
{
@ -912,7 +919,7 @@ namespace Backend.Analyses
var o = fieldAccess.Instance;
var field = fieldAccess.Field;
if (SongTaoDependencyAnalysis.IsScopeType(fieldAccess.Instance.Type) || ISClousureField(fieldAccess.Instance, fieldAccess.Field))
if (SongTaoDependencyAnalysis.IsScopeType(fieldAccess.Instance.Type) || IsClousureInternalField(fieldAccess.Instance, fieldAccess.Field))
{
var itState = this.State.IteratorState;
if (this.iteratorDependencyAnalysis.processToAnalyze.ProcessorClass.GetName() == "ResourceDataTagFlattener")
@ -1188,7 +1195,8 @@ namespace Backend.Analyses
// DIEGODIEGO: Should I handle this as a Pure?
else if (methodInvoked.Name.Value == "SerializeObject")
{
UpdateCall(methodCallStmt);
var arg = methodCallStmt.Arguments[0];
AddJsonColumnFieldToTraceables(methodCallStmt, arg, "*");
return true;
}
}
@ -1215,16 +1223,7 @@ namespace Backend.Analyses
{
var columnLiteral = columRange.Literal;
var jsonFields = this.State.GetTraceables(arg).OfType<TraceableJson>()
.Select(tjs => new TraceableJsonField(tjs.TColumn, columnLiteral));
UpdatePTAForScopeMethod(methodCallStmt);
this.State.AssignTraceables(methodCallStmt.Result, jsonFields);
this.iteratorDependencyAnalysis.InputColumns.AddRange(jsonFields.Where(t => t.TableKind == ProtectedRowKind.Input));
this.iteratorDependencyAnalysis.OutputColumns.AddRange(jsonFields.Where(t => t.TableKind == ProtectedRowKind.Output));
CheckFailure(methodCallStmt, jsonFields);
AddJsonColumnFieldToTraceables(methodCallStmt, arg, columnLiteral);
}
else
{
@ -1235,7 +1234,7 @@ namespace Backend.Analyses
return true; ;
}
}
else if (methodInvoked.ContainingType.GetFullName() == "Newtonsoft.Json.Linq.JToken" || methodInvoked.ContainingType.GetFullName()=="ScopeRuntime.StringColumnData")
else if (methodInvoked.ContainingType.GetFullName() == "Newtonsoft.Json.Linq.JToken" || methodInvoked.ContainingType.GetFullName() == "ScopeRuntime.StringColumnData")
{
if (methodInvoked.Name.Value == @"op_Explicit" || methodInvoked.Name.Value == @"op_Implicit")
{
@ -1244,9 +1243,33 @@ namespace Backend.Analyses
return true; ;
}
}
else if (methodInvoked.ContainingType.GetFullName() == "Microsoft.DataMap.Common.Tag")
{
if (methodInvoked.Name.Value.StartsWith(@"get_"))
{
var arg = methodCallStmt.Arguments[0];
var columName = methodInvoked.Name.Value.Substring(4);
AddJsonColumnFieldToTraceables(methodCallStmt, arg, columName);
return true;
}
}
return false;
}
private void AddJsonColumnFieldToTraceables(MethodCallInstruction methodCallStmt, IVariable arg, string columnLiteral)
{
var jsonFields = this.State.GetTraceables(arg).OfType<TraceableJson>()
.Select(tjs => new TraceableJsonField(tjs.TColumn, columnLiteral));
UpdatePTAForScopeMethod(methodCallStmt);
this.State.AssignTraceables(methodCallStmt.Result, jsonFields);
this.iteratorDependencyAnalysis.InputColumns.AddRange(jsonFields.Where(t => t.TableKind == ProtectedRowKind.Input));
this.iteratorDependencyAnalysis.OutputColumns.AddRange(jsonFields.Where(t => t.TableKind == ProtectedRowKind.Output));
CheckFailure(methodCallStmt, jsonFields);
}
/// <summary>
/// Updates the points-to graph using only the info from parameter
/// TODO: We should actually follow the ideas of our IWACO paper...
@ -1474,7 +1497,7 @@ namespace Backend.Analyses
//|| (methodInvoked.Name.Value == "First" && methodInvoked.ContainingType.IsEnumerable())
)
{
var arg = methodCallStmt.Arguments[0];
var arg = methodCallStmt.Arguments[0];
var traceables = this.State.GetTraceables(arg);
// This method makes method.Result point to the collections item, so automatically getting the traceables from there
bool createdNode;
@ -2394,15 +2417,27 @@ namespace Backend.Analyses
private void InitVariablesWithTaint(DependencyPTGDomain depValues)
{
foreach (var v in cfg.GetVariables())
foreach (var v in cfg.GetVariables())
{
// The framework has problems with type resolution
// This is a workaround until the problem is fix
if (v.Type != null)
{
if (!SongTaoDependencyAnalysis.IsScopeType(v.Type) && !v.IsParameter && !v.Type.IsClassOrStruct())
if (!SongTaoDependencyAnalysis.IsScopeType(v.Type) && !v.IsParameter && (!v.Type.IsClassOrStruct() || v.Type.IsString()))
{
depValues.AssignTraceables(v, new HashSet<Traceable>() { new Other(v.Type.GetName()) });
var varRange = rangeAnalysis.Result[cfg.Exit.Id].Input.GetValue(v);
if (!varRange.IsBottom && !varRange.IsTop)
{
if(varRange.IsString)
depValues.AssignTraceables(v, new HashSet<Traceable>() { new Other(varRange.Literal) });
else
depValues.AssignTraceables(v, new HashSet<Traceable>() { new Other(varRange.LowerBound.ToString()) });
}
else
{
depValues.AssignTraceables(v, new HashSet<Traceable>() { new Other(v.Type.GetName()) });
}
}
}
else

Просмотреть файл

@ -25,13 +25,13 @@ namespace ScopeProgramAnalysis
public string Literal{ get; private set; }
private bool isString;
public bool IsString { get; private set; }
public bool IsTop
{
get
{
return (!isString && LowerBound==int.MinValue && UpperBound==int.MaxValue) || (isString && Literal==STRINGTOP);
return (!IsString && LowerBound==int.MinValue && UpperBound==int.MaxValue) || (IsString && Literal==STRINGTOP);
}
}
@ -39,7 +39,7 @@ namespace ScopeProgramAnalysis
{
get
{
return (!isString && LowerBound == 0 && UpperBound == -1) || (isString && Literal == STRINGBOTTOM);
return (!IsString && LowerBound == 0 && UpperBound == -1) || (IsString && Literal == STRINGBOTTOM);
}
}
@ -48,7 +48,7 @@ namespace ScopeProgramAnalysis
this.LowerBound = singleton;
this.UpperBound = singleton;
this.Literal = null;
this.isString = false;
this.IsString = false;
}
public RangeDomain(int start, int end)
@ -56,7 +56,7 @@ namespace ScopeProgramAnalysis
this.LowerBound = start;
this.UpperBound = end;
this.Literal = null;
this.isString = false;
this.IsString = false;
}
public RangeDomain(string literal)
@ -64,11 +64,11 @@ namespace ScopeProgramAnalysis
this.LowerBound = 0;
this.UpperBound = -1;
this.Literal = literal;
this.isString = true;
this.IsString = true;
}
public RangeDomain Join(RangeDomain oth)
{
if (isString)
if (IsString)
{
return oth.Literal != this.Literal ? new RangeDomain(STRINGTOP) : this;
}
@ -88,7 +88,7 @@ namespace ScopeProgramAnalysis
public RangeDomain Widening(RangeDomain prev)
{
if (isString)
if (IsString)
{
return prev.Literal != this.Literal ? new RangeDomain(STRINGTOP) : this;
}
@ -111,35 +111,35 @@ namespace ScopeProgramAnalysis
public RangeDomain Clone()
{
if (isString) return new RangeDomain(this.Literal);
if (IsString) return new RangeDomain(this.Literal);
return new RangeDomain(this.LowerBound, this.UpperBound);
}
public bool LessEqual(RangeDomain oth)
{
if (isString) return this.Literal==oth.Literal;
if (IsString) return this.Literal==oth.Literal;
return this.LowerBound>=oth.LowerBound && this.UpperBound<=oth.UpperBound;
}
public bool Equals(RangeDomain oth)
{
if (isString) return this.Literal == oth.Literal;
if (IsString) return this.Literal == oth.Literal;
return this.LowerBound==oth.LowerBound && this.UpperBound==oth.UpperBound;
}
public RangeDomain Sum(RangeDomain rangeDomain)
{
if (isString) return this;
if (IsString) return this;
if (IsTop) return this;
return new RangeDomain(this.LowerBound+rangeDomain.LowerBound,this.UpperBound+rangeDomain.UpperBound);
}
public RangeDomain Sub(RangeDomain rangeDomain)
{
if (isString) return this;
if (IsString) return this;
if (IsTop) return this;
return new RangeDomain(this.LowerBound - rangeDomain.LowerBound, this.UpperBound - rangeDomain.UpperBound);
@ -147,7 +147,7 @@ namespace ScopeProgramAnalysis
public override string ToString()
{
if (isString) return this.Literal!=null?$"'{this.Literal}":"_STRING_BOTTOM_";
if (IsString) return this.Literal!=null?$"'{this.Literal}":"_STRING_BOTTOM_";
if (IsTop) return "_TOP_";
if(IsBottom)
return "_BOTTOM_";