| 37 | |
| 38 | |
| 39 | def clean_the_origin_output(origin_output:Dict) -> Dict: |
| 40 | sig_vul_map = {} |
| 41 | for file_, file_data_ in origin_output.items(): |
| 42 | for contract_, contract_data_ in file_data_.items(): |
| 43 | for functionA_, functionA_data_ in contract_data_.items(): |
| 44 | # visit ONLY FUNCTION first |
| 45 | self_vul = set() |
| 46 | if "__ONLY_FUNCTION__" in functionA_data_: |
| 47 | for vul_type in functionA_data_["__ONLY_FUNCTION__"]: |
| 48 | if "StaticAnalysis" in functionA_data_["__ONLY_FUNCTION__"][vul_type] and functionA_data_["__ONLY_FUNCTION__"][vul_type]["StaticAnalysis"] != False: |
| 49 | self_vul.add(vul_type) |
| 50 | sig_vul_map[f"{file_}!!!{contract_}!!!{functionA_}"] = self_vul |
| 51 | |
| 52 | to_remove = {} |
| 53 | |
| 54 | for file_, file_data_ in origin_output.items(): |
| 55 | for contract_, contract_data_ in file_data_.items(): |
| 56 | for functionA_, functionA_data_ in contract_data_.items(): |
| 57 | for functionB_sig_, functionB_data_ in functionA_data_.items(): |
| 58 | if functionB_sig_ == "__ONLY_FUNCTION__": |
| 59 | continue |
| 60 | for vul_type in functionB_data_: |
| 61 | if "StaticAnalysis" in functionB_data_[vul_type] and functionB_data_[vul_type]["StaticAnalysis"] != False: |
| 62 | if f"{file_}!!!{contract_}!!!{functionA_}" in sig_vul_map and vul_type in sig_vul_map[f"{file_}!!!{contract_}!!!{functionA_}"]: |
| 63 | to_remove[f"{file_}!!!{contract_}!!!{functionA_}!!!{functionB_sig_}!!!{vul_type}"] = True |
| 64 | logger.info(f"Remove the redundant result: {file_}!!!{contract_}!!!{functionA_}!!!{functionB_sig_}!!!{vul_type}") |
| 65 | elif functionB_sig_ in sig_vul_map and vul_type in sig_vul_map[functionB_sig_]: |
| 66 | to_remove[f"{file_}!!!{contract_}!!!{functionA_}!!!{functionB_sig_}!!!{vul_type}"] = True |
| 67 | logger.info(f"Remove the redundant result: {file_}!!!{contract_}!!!{functionA_}!!!{functionB_sig_}!!!{vul_type}") |
| 68 | |
| 69 | # remove the redundant result |
| 70 | for file_, file_data_ in origin_output.copy().items(): |
| 71 | for contract_, contract_data_ in file_data_.copy().items(): |
| 72 | for functionA_, functionA_data_ in contract_data_.copy().items(): |
| 73 | for functionB_sig_, functionB_data_ in functionA_data_.copy().items(): |
| 74 | if f"{file_}!!!{contract_}!!!{functionA_}!!!{functionB_sig_}!!!{vul_type}" in to_remove: |
| 75 | origin_output[file_][contract_][functionA_].pop(functionB_sig_) |
| 76 | |
| 77 | return origin_output |
| 78 | |
| 79 | |
| 80 | def convert_output(origin_output:Dict, scan_rules:List[Dict], cg:CallGraph, base_dir:str) -> Dict: |