Exemple #1
0
        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(',')));
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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();
        }