コード例 #1
0
        private void GenerateFunctions()
        {
            context.Program.AddDeclaration(GenerateConstToRefFunction());
            context.Program.AddDeclaration(GenerateRefToInt());
            context.Program.AddDeclaration(GenerateModFunction());
            context.Program.AddDeclaration(GenerateKeccakFunction());
            context.Program.AddDeclaration(GenerateAbiEncodedFunctionOneArg());
            context.Program.AddDeclaration(GenerateVeriSolSumFunction());
            context.Program.AddDeclaration(GenerateAbiEncodedFunctionTwoArgs());
            context.Program.AddDeclaration(GenerateAbiEncodedFunctionOneArgRef());
            context.Program.AddDeclaration(GenerateAbiEncodedFunctionTwoArgsOneRef());

            if (context.TranslateFlags.QuantFreeAllocs)
            {
                if (context.TranslateFlags.UseMultiDim)
                {
                    foreach (VariableDeclaration decl in context.Analysis.Alias.getResults())
                    {
                        TypeName type = decl.TypeName;
                        if (type is Mapping || type is ArrayTypeName)
                        {
                            BoogieFunction initFn = MapArrayHelper.GenerateMultiDimZeroFunction(decl);

                            if (!context.initFns.Contains(initFn.Name))
                            {
                                context.Program.AddDeclaration(initFn);
                                context.initFns.Add(initFn.Name);
                            }
                        }
                    }
                }
                else
                {
                    context.Program.AddDeclaration(GenerateZeroRefIntArrayFunction());
                    context.Program.AddDeclaration(GenerateZeroIntIntArrayFunction());
                    context.Program.AddDeclaration(GenerateZeroRefBoolArrayFunction());
                    context.Program.AddDeclaration(GenerateZeroIntBoolArrayFunction());
                    context.Program.AddDeclaration(GenerateZeroRefRefArrayFunction());
                    context.Program.AddDeclaration(GenerateZeroIntRefArrayFunction());
                }
            }

            if (context.TranslateFlags.NoNonlinearArith)
            {
                context.Program.AddDeclaration(generateNonlinearMulFunction());
                context.Program.AddDeclaration(generateNonlinearDivFunction());
                context.Program.AddDeclaration(generateNonlinearPowFunction());
                context.Program.AddDeclaration(generateNonlinearModFunction());
            }
        }
コード例 #2
0
        private void GenerateSingleMemoryVariable(VariableDeclaration decl, BoogieType keyType, BoogieType valType, HashSet <String> generatedMaps)
        {
            BoogieMapType map = new BoogieMapType(keyType, valType);

            map = new BoogieMapType(BoogieType.Ref, map);

            string name = mapHelper.GetMemoryMapName(decl, keyType, valType);

            if (!generatedMaps.Contains(name))
            {
                BoogieFunction initFn = MapArrayHelper.GenerateMultiDimZeroFunction(keyType, valType);
                if (!context.initFns.Contains(initFn.Name))
                {
                    context.initFns.Add(initFn.Name);
                    context.Program.AddDeclaration(initFn);
                }

                generatedMaps.Add(name);
                context.Program.AddDeclaration(new BoogieGlobalVariable(new BoogieTypedIdent(name, map)));
            }
        }