欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > python实现使用命令行进行testbed静态分析

python实现使用命令行进行testbed静态分析

2024/10/23 23:29:35 来源:https://blog.csdn.net/Lhj0616/article/details/139637857  浏览:    关键词:python实现使用命令行进行testbed静态分析

日后再更新,
详见代码:

from pathlib import Path
import subprocess
import logging
import shutil
from concurrent.futures import ThreadPoolExecutor, as_completed
from typing import Dict# 配置
SET_NAME = "test_project"
CD = Path(r"C:\LDRA_Workarea\Examples\C_testbed_examples\Code_review")
SET_TCF = CD / f"{SET_NAME}.tcf"
PRJ_NAME = "test_project"
COMPILER = "MinGW200 GCC C/C++ v3.2"
TBED = Path(r"C:\LDRA_Toolsuite")
WORKSPACE = Path("C:/")
WORKAREA_BASEDIR = WORKSPACE / "LDRA_Workarea"
TOOL = TBED / "contestbed"
WORK_DIR = WORKAREA_BASEDIR / f"{PRJ_NAME}_tbwrkfls"
SRC_FILES = SET_TCF
TEST_DIR = Path("test_cases")
REPORT_FILE = Path("test_report.txt")
LOG_FILE = Path("test_log.txt")
MAX_WORKERS = 4  # 最大并发线程数# 配置日志
logging.basicConfig(filename=LOG_FILE, level=logging.DEBUG,format='%(asctime)s - %(levelname)s - %(message)s')# 规则描述
RULE_DESCRIPTIONS: Dict[str, str] = {"rule_12": "THEN/ELSE中的语句没有用大括号括起来","rule_29": "使用-=或+=操作符","rule_39": "函数非结构化","rule_45": "禁止使用未初始化的变量","rule_52": "禁止使用宏定义常量","rule_60": "禁止在循环中使用魔数","rule_75": "禁止使用裸指针","rule_88": "禁止在构造函数中抛出异常","rule_95": "禁止使用goto语句","rule_101": "禁止在头文件中定义变量","rule_112": "禁止在switch语句中省略default分支","rule_120": "禁止使用sizeof来获取动态数组大小"
}def create_tcf_file():"""创建 tcf 文件并写入初始内容"""with SET_TCF.open('w') as f:f.write("# Begin Testbed Set\n\n")f.write("    SET_TYPE = SYSTEM\n")f.write(f"    SET_NAME = {SET_NAME}\n")f.write("    GENERATED_BY = SCRIPT\n\n")f.write("    # Begin Source Files\n\n")# 遍历 .c 文件for c_file in CD.rglob("*.c"):file_name = c_file.stemif not file_name.startswith("inszt_"):f.write(f"       File = {c_file}\n")f.write("\n    # End Source Files\n\n")f.write("    # Begin Sysearch Include File Entries\n\n")# 检查当前目录是否包含 .h 文件if any(CD.glob("*.h")):f.write(f"       SearchPath = {CD}\n")# 遍历包含 .h 文件的目录for dir in CD.rglob("*"):if dir.is_dir() and any(dir.glob("*.h")):f.write(f"       SearchPath = {dir}\n")f.write("\n    # End Sysearch Include File Entries\n\n")f.write("    # Begin Sysppvar Preprocessor Macros\n\n")f.write("\n    # End Sysppvar Preprocessor Macros\n\n")f.write("# End Testbed Set\n\n")f.write("# Begin Options\n\n")f.write(". $ Options for static analysis\n")f.write("    include = True\n")f.write("    open_all_includes = False\n")f.write("    shorten = True\n")f.write("    cstandards_model = MISRA-C:2012/AMD2\n")f.write("    cexternal_standard = MISRA-C:2012/AMD2\n\n")f.write("# End Options\n\n")print(f"{SET_TCF} 文件已生成")def setup_environment():"""设置环境,包括删除和创建工作目录,配置编译器等。"""try:# 删除和创建工作目录if WORK_DIR.exists():shutil.rmtree(WORK_DIR)WORK_DIR.mkdir(parents=True, exist_ok=True)# 配置编译器和其他选项subprocess.run(['start', '/wait', '/min', str(TBED / "TBini"), f'COMPILER_SELECTED={COMPILER}'], shell=True, check=True)subprocess.run(['start', '/wait', '/min', str(TBED / "TBini"), 'SYSPPVAR_FILE=C:/config_file/sysppvar.dat'], shell=True, check=True)subprocess.run(['start', '/wait', '/min', str(TBED / "TBini"), 'CM_ADD_VERSION_TO_REPORTS=TRUE'], shell=True, check=True)subprocess.run(['start', '/wait', '/min', str(TBED / "TBini"), f'WORKAREA_BASEDIR={WORKAREA_BASEDIR}'], shell=True, check=True)logging.info("环境设置完成")return Trueexcept subprocess.CalledProcessError as e:logging.error(f"环境设置失败: {e}")return Falsedef run_static_analysis():"""运行静态分析工具"""try:# 运行静态分析subprocess.run([str(TOOL), str(SRC_FILES), '/112a34021q'], check=True)# 生成报告result_file = WORK_DIR / f"{PRJ_NAME}.ldra"output_file = WORKAREA_BASEDIR / f"{PRJ_NAME}.xrc.txt"subprocess.run([str(TBED / "TBglhapi"), f"result={result_file}", "flags=2", f"output={output_file}"], check=True)logging.info("静态分析完成")except subprocess.CalledProcessError as e:logging.error(f"静态分析失败: {e.stderr}")def generate_report():"""生成测试报告"""with REPORT_FILE.open('w') as report:result_file = WORKAREA_BASEDIR / f"{PRJ_NAME}.xrc.txt"if result_file.exists():with result_file.open('r') as f:report.write(f.read())else:report.write("静态分析报告未生成")logging.info(f"报告已生成: {REPORT_FILE}")def main():try:logging.info("开始创建 tcf 文件")create_tcf_file()logging.info("开始设置环境")if not setup_environment():raise RuntimeError("环境设置失败")logging.info("开始静态分析")run_static_analysis()logging.info("开始生成报告")generate_report()except Exception as e:logging.error(f"脚本运行失败: {e}")if __name__ == "__main__":main()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com