Пример #1
0
    def test_spos(self,delaytest=False):
        """Run analysis and check if all expected spos are created."""

        try:
            for creffile in self.get_cref_files():
                self.testresults.set_spos()
                cfilename = creffile.name
                cfilefilename = UF.get_cfile_filename(self.tgtxpath,cfilename)
                if not os.path.isfile(cfilefilename):
                    raise XmlFileNotFoundError(xfilefilename)
                capp = CApplication(self.sempath,cfilename=cfilename,contractpath=self.contractpath)
                cappfile = capp.get_single_file()
                capp.update_spos()
                capp.collect_post_assumes()
                spos = cappfile.get_spos()
                if delaytest: continue
                for cfun in creffile.get_functions():
                    fname = cfun.name
                    if self.saveref:
                        if cfun.has_spos():
                            print('Spos not created for ' + fname + ' in ' + cfilename +
                                      ' (delete first)')
                        else:
                            self.create_reference_spos(cfilename,fname,spos[fname])
                    else:
                        refspos = cfun.get_spos()
                        funspos = [ spo for spo in spos if spo.cfun.name == fname ]
                        if funspos is None and len(refspos) == 0:
                            self.testresults.add_spo_count_success(cfilename,fname)
                            
                        elif len(refspos) == len(funspos):
                            self.testresults.add_spo_count_success(cfilename,fname)
                            self.check_spos(cfilename,fname,funspos,refspos)
                        else:
                            self.testresults.add_spo_count_error(
                                cfilename,fname,len(funspos),len(refspos))
                            raise FunctionSPOError(cfilename + ':' + fname + ' (' + str(len(funspos)) + ')')
        except FunctionSPOError as detail:
            self.print_test_results()
            print('')
            print('*' * 80)
            print('Function SPO error: ' + str(detail))
            print('*' * 80)
            exit()
        if self.saveref:
            self.testsetref.save()
            exit()
Пример #2
0
    # assume wordsize of 64
    # use unreachability as a means of proof obligation discharge
    am = AnalysisManager(capp,
                         wordsize=args.wordsize,
                         unreachability=True,
                         thirdpartysummaries=[UF.get_juliet_summaries()])

    with timing('analysis of ' + args.path):

        am.create_app_primary_proofobligations(processes=args.maxprocesses)
        capp.collect_post_assumes()

        for i in range(1):
            am.generate_and_check_app('llrvisp', processes=args.maxprocesses)
            capp.reinitialize_tables()
            capp.update_spos()

        for i in range(5):
            capp.update_spos()
            am.generate_and_check_app('llrvisp', processes=args.maxprocesses)
            capp.reinitialize_tables()

    def filefilter(filename):
        return (not (filename in ["io", "main_linux", "std_thread"]))

    with timing('summarize'):

        contractviolations = capp.get_contract_condition_violations()
        if len(contractviolations) > 0:
            print(' --> ' + str(len(contractviolations)) +
                  ' contract violations in ' + args.path)