示例#1
0
        public ValidEvents AnalyzeAssignmentExprSyntax(IEnumerable <CryptoSignature> cryptoMethods, CryslJsonModel cryslModel, SyntaxNodeAnalysisContext context, ISymbol leftExprSymbol)
        {
            ValidEvents          validEvents          = new ValidEvents();
            MethodSignatureModel methodSignatureModel = new MethodSignatureModel
            {
                MethodName = leftExprSymbol.Name.ToString()
            };
            List <MethodSignatureModel> methodSignatureModelsList = new List <MethodSignatureModel>();

            methodSignatureModelsList.Add(methodSignatureModel);

            //Iterate through all the satisfied crypto signatures
            foreach (var cryptoMethod in cryptoMethods)
            {
                Dictionary <string, List <MethodSignatureModel> > validEventsDict = new Dictionary <string, List <MethodSignatureModel> >();
                validEventsDict.Add(cryptoMethod.Event_Var_Name, methodSignatureModelsList);
                validEvents.IsValidEvent    = true;
                validEvents.AggregatorName  = cryptoMethod.Event_Var_Name;
                validEvents.ValidEventsDict = validEventsDict;
                if (cryptoMethod.Is_property)
                {
                    validEvents.IsProperty   = true;
                    validEvents.PropertyName = cryptoMethod.Object_variable;
                }
            }

            return(validEvents);
        }
示例#2
0
        /// <summary>
        /// Analyze thr MemberAcessExpressionSyntax Nodes
        /// </summary>
        /// <param name="memberAccessExpressions"></param>
        /// <param name="cryslData"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public ValidEvents AnalyzeMemAccessExprSyntax(IdentifierNameSyntax identifier, IEnumerable <CryptoSignature> cryptoMethods, Methods methods, CryslJsonModel cryslData, SyntaxNodeAnalysisContext context, IMethodSymbol identifierSymbolInfo, TextSpan nodeSPan)
        {
            ValidEvents validEvents = new ValidEvents();

            // Check for valid event only if Identifier is of Spec type in Crysl.
            if (identifierSymbolInfo.ReturnType.ToString().Equals(cryslData.Spec_Section.Class_Name))
            {
                List <MethodSignatureModel> methodSignatureModelsList = new List <MethodSignatureModel>();
                foreach (var method in cryptoMethods)
                {
                    ICommonUtilities commonUtilities = serviceProvider.GetService <ICommonUtilities>();
                    //Check if the Event is Valid
                    bool isValidEvent = commonUtilities.IsMethodInEvents(method, identifierSymbolInfo, cryslData.Object_Section.Objects_Declaration);
                    if (isValidEvent)
                    {
                        MethodSignatureModel currentValidEvent = new MethodSignatureModel
                        {
                            MethodName = identifierSymbolInfo.Name,
                            Parameters = method.Argument_types,
                        };
                        methodSignatureModelsList.Add(currentValidEvent);
                        //Go to the Containing Method Declaration Node
                        var containingMethodDeclarationNode = identifier.FirstAncestorOrSelf <MethodDeclarationSyntax>();
                        var invExprSyntaxWalker             = new InvocationExpressionSyntaxWalker(cryslData, context, nodeSPan);
                        //Walk through the current method to find all invocations of the given type
                        invExprSyntaxWalker.Visit(containingMethodDeclarationNode);
                        Dictionary <string, List <MethodSignatureModel> > validEventsDict = invExprSyntaxWalker.GetMethodsList();
                        if (!validEventsDict.ContainsKey(method.Event_Var_Name))
                        {
                            validEventsDict.Add(method.Event_Var_Name, methodSignatureModelsList);
                        }
                        //If there are two events of same type
                        else if (validEventsDict.ContainsKey(method.Event_Var_Name))
                        {
                            foreach (var methodSig in validEventsDict.Values)
                            {
                                methodSignatureModelsList.AddRange(methodSig);
                            }
                            validEventsDict[method.Event_Var_Name] = methodSignatureModelsList;
                        }
                        //Check if the Aggregator Condition Satisfies
                        bool isAggregatorCondition = commonUtilities.CheckAggregator(validEventsDict, methods.Aggregator.Aggregators);
                        if (isAggregatorCondition)
                        {
                            validEvents.IsValidEvent    = true;
                            validEvents.ValidEventsDict = validEventsDict;
                            validEvents.AggregatorName  = methods.Aggregator.Aggregator_Name;
                        }
                        else
                        {
                            validEvents.IsValidEvent = false;
                        }

                        return(validEvents);
                    }
                }
            }
            validEvents.IsValidEvent = false;
            return(validEvents);
        }
        /// <summary>
        /// Visit InvocationExpressions for a Given MethodDeclarationSyntax Node.
        /// </summary>
        /// <param name="invocationExpressionNode"></param>
        /// <returns></returns>
        public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            if (!node.Span.Equals(nodeLocation))
            {
                var identifierNode = node.ChildNodes().OfType <IdentifierNameSyntax>();
                foreach (var identifier in identifierNode)
                {
                    var result = _cryslSpecificationModel.Event_Section.Methods.Select(x => x.Crypto_Signature
                                                                                       .Where(y => y.Method_Name.ToString().Equals(identifier.Identifier.Value.ToString())));
                    foreach (var methods in _cryslSpecificationModel.Event_Section.Methods)
                    {
                        // Check if method signature matches with the method signature defined in events section of the Crysl.
                        var cryptoMethods = methods.Crypto_Signature.Select(y => y).Where(x => x.Method_Name.ToString().Equals(identifier.Identifier.Value.ToString()));
                        if (cryptoMethods.Count() > 0)
                        {
                            if (_context.SemanticModel.GetSymbolInfo(identifier).Symbol.Kind.Equals(SymbolKind.Method))
                            {
                                var identifierSymbolInfo = (IMethodSymbol)_context.SemanticModel.GetSymbolInfo(identifier).Symbol;
                                // Check for valid event only if Identifier is of Spec type in Crysl.
                                if (identifierSymbolInfo.ReturnType.ToString().Equals(_cryslSpecificationModel.Spec_Section.Class_Name))
                                {
                                    List <MethodSignatureModel> methodSignatureModelsList = new List <MethodSignatureModel>();
                                    foreach (var method in cryptoMethods)
                                    {
                                        ICommonUtilities commonUtilities = serviceProvider.GetService <ICommonUtilities>();
                                        bool             isValidEvent    = commonUtilities.IsMethodInEvents(method, identifierSymbolInfo, _cryslSpecificationModel.Object_Section.Objects_Declaration);

                                        if (isValidEvent)
                                        {
                                            MethodSignatureModel methodSignatureModel = new MethodSignatureModel
                                            {
                                                MethodName = identifierSymbolInfo.Name,
                                                Parameters = method.Argument_types
                                            };
                                            methodSignatureModelsList.Add(methodSignatureModel);

                                            if (!methodSignatureDict.ContainsKey(method.Event_Var_Name))
                                            {
                                                methodSignatureDict.Add(method.Event_Var_Name, methodSignatureModelsList);
                                            }
                                            else
                                            {
                                                methodSignatureDict[method.Event_Var_Name] = methodSignatureModelsList;
                                            }

                                            /*methodSignatureList.Add(method.Event_Var_Name, new MethodSignatureModel
                                             * {
                                             *  MethodName = identifierSymbolInfo.Name,
                                             *  Parameters = method.Argument_types
                                             * });*/
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }