private string ArrayOffsetString(Model Model, string StateName, Variable AccessHasOccurredVar, Variable AccessOffsetVar, string RaceyArraySourceName) { Model.Number OffsetElement = (RaceInstrumentationUtil.RaceCheckingMethod == RaceCheckingMethod.ORIGINAL ? GetStateFromModel(StateName, Model).TryGet(AccessOffsetVar.Name) : Model.TryGetFunc(AccessOffsetVar.Name).GetConstant()) as Model.Number; return(GetArrayAccess(ParseOffset(OffsetElement), RaceyArraySourceName, Convert.ToUInt32(QKeyValue.FindIntAttribute(AccessHasOccurredVar.Attributes, "elem_width", -1)), Convert.ToUInt32(QKeyValue.FindIntAttribute(AccessHasOccurredVar.Attributes, "source_elem_width", -1)), QKeyValue.FindStringAttribute(AccessHasOccurredVar.Attributes, "source_dimensions").Split(','))); }
private long ParseOffset(Model.Number modelOffset) { ulong offset = Convert.ToUInt64(modelOffset.Numeral); if (offset >= BigInteger.Pow(2, size_t_bits - 1)) { return((long)(offset - BigInteger.Pow(2, size_t_bits))); } else { return((long)offset); } }
private void ReportFailingArrayBounds(AssertCounterexample err) { PopulateModelWithStatesIfNecessary(err); string state = GetStateName(err); string arrayName = QKeyValue.FindStringAttribute(err.FailingAssert.Attributes, "array_name"); Model.Number ArrayOffset = GetStateFromModel(state, err.Model).TryGet("_ARRAY_OFFSET_" + arrayName) as Model.Number; Axiom arrayInfo = GetOriginalProgram().Axioms.Where(Item => QKeyValue.FindStringAttribute(Item.Attributes, "array_info") == arrayName).ElementAt(0); string arrayAccess = GetArrayAccess(ParseOffset(ArrayOffset), QKeyValue.FindStringAttribute(arrayInfo.Attributes, "source_name"), Convert.ToUInt32(QKeyValue.FindIntAttribute(arrayInfo.Attributes, "elem_width", -1)), Convert.ToUInt32(QKeyValue.FindIntAttribute(arrayInfo.Attributes, "source_elem_width", -1)), QKeyValue.FindStringAttribute(arrayInfo.Attributes, "source_dimensions").Split(',')); var sli = new SourceLocationInfo(GetAttributes(err.FailingAssert), GetSourceFileName(), err.FailingAssert.tok); ErrorWriteLine(sli.Top() + ":", "possible array out-of-bounds access on array " + arrayAccess + " by " + ThreadDetails(err.Model, 2, false) + ":", ErrorMsgType.Error); sli.PrintStackTrace(); Console.Error.WriteLine(); }