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()
# 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)