Example #1
0
    def checkReach(self):
        #check for reachability using inv False (0)
        dinvs = DInvs.mkFalses(self.invdecls)
        inps = Inps()

        #use some initial inps first
        rinps = Miscs.genInitInps(len(self.inpdecls), DTraces.inpMaxV)
        logger.debug("gen {} random inps".format(len(rinps)))
        for inp in rinps:
            inps.add(Inp(inp))

        traces = self.getTraces(inps)
        unreachLocs = [loc for loc in dinvs if loc not in traces]
        if unreachLocs:
            logger.debug("use RT to generate traces for {}".format(','.join(
                map(str, unreachLocs))))
            unreachInvs = DInvs.mkFalses(unreachLocs)
            cInps, _, _ = self.prover.checkRange(unreachInvs, inps=None)
            newInps = self.updateInps(cInps, inps)
            _ = self.getTracesAndUpdate(newInps, traces)

        #remove FALSE invs indicating unreached locs
        for loc in traces:
            assert traces[loc]
            dinvs[loc].clear()

        return dinvs, traces, inps
Example #2
0
    def getInitTraces(self, loc, deg, traces, inps, rate=1.7):
        vs = tuple(self.invdecls[loc])

        terms = Miscs.getTerms([sage.all.var(k) for k in vs], deg)
        template, uks = Miscs.mkTemplate(terms, 0, retCoefVars=True)
        nEqtsNeeded = int(rate * len(uks))
        exprs = traces[loc].instantiate(template, nEqtsNeeded)

        while nEqtsNeeded > len(exprs):
            logger.debug("{}: need more traces ({} eqts, need >= {})".format(
                loc, len(exprs), nEqtsNeeded))
            dinvsFalse = DInvs.mkFalses([loc])
            cInps, _, _ = self.prover.checkRange(dinvsFalse, inps)
            if loc not in cInps:
                logger.warn("{}: cannot generate enough traces".format(loc))
                return

            newInps = Gen.updateInps(cInps, inps)
            newTraces = self.getTracesAndUpdate(newInps, traces)
            if loc not in newTraces:
                logger.warn("I got a bad start and am stuck. Just restart me")
                exit(0)

            logger.debug("obtain {} new traces".format(len(newTraces[loc])))
            newExprs = newTraces[loc].instantiate(template,
                                                  nEqtsNeeded - len(exprs))
            for expr in newExprs:
                assert expr not in exprs
                exprs.add(expr)

        return template, uks, exprs