@@ -43,6 +43,12 @@ def resolve_codeql_database_root(path: str, language: Optional[str] = None) -> s
4343 如果给定路径本身包含 codeql-database.yml,则返回该路径。
4444 如果给定路径不包含,但其子目录(如 python/ 或 cpp/)包含,则返回子目录路径。
4545 如果指定了language,则优先查找名称匹配的子目录。
46+
47+ 支持的格式:
48+ - {path}/codeql-database.yml (直接路径)
49+ - {path}/{language}/codeql-database.yml (例如: db/cpp, db/python, db/java)
50+ - {path}/db-{language}/codeql-database.yml (例如: db-java, db-cpp)
51+ - {path}/db/{language}/codeql-database.yml (例如: projects/CVE-xxx/db/cpp)
4652 """
4753 if not path :
4854 return path
@@ -51,6 +57,7 @@ def resolve_codeql_database_root(path: str, language: Optional[str] = None) -> s
5157 if not db_path .exists ():
5258 return path
5359
60+ # 如果路径本身就是数据库根目录
5461 if (db_path / "codeql-database.yml" ).exists ():
5562 return str (db_path )
5663
@@ -68,27 +75,41 @@ def resolve_codeql_database_root(path: str, language: Optional[str] = None) -> s
6875 target_lang = lang_map .get (lang_lower , lang_lower )
6976
7077 # 尝试查找精确匹配的子目录或 db-{lang} 格式
78+ # 优先级:直接子目录 > db-{lang} > db/{lang}
7179 candidates = [
72- db_path / target_lang ,
73- db_path / f"db-{ target_lang } " ,
74- db_path / f "db/ { target_lang } "
80+ db_path / target_lang , # 例如: db_path/cpp
81+ db_path / f"db-{ target_lang } " , # 例如: db_path/db-cpp
82+ db_path / "db" / target_lang , # 例如: db_path/db/cpp
7583 ]
7684
7785 for candidate in candidates :
7886 if candidate .is_dir () and (candidate / "codeql-database.yml" ).exists ():
7987 return str (candidate )
88+
89+ # 如果没找到,尝试在 db/{lang}/db-{lang} 这样的嵌套结构中查找
90+ nested_candidate = db_path / "db" / target_lang / f"db-{ target_lang } "
91+ if nested_candidate .is_dir () and (nested_candidate / "codeql-database.yml" ).exists ():
92+ return str (nested_candidate )
8093
8194 # 如果没指定语言或没找到特定语言目录,则遍历一级子目录
8295 for subdir in db_path .iterdir ():
8396 if subdir .is_dir () and (subdir / "codeql-database.yml" ).exists ():
8497 return str (subdir )
85-
86- # 尝试深入一层 (例如 db/python/codeql-database.yml)
98+
99+ # 尝试深入一层 (例如 db/python/codeql-database.yml 或 db/cpp/codeql-database.yml )
87100 db_subdir = db_path / "db"
88101 if db_subdir .is_dir ():
102+ # 先检查 db 下的直接子目录
89103 for subdir in db_subdir .iterdir ():
90- if subdir .is_dir () and (subdir / "codeql-database.yml" ).exists ():
104+ if subdir .is_dir () and (subdir / "codeql-database.yml" ).exists ():
91105 return str (subdir )
106+
107+ # 再检查 db/{lang}/db-{lang} 这样的嵌套结构
108+ for lang_subdir in db_subdir .iterdir ():
109+ if lang_subdir .is_dir ():
110+ nested_db = lang_subdir / f"db-{ lang_subdir .name } "
111+ if nested_db .is_dir () and (nested_db / "codeql-database.yml" ).exists ():
112+ return str (nested_db )
92113
93114 except Exception :
94115 pass
@@ -396,8 +417,9 @@ def run_simple_query(query_content: str, database_path: str, language: Optional[
396417 - results (List): 如果成功则包含解析结果,否则为空列表
397418 - result_file (str): 结果文件的路径
398419 """
399- # 在执行前验证数据库
400- is_valid , validation_error = validate_codeql_database (database_path )
420+ # 在执行前验证数据库并解析真正的数据库路径
421+ resolved_database_path = resolve_codeql_database_root (database_path , language )
422+ is_valid , validation_error = validate_codeql_database (resolved_database_path , language )
401423 if not is_valid :
402424 return {
403425 'success' : False ,
@@ -432,6 +454,8 @@ def run_simple_query(query_content: str, database_path: str, language: Optional[
432454 with open (log_file , 'a' , encoding = 'utf-8' ) as f :
433455 f .write (f"\n { '=' * 80 } \n " )
434456 f .write (f"[{ log_timestamp } ] 执行 codeql query run (简单查询)\n " )
457+ f .write (f"原始数据库路径: { database_path } \n " )
458+ f .write (f"解析后数据库路径: { resolved_database_path } \n " )
435459 f .write (f"{ '=' * 80 } \n " )
436460
437461 start_time = time .time ()
@@ -442,7 +466,7 @@ def run_simple_query(query_content: str, database_path: str, language: Optional[
442466 [
443467 'codeql' , 'query' , 'run' ,
444468 str (query_file ),
445- '--database' , database_path ,
469+ '--database' , resolved_database_path ,
446470 f'--output={ str (bqrs_path )} ' ,
447471 ],
448472 stdout = subprocess .PIPE ,
@@ -662,8 +686,9 @@ def execute_codeql_query(query_content: str, database_path: str, language: Optio
662686 - results (List): 如果成功则包含解析结果,否则为空列表
663687 - sarif_path (str): SARIF输出文件的路径
664688 """
665- # 在执行前验证数据库
666- is_valid , validation_error = validate_codeql_database (database_path )
689+ # 在执行前验证数据库并解析真正的数据库路径
690+ resolved_database_path = resolve_codeql_database_root (database_path , language )
691+ is_valid , validation_error = validate_codeql_database (resolved_database_path , language )
667692 if not is_valid :
668693 return {
669694 'success' : False ,
@@ -672,9 +697,9 @@ def execute_codeql_query(query_content: str, database_path: str, language: Optio
672697 'sarif_path' : None ,
673698 }
674699
675- # 如果指定了alert参数,执行简单查询
700+ # 如果指定了alert参数,执行简单查询(使用解析后的路径)
676701 if alert == 'alert' :
677- return run_simple_query (query_content , database_path , language , query_file )
702+ return run_simple_query (query_content , resolved_database_path , language , query_file )
678703
679704 sarif_path : Optional [Path ] = None
680705 try :
@@ -703,6 +728,8 @@ def execute_codeql_query(query_content: str, database_path: str, language: Optio
703728 with open (log_file , 'a' , encoding = 'utf-8' ) as f :
704729 f .write (f"\n { '=' * 80 } \n " )
705730 f .write (f"[{ log_timestamp } ] 执行 codeql database analyze\n " )
731+ f .write (f"原始数据库路径: { database_path } \n " )
732+ f .write (f"解析后数据库路径: { resolved_database_path } \n " )
706733 f .write (f"{ '=' * 80 } \n " )
707734
708735 # 使用`codeql database analyze`执行查询,并使用SARIF v2.1.0输出,添加 --verbose 参数
@@ -711,7 +738,7 @@ def execute_codeql_query(query_content: str, database_path: str, language: Optio
711738 [
712739 'codeql' , 'database' , 'analyze' ,
713740 '--verbose' ,
714- database_path ,
741+ resolved_database_path ,
715742 str (query_file ),
716743 '--rerun' ,
717744 '--format=sarifv2.1.0' ,
@@ -861,8 +888,9 @@ def run_query_and_decode_to_text(
861888 - output (str): 查询输出或错误消息
862889 - result_file (str): 结果文件路径
863890 """
864- # 在执行前验证数据库
865- is_valid , validation_error = validate_codeql_database (database_path )
891+ # 在执行前验证数据库并解析真正的数据库路径
892+ resolved_database_path = resolve_codeql_database_root (database_path , language )
893+ is_valid , validation_error = validate_codeql_database (resolved_database_path , language )
866894 if not is_valid :
867895 return {
868896 'success' : False ,
@@ -885,6 +913,8 @@ def run_query_and_decode_to_text(
885913 with open (log_file , 'a' , encoding = 'utf-8' ) as f :
886914 f .write (f"\n { '=' * 80 } \n " )
887915 f .write (f"[{ log_timestamp } ] 执行 codeql query run\n " )
916+ f .write (f"原始数据库路径: { database_path } \n " )
917+ f .write (f"解析后数据库路径: { resolved_database_path } \n " )
888918 f .write (f"{ '=' * 80 } \n " )
889919
890920 # 执行 codeql query run,添加 --verbose 参数
@@ -894,7 +924,7 @@ def run_query_and_decode_to_text(
894924 'codeql' , 'query' , 'run' ,
895925 '--verbose' ,
896926 str (query_file ),
897- '--database' , database_path ,
927+ '--database' , resolved_database_path ,
898928 f'--output={ str (bqrs_path )} ' ,
899929 ],
900930 stdout = subprocess .PIPE ,
0 commit comments