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());
            }
        }
Exemplo n.º 2
0
        public List <BoogieDeclaration> GetMultiDimArrayLens(VariableDeclaration decl)
        {
            List <BoogieDeclaration> lenVars = new List <BoogieDeclaration>();
            TypeName curType = decl.TypeName;

            List <BoogieType> indTypes = new List <BoogieType>()
            {
                BoogieType.Ref
            };

            int lvl = 0;

            while (curType is Mapping || curType is ArrayTypeName)
            {
                if (curType is Mapping map)
                {
                    curType = map.ValueType;
                    indTypes.Add(TransUtils.GetBoogieTypeFromSolidityTypeName(map.KeyType));
                }
                else if (curType is ArrayTypeName arr)
                {
                    BoogieType mapType  = BoogieType.Int;
                    BoogieType initType = BoogieType.Int;
                    for (int i = indTypes.Count - 1; i >= 0; i--)
                    {
                        initType = mapType;
                        mapType  = new BoogieMapType(indTypes[i], mapType);
                    }

                    if (arr.Length != null && initType is BoogieMapType lenMap)
                    {
                        BoogieFunction initFn = GenerateMultiDimInitFunction(lenMap);
                        lenVars.Add(initFn);
                    }

                    BoogieGlobalVariable lenVar = new BoogieGlobalVariable(new BoogieTypedIdent(GetMultiDimLengthName(decl, lvl), mapType));
                    lenVars.Add(lenVar);

                    curType = arr.BaseType;
                    indTypes.Add(BoogieType.Int);
                }

                lvl++;
            }

            return(lenVars);
        }
        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)));
            }
        }