コード例 #1
0
        public static bool areEqual_MethodDefinitionAndCirFunction(MethodDefinition cecilMethodDefintion, ICirFunction cirFunction)
        {
            try
            {
                if (cecilMethodDefintion == null || cirFunction == null)
                {
                    return(false);
                }
                var cirFunctionProperties = new Dictionary <string, object>();
                foreach (var property in DI.reflection.getProperties(cirFunction.GetType()))
                {
                    cirFunctionProperties.Add(property.Name, DI.reflection.getProperty(property.Name, cirFunction));
                    //      DI.log.info("prop: {0} = {1}", property.Name, cirFunctionProperties[property.Name]);
                }

                var methodsCalledInsideMethod = CecilUtils.getMethodsCalledInsideMethod(cecilMethodDefintion);
                var moduleName = (cecilMethodDefintion.DeclaringType.Module != null) ? cecilMethodDefintion.DeclaringType.Module.Assembly.Name.ToString() : "[NullModule]";

                foreach (var property in cirFunctionProperties.Keys)
                {
                    switch (property)
                    {
                    case "FunctionSignature":
                        if (cirFunctionProperties[property].ToString() != String.Format("{0}!{1}", moduleName, cecilMethodDefintion))
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: cirFunction[FunctionSignature]!=cecilMethodDefintion");
                            return(false);
                        }
                        break;

                    case "IsPrivate":
                    case "IsStatic":
                    case "IsConstructor":
                    case "IsUnmanaged":
                    case "IsUnmanagedExport":
                    case "IsVirtual":
                    case "IsSetter":
                    case "IsGetter":
                    case "IsRuntime":
                    case "IsPublic":
                    case "IsPInvokeImpl":
                    case "IsNative":
                    case "IsManaged":
                    case "IsInternalCall":
                    case "IsIL":
                    case "IsAbstract":
                    case "HasSecurity":
                    case "HasBody":
                        if ((bool)cirFunctionProperties[property] !=
                            (bool)DI.reflection.getProperty(property, cecilMethodDefintion))
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: (bool)cirFunctionProperties[" + property +
                                "] != (bool)DI.reflection.getProperty(" + property + ", cecilMethodDefintion)");
                            return(false);
                        }
                        break;

                    case "ParentClass":
                        var cirClass1 = (CirClass)cirFunctionProperties[property];
                        if (cirClass1.Signature != CirFactoryUtils.getTypeUniqueSignatureFromTypeReference(cecilMethodDefintion.DeclaringType))
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: cirFunction[ParentClass]!=cecilMethodDefintion == " + cecilMethodDefintion.DeclaringType.FullName);
                            return(false);
                        }
                        break;

                    case "ParentClassFullName":
                        var parentClassFullName = (string)cirFunctionProperties[property];
                        if (parentClassFullName != cecilMethodDefintion.DeclaringType.FullName)
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: cirFunction[ParentClassFullName]!=cecilMethodDefintion.FullName  " + cecilMethodDefintion.DeclaringType.FullName);
                            return(false);
                        }
                        break;

                    case "ParentClassName":
                        var parentClassName = (string)cirFunctionProperties[property];
                        if (parentClassName != cecilMethodDefintion.DeclaringType.Name)
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: cirFunction[parentClassName]!=cecilMethodDefintion.FullName  " + cecilMethodDefintion.DeclaringType.Name);
                            return(false);
                        }
                        break;

                    case "FunctionParameters":
                        var cirFunctionParameters = (List <ICirFunctionParameter>)cirFunctionProperties[property];
                        if (cecilMethodDefintion.Parameters.Count != cirFunctionParameters.Count)
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: the FunctionParameters count didn't match");
                            return(false);
                        }
                        foreach (ParameterDefinition parameter in cecilMethodDefintion.Parameters)
                        {
                            if (false == ViewHelpers.getCirParameterTypeStringList(cirFunctionParameters).Contains(parameter.ParameterType.FullName))
                            {
                                DI.log.error(
                                    "in areEqual_MethodDefinitionAndCirFunction: the FunctionParameters signatures didn't match");
                                return(false);
                            }
                        }
                        break;

                    case "FunctionsCalledUniqueList":
                        var functionsCalledUniqueList = (List <ICirFunction>)cirFunctionProperties[property];
                        foreach (MethodCalled methodCalled in methodsCalledInsideMethod)
                        {
                            if (false == ViewHelpers.getCirFunctionStringList(functionsCalledUniqueList).Contains(CirFactoryUtils.getFunctionUniqueSignatureFromMethodReference(methodCalled.memberReference)))
                            {
                                DI.log.error(
                                    "in areEqual_MethodDefinitionAndCirFunction: there was a missing function in the FunctionsCalledUniqueList");
                                return(false);
                            }
                        }
                        break;

                    case "FunctionsCalledSequence":
                        var functionsCalledSequence = (List <ICirFunction>)cirFunctionProperties[property];
                        if (functionsCalledSequence.Count != methodsCalledInsideMethod.Count)
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: functionsCalledSequence.Count != methodsCalledInsideMethod.Count");
                            return(false);
                        }
                        for (int i = 0; i < methodsCalledInsideMethod.Count; i++)
                        {
                            if (CirFactoryUtils.getFunctionUniqueSignatureFromMethodReference(methodsCalledInsideMethod[i].memberReference) != ViewHelpers.getCirFunctionStringList(functionsCalledSequence)[i])
                            {
                                DI.log.error(
                                    "in areEqual_MethodDefinitionAndCirFunction: the FunctionsCalledSequence does match");
                                return(false);
                            }
                        }
                        break;

                    case "ReturnType":
                        if (cecilMethodDefintion.ReturnType.ReturnType.FullName != cirFunctionProperties[property].ToString())
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: ReturnType don't match");
                            return(false);
                        }
                        break;

                    case "CecilSignature":
                        if (cecilMethodDefintion.ToString() != cirFunctionProperties[property].ToString())
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: CecilSignature din't match");
                            return(false);
                        }
                        break;

                    case "FunctionNameAndParameters":
                        if (CecilUtils.getMethodNameAndParameters(cecilMethodDefintion) != cirFunctionProperties[property].ToString())
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: FunctionNameAndParameters din't match");
                            return(false);
                        }
                        break;

                    case "FunctionName":
                        if (cecilMethodDefintion.Name != cirFunctionProperties[property].ToString())
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: FunctionName din't match");
                            return(false);
                        }
                        break;

                    case "Module":
                        if (moduleName != cirFunctionProperties[property].ToString())
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: Module din't match");
                            return(false);
                        }
                        break;

                    case "ClassNameFunctionNameAndParameters":
                        var classNameFunctionNameAndParameters         = cirFunctionProperties[property].ToString();
                        var expectedClassNameFunctionNameAndParameters = string.Format("{0}.{1}",
                                                                                       cirFunction.ParentClassFullName,
                                                                                       cirFunction.FunctionNameAndParameters);
                        if (classNameFunctionNameAndParameters != expectedClassNameFunctionNameAndParameters)
                        {
                            DI.log.error(
                                "in areEqual_MethodDefinitionAndCirFunction: classNameFunctionNameAndParameters din't match");
                            return(false);
                        }
                        break;

                    // ignore these ones
                    case "IsSource":
                    case "IsSink":
                    case "FunctionParameterTypes":
                    case "lcfgBasicBlocks":
                    case "SymbolDef":
                    case "ReflectionSignature":
                    case "O2MDbgSignature":
                    case "UsedTypes":
                    case "FunctionIsCalledBy":
                    case "dSsaVariables":
                    case "dVariables":
                    case "HasControlFlowGraph":
                    case "OnlyShowFunctionNameInToString":
                    case "HasBeenProcessedByCirFactory":
                        break;

                    // case "":
                    //break;
                    default:
                        DI.log.error("       property not handled: {0}", property);
                        break;
                    }
                }
                return(true);
            }
            catch (Exception ex)
            {
                DI.log.ex(ex, "in areEqual_MethodDefinitionAndCirFunction", true);
                return(false);
            }
        }