private bool TryGetMethodCallWrite(AstToken token, out string name) { //ImplicitCastExpr name = string.Empty; DeclRefExprProperties properties = null; switch (token.Type) { case AstType.MemberExpr when token.properties[0] == "<bound member function type>": name = token.properties[1]; name = name.TrimStart("->").TrimStart("Get"); return(true); case AstType.CXXMemberCallExpr: foreach (var tokenChild in token.children) { if (TryGetMethodCallWrite(tokenChild, out name)) { return(true); } } break; default: break; } return(false); return(false); }
private static IEnumerable <AstToken> GetUsages(DeclRefExprProperties saidMsg, AstToken methodDecl) { return(methodDecl.VisitEnumerable ( x => x.unknownName == "DeclRefExpr" && new DeclRefExprProperties(x).Equals(saidMsg) )); }
private bool TryGetSimpleWriteFromVar(AstToken token, out DeclRefExprProperties properties) { properties = null; switch (token.Type) { case AstType.DeclRefExpr when token.children.Count == 0: properties = new DeclRefExprProperties(token); return(true); // case AstType.CXXOperatorCallExpr when IsPacketShiftExpression(token): case AstType.ImplicitCastExpr: foreach (var tokenChild in token.children) { if (TryGetSimpleWriteFromVar(tokenChild, out properties)) { return(true); } } break; default: break; } return(false); }
private static void ProcessMethod(HashSet <AstType> forbidden, AstToken methodDecl, DeclRefExprProperties saidMsg) { // Should be able to handle all later... var usages = GetUsages(saidMsg, methodDecl).ToList(); foreach (var usage in usages) { var parentsInMethod = usage.parent.TraverseParents() .TakeWhile(x => x != methodDecl) .ToList(); var allOperatorExpressions = parentsInMethod .Where(x => x.Type == AstType.CXXOperatorCallExpr) .Where(x => x.properties.Length == 3 && (x.properties[2] == "<<" || x.properties[2] == "'<<'")) .ToList(); var goodParents = allOperatorExpressions .Where(x => x.children.Count == 3) .ToList(); foreach (var parent in goodParents) { var decl = parent.children[2].VisitEnumerable(x => x.Type == AstType.DeclRefExpr).FirstOrDefault(); if (decl == null) { continue; } var properties = new DeclRefExprProperties(decl); Console.WriteLine($"\t[{properties.InstanceId}] {properties.Name} ({properties.Type})"); var illegalOperation = EnumerableExtensions.TakeWhile(decl.TraverseParents(), x => x != methodDecl).FirstOrDefault(x => forbidden.Contains(x.Type)); if (illegalOperation != null) { Console.WriteLine($"\tIllegal operation - {illegalOperation.Type}"); DebugNodes(decl.TraverseParents().TakeWhile(x => x != methodDecl)); Console.WriteLine(); } } } }
private static void ProcessMethod(HashSet <string> forbidden, AstToken methodDecl) { // var meth = JsonConvert.SerializeObject(methodDecl.AsTokenDto(),Formatting.Indented); var methodName = methodDecl.properties.FirstOrDefault(); Console.WriteLine($"Name: {methodName}"); if (methodName == "SendCS_FINISHSKILL_ACK") { Debugger.Break(); } var saidMsg = GetVariableThatGetsSaid(methodDecl).FirstOrDefault(); if (saidMsg == null) { Console.WriteLine("\tNo message said"); return; } var usages = GetUsages(saidMsg, methodDecl) // .Where(x => x.TraverseParents(true).Any(m => m.name == "MemberExpr" && m.properties.Contains(".SetID"))) .ToList(); foreach (var usage in usages) { //var allParents = usage.parent.TraverseParents().ToList(); var parentsInMethod = EnumerableExtensions.TakeWhile(usage.parent .TraverseParents(), x => x != methodDecl) .ToList(); var goodParents = parentsInMethod .Where(x => x.unknownName == "CXXOperatorCallExpr") .Where(x => x.properties.Length == 3 && (x.properties[2] == "<<" || x.properties[2] == "'<<'")) .Where(x => x.children.Count == 3) .ToList(); foreach (var parent in goodParents) { var decl = parent.children[2].VisitEnumerable(x => x.unknownName == "DeclRefExpr").FirstOrDefault(); if (decl == null) { continue; } var properties = new DeclRefExprProperties(decl); Console.WriteLine($"\t[{properties.InstanceId}] {properties.Name} ({properties.Type})"); var illegalOperation = EnumerableExtensions.TakeWhile(decl.TraverseParents(), x => x != methodDecl).FirstOrDefault(x => forbidden.Contains(x.unknownName)); if (illegalOperation != null) { Console.WriteLine($"\tIllegal operation - {illegalOperation.unknownName}"); DebugNodes(EnumerableExtensions.TakeWhile(decl.TraverseParents(), x => x != methodDecl)); Console.WriteLine(); } } } //var found = new List<AstToken>(); //methodDecl.Visit //( // x => (x.name == "DeclRefExpr" && x.properties[2] == "ParmVar"), // x => found.Add(x) //); //ProcessSetInstruction(methodDecl); //var compounts = found.Select(x => new //{ // Name = x.properties[4], // Type = x.properties[5], // Ast = x //}).ToList(); //foreach (var compount in compounts) //{ // var illegalStatement = compount.Ast.TraverseParents().FirstOrDefault(x => forbidden.Contains(x.name)); // var addition = illegalStatement != null ? $"- Illegal statement found: {illegalStatement.name}" : string.Empty; // Console.WriteLine($"\t{compount.Name} - {compount.Type} {addition}"); // if (addition != string.Empty) // { // //foreach (var cAst in compount.Ast.TraverseParents()) // //{ // // try // // { // // Console.WriteLine(); // // } // // catch (Exception e) // // { // // } // //} // Console.WriteLine(); // Debugger.Break(); // } //} }