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); } } } } }