예제 #1
0
    def test_spo_proofs(self,delaytest=False):
        """Run analysis and check if the analysis results match the expected results.

        Skip the checking if delaytest is True.
        """

        self.testresults.set_sevs()
        for creffile in self.get_cref_files():
            creffilename = creffile.name
            cfilefilename = UF.get_cfile_filename(self.tgtxpath,creffilename)
            if not os.path.isfile(cfilefilename):
                raise XmlFileNotFoundError(cfilefilename)
            capp = CApplication(self.sempath,cfilename=creffilename,contractpath=self.contractpath)
            cappfile = capp.get_single_file()
            if creffile.has_domains():
                for d in creffile.get_domains():
                    am = AnalysisManager(capp,onefile=True,verbose=self.verbose)
                    am.generate_and_check_file(creffilename,d)
            cappfile.reinitialize_tables()
            spos = cappfile.get_spos()
            if delaytest: continue
            for cfun in creffile.get_functions():
                fname = cfun.name
                funspos = [ spo for spo in spos if spo.cfun.name == fname ]
                refspos = cfun.get_spos()
                self.check_spo_proofs(creffilename,cfun,funspos,refspos)
예제 #2
0
    def test_ppo_proofs(self,delaytest=False):
        """Run analysis and check if analysis results match expected results.

        Skip checking results if delaytest is true.
        """

        if not os.path.isfile(self.config.canalyzer):
            raise AnalyzerMissingError(self.config.canalyzer)
        
        self.testresults.set_pevs()
        for creffile in self.get_cref_files():
            cfilename = creffile.name
            cfilefilename = UF.get_cfile_filename(self.tgtxpath,cfilename)
            if not os.path.isfile(cfilefilename):
                raise XmlFileNotFoundError(cfilefilename)
            capp = CApplication(self.sempath,cfilename=cfilename,contractpath=self.contractpath)
            cfile = capp.get_single_file()
            # only generate invariants if required
            if creffile.has_domains():
                for d in creffile.get_domains():
                    am = AnalysisManager(capp,onefile=True,verbose=self.verbose)
                    am.generate_and_check_file(cfilename,d)
            cfile.reinitialize_tables()
            ppos = cfile.get_ppos()
            if delaytest: continue
            for cfun in creffile.get_functions():
                fname = cfun.name
                funppos = [ ppo for ppo in ppos if ppo.cfun.name == fname ]
                refppos = cfun.get_ppos()
                self.check_ppo_proofs(cfilename,cfun,funppos,refppos)
예제 #3
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()
예제 #4
0
    def test_ppos(self):
        """Create primary proof obligations and check if created as expected."""

        if not os.path.isfile(self.config.canalyzer):
            raise AnalyzerMissingError(self.config.canalyzer)
        self.testresults.set_ppos()
        saved = False
        try:
            for creffile in self.get_cref_files():
                creffilename = creffile.name
                creffilefilename = UF.get_cfile_filename(self.tgtxpath,creffilename)
                if not os.path.isfile(creffilefilename):
                    raise XmlFileNotFoundError(creffilefilename)
                capp = CApplication(self.sempath,cfilename=creffilename,contractpath=self.contractpath)
                am = AnalysisManager(capp,onefile=True,verbose=self.verbose)
                am.create_file_primary_proofobligations(creffilename)
                cfile = capp.get_single_file()
                capp.collect_post_assumes()
                ppos = cfile.get_ppos()
                for creffun in creffile.get_functions():
                    fname = creffun.name
                    cfun = cfile.get_function_by_name(fname)
                    if self.saveref:
                        if creffun.has_ppos():
                            print('Ppos not created for ' + fname + ' (delete first)')
                        else:
                            self.create_reference_ppos(creffilename,fname,cfun.get_ppos())
                            saved = True
                    else:
                        refppos = creffun.get_ppos()
                        funppos = [ ppo for ppo in ppos if ppo.cfun.name == fname ]
                        if len(refppos) == len(funppos):
                            self.testresults.add_ppo_count_success(creffilename,fname)
                            self.check_ppos(creffilename,fname,funppos,refppos)
                        else:
                            self.testresults.add_ppo_count_error(
                                creffilename,fname,len(funppos),len(refppos))
                            raise FunctionPPOError(creffilename + ':' + fname)
        except FunctionPPOError as detail:
            self.print_test_results()
            print('Function PPO error: ' + str(detail))
            exit()
        if self.saveref and saved:
            self.testsetref.save()
            exit()