Esempio n. 1
0
        private void AnalyseLocalAccessesInRegion(InstrumentationRegion region)
        {
            foreach (var block in region.Implementation().Blocks)
            {
                for (int idx = 0; idx < block.Cmds.Count; idx++)
                {
                    if (!(block.Cmds[idx] is CallCmd))
                    {
                        continue;
                    }

                    var    call = block.Cmds[idx] as CallCmd;
                    bool   isInstrumentedCall = false;
                    string resource           = null;
                    string accessType         = null;

                    if (idx + 1 < block.Cmds.Count && block.Cmds[idx + 1] is AssumeCmd)
                    {
                        isInstrumentedCall = QKeyValue.FindStringAttribute((block.Cmds[idx + 1]
                                                                            as AssumeCmd).Attributes, "captureState") != null;
                        resource = QKeyValue.FindStringAttribute((block.Cmds[idx + 1]
                                                                  as AssumeCmd).Attributes, "resource");
                        accessType = QKeyValue.FindStringAttribute((block.Cmds[idx + 1]
                                                                    as AssumeCmd).Attributes, "access");
                    }

                    if (isInstrumentedCall && resource != null && accessType != null)
                    {
                        if ((this.EP.ForceWriteResource.Contains(resource) && accessType.Equals("write")) ||
                            (this.EP.ForceReadResource.Contains(resource) && accessType.Equals("read")))
                        {
                            continue;
                        }

                        if (call.Ins.Count == 0)
                        {
                            region.TryAddLocalResourceAccess(resource, new LiteralExpr(Token.NoToken, BigNum.FromInt(0)));
                            continue;
                        }

                        HashSet <Expr> ptrExprs = null;
                        var            result   = this.PtrAnalysisCache[region].TryComputeRootPointers(call.Ins[0], out ptrExprs);
                        foreach (var ptrExpr in ptrExprs)
                        {
                            var id = this.PtrAnalysisCache[region].GetIdentifier(ptrExpr);
                            if (result == PointerArithmeticAnalyser.ResultType.Const)
                            {
                                region.TryAddLocalResourceAccess(resource, ptrExpr);
                            }
                            else if (!WhoopCommandLineOptions.Get().CheckInParamAliasing&&
                                     region.FunctionPointers.Any(val => val.Name.Equals(id.Name)))
                            {
                                call.callee = "_NO_OP_$" + this.EP.Name;
                                call.Ins.Clear();
                                call.Outs.Clear();
                            }
                            else if (this.PtrAnalysisCache[region].IsAxiom(id))
                            {
                                if (!this.AC.AxiomAccessesMap.ContainsKey(resource))
                                {
                                    this.AC.AxiomAccessesMap.Add(resource, new HashSet <Expr>());
                                }
                                if (!this.AC.AxiomAccessesMap[resource].Any(val =>
                                                                            val.ToString().Equals(ptrExpr.ToString())))
                                {
                                    this.AC.AxiomAccessesMap[resource].Add(ptrExpr);
                                }
                                region.TryAddLocalResourceAccess(resource, ptrExpr);
                            }
                            else
                            {
                                region.TryAddLocalResourceAccess(resource, ptrExpr);
                            }
                        }

                        if (ptrExprs.Count == 0 && accessType.Equals("write"))
                        {
                            this.EP.ForceWriteResource.Add(resource);
                        }
                        else if (ptrExprs.Count == 0 && accessType.Equals("read"))
                        {
                            this.EP.ForceReadResource.Add(resource);
                        }
                    }
                }
            }
        }