# compliance_composition_analysis **Repository Path**: git4396/compliance_composition_analysis ## Basic Information - **Project Name**: compliance_composition_analysis - **Description**: 开源软件成分分析 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://gitee.com/openharmony-sig/compliance_composition_analysis - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-02-18 - **Last Updated**: 2025-02-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 本仓库于2025年2月22日迁移到GitCode,后续不再更新维护。 请访问[GitCode](https://gitcode.com/openharmony-sig/compliance_composition_analysis)获取最新代码,欢迎大家在新仓库进行贡献和交流。 ## 使用方法 ## 仓库目录结构 ``` #目录结构 |-compliance_composition_analysis | |─doc #其他说明性的材料 | |─src | ├─common_utils | ├─component_identification | │ ├─automated_verification.py #自动化验证成分识别结果 | │ ├─component_detector.py #成分识别核心代码 | │ ├─components.py #调用此脚本,仅实现成分分析功能 | ├─dependency_construction | │ ├─build_dependency.py #构建依赖关系 | │ ├─dependency_construction.py #调用此脚本,实现依赖关系构建功能 | │ ├─extraction_feature_dependency.py #提取源码中依赖信息语句(eg:include) | │ ├─indirect_dependency.py #从源码中识别间接依赖关系语句 | │ ├─partition_module.py #按照成分分析结果,划分目标代码为不同成分模块 | ├─operate_db #数据库有关操作 | ├─ossdb_construction #特征库构建 | │ ├─code_segmentation.py #代码分割 | │ ├─generate_func_origin.py #形成所有开源软件所有函数原始所有者索引 | │ ├─oss_function_mapper.py #形成所有开源软件所有函数索引 | │ ├─generate_verweight.py #形成所有开源软件所有函数版本权重 | │ ├─tpllite_config.py #代码分割时用到的文件 | ├─oss_dataset_construction#初始特征库构建 | │ ├─ccscanner #复用ccscaner | │ ├─clone_oss.py #下载开源软件到本地 | │ ├─detector_by_ccscaner.py | │ ├─detector_by_Centris.py | │ ├─find_deps_address.py | │ ├─preprocessing_oss.py | │ ├─update_localoss.py | │ ├─repository_collection.py #执行此脚本,自动下载、提取开源软件特征,构建初始特征库 | ├─config.yml #配置文件(直接手动修改) ``` ### 1.前期准备 #### 1.1使用环境 - python>=3.9 - [ctags](https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Funiversal-ctags%2Fctags):一个c语言代码索引工具 - windows - Mongodb 5.0.5 #### 1.2工具获取方法 1.如果获取的是tar.gz包,在命令行执行pip命令: ``` pip install xxxxx.tar.gz" ``` 安装好tar.gz包之后,就可以在命令行执行python命令启动脚本,在使用之前,先下载ctags,连接数据库,修改各配置项 2.或者直接解压源码压缩包,下述使用方法变成python xxx.py文件的方式,具体某个功能启动哪个.py文件已经详细说明了 ### 2.使用检测功能 #### 2.1修改配置项 1.切换执行环境 ``` python -m src.change_env_config --env 'component_detector' ``` | 参数 | 类型 | 说明 | 是否必须 | | ----- | ---- | ----------------------------------------------- | -------- | | --env | str | construction_DB,component_detector 只有两种取值 | 是 | 2.修改成分分析运行环境 ``` python -m src.detector_config --ctags_path 'E:\ctags\ctags.exe' --mongo_ip '202.199.6.248' --mongo_port 27017 --mongo_user wsj --mongo_pwd wsj146620 ``` | 参数 | 类型 | 说明 | 是否必须 | | ------------ | ---- | ------------------- | -------- | | --ctags_path | str | ctags.exe的绝对路径 | 是 | | --mongo_ip | str | mongodb的Ip | 是 | | --mongo_port | int | 数据库端口 | 是 | | --mongo_user | str | 用户 | 是 | | -mongo_pwd | str | 密码 | 是 | 3.修改特征库构建的运行环境 ``` python -m src.constructdb_config --ctags_path 等参数 ,详见下表 ``` | 参数 | 类型 | 说明 | 是否必须 | | ----------------- | ---- | --------------------------------------------- | -------- | | --ctags_path | str | ctags.exe的绝对路径 | 是 | | --mongo_ip | str | mongodb的Ip | 是 | | --mongo_port | int | 数据库端口 | 是 | | --mongo_user | str | 用户 | 是 | | -mongo_pwd | str | 密码 | 是 | | --local_data_path | str | 中间文件还有开源软件实体包存放的路径 | 是 | | --github_token | str | 因为会涉及到从github API查数据,所以需要token | 是 | | --gitlab_token | str | 同理 | 是 | | --gitee_token | str | 同理 | 是 | | | | | | 直接修改src/config.yml ```yaml ##config.yml component_detector: ##使用工具进行检测时需要的配置项 ctags_path: E:\ctags\ctags.exe mongodb: ip: localhost port: 27017 pwd: xxxxxxxx user: xxxxx construction_DB: ##构建数据库需要的配置项 ctags_path: E:\ctags\ctags.exe giteetoken: 0866a638c1ac71e02e1bb200f12da15d githubtoken: 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 gitlabtoken: glpat-syvQu3abTy3LiKT3cC3K mongodb: ip: 202.199.6.248 port: 27017 pwd: xxxxxxx user: xxxxx similar_threshold: 50 env: component_detector #当前使用环境,设置为construction_DB构建数据库和成分检测都可以使用 ``` #### 2.2成分分析+依赖关系构建(src/detector.py) ``` python -m src.detector --target_src_path 目标代码的绝对路径 ``` | 参数名称 | 类型 | 说明 | 是否必须 | | ----------------------- | ----- | :----------------------------------------------------------: | -------- | | --target_src_path | str | 需要检测的目标代码绝对路径 | 是 | | --component_output_path | str | 成分分析报告存放的目录路径 eg:C:\Users\USER\Desktop\sample,最后结果命名为:目标代码名称_components.json | 否 | | --deps_output_path | str | 依赖关系构建的结果存放的目录路径eg:C:\Users\USER\Desktop\sample,最后结果命名为:目标代码名称_deps.json | 否 | | --theta | float | 成分分析使用到的参数,表示每个文件有theta比例的函数被复用,默认0.7 | 否 | | --beta | float | 成分分析使用到的参数,表示整个第三方库有beta比例的文件被复用,默认0.6 | 否 | | --cpu | int | 并发执行的进程数,默认8,表示在组件识别分析和依赖关系构建部分的并发进程数量 | 否 | 输出: 如果没有检测出开源成分 ```json components=None depsdata=None ``` 如果检测出开源成分 --components输出格式,注意,components是按行写入文件的,每一行都是一个json,命令行输出的是数组 ```json components=[ { "name": 开源成分名称, "url": 开源成分仓库地址, "version": 开源成分版本, "path": { 目标代码和开源成分有相同代码的路径:[[发生重用的函数开始行号,结束行号,有可能使用的第三方库的文件 路径],[...],[...]] "testcases\\kernel\\fs\\scsi\\ltpscsi\\scsimain.c": [[6779, 6788, "\\testcases\\kernel\\fs\\scsi\\ltpscsi\\scsimain.c"], []...] }, "origin_func_cnt": 3925, 开源成分总函数个数 "feature_func_cnt": 3902, 开源成分经过去重后代表性函数的个数 "used_same": "3116", 目标代码和开源成分一模一样函数的个数 "used_modified": "2", 目标代码和开源成分相似函数的个数 "used_strChange": "False", 目标代码使用开源成分是否发生目录结构更改 "unused": 1, 开源成分中没有被目标代码使用的函数个数 "verify": [["\\tests\\unity\\examples\\example_1\\test\\TestProductionCode.c", "path contain oss name"]], 表示从目标代码的哪些路径可以看出确实引用了开源成分,"path contain oss name"表示引用的类型,是路径中包含开源软件名称 "reliability": 2 #表示该条结果可信度,即目标代码使用该开源成分的可信度 }, { "name": ”url": ........ } ] ``` --depsdata格式 ```json depsdata={ "nodes": [ { "id": "target_code", #节点唯一标识 "repo_name": "third_party_boost" #节点名称 },#这是一个必须存在的节点 { "name": 开源成分名称, "url": 开源成分仓库地址, "version": 开源成分版本, "path": { 目标代码和开源成分有相同代码的路径:[[发生重用的函数开始行号,结束行号,有可能使用的第三方库的文件 路径],[...],[...]] "testcases\\kernel\\fs\\scsi\\ltpscsi\\scsimain.c": [[6779, 6788, "\\testcases\\kernel\\fs\\scsi\\ltpscsi\\scsimain.c"], []...] }, "origin_func_cnt": 3925, 开源成分总函数个数 "feature_func_cnt": 3902, 开源成分经过去重后代表性函数的个数 "used_same": "3116", 目标代码和开源成分一模一样函数的个数 "used_modified": "2", 目标代码和开源成分相似函数的个数 "used_strChange": "False", 目标代码使用开源成分是否发生目录结构更改 "unused": 1, 开源成分中没有被目标代码使用的函数个数 "verify": [["\\tests\\unity\\examples\\example_1\\test\\TestProductionCode.c", "path contain oss name"]], 表示从目标代码的哪些路径可以看出确实引用了开源成分,"path contain oss name"表示引用的类型,是路径中包含开源软件名称 "reliability": 2 #表示该条结果可信度,即目标代码使用该开源成分的可信度 ####以上字段同components### "id": "cpython_2cce877f77af0b0e8e3e4abd241066dc", #节点唯一标识,同name字段 "repo_name": "cpython" #节点名称 }, { "name": ”url": ........ } ] "edges":[ #由目标代码指向开源成分的边格式 { "source": "target_code", "target": "process_18341b731e9fe1551a751360818f10c9" }, #开源成分之间的边格式1 { "source": "thread_b3ae09b9b129ec43dd38f2f420545e0b", "dependency_type": "indirect", #依赖类型 "dependency_statement": { "statement": "class Pred {", "filepath": "third_party_boost\\libs\\fiber\\test\\test_condition_variable_any_dispatch.cpp", "namespace": "" },#依赖语句 "dependency_id": { "feature_type": "class", "name": "Pred", "filepath": "third_party_boost\\libs\\thread\\test\\sync\\conditions\\condition_variable\\wait_for_pred_pass.cpp", "namespace": "", "weight": 2 },#依赖的标识符 "target": "fiber_dd653fd6b2f47ad48c588e18584d3e22" }, #开源成分之间的边格式2 { "source": "cpython_2cce877f77af0b0e8e3e4abd241066dc", "dependency_type": "#include", "dependency_statement": { "statement": "io.h", "filepath": "D:\\wsj\\open-harmony\\harmony_source_repos\\third_party_python\\Modules\\_decimal\\libmpdec\\io.c" },#依赖语句 "dependency_file": "third_party_python\\Modules\\_decimal\\libmpdec\\io.h",#依赖的头文件 "target": "mpdecimal_143f21fc96c1c336a002eafa737e618c" }, ] } ``` 依赖边有3种不同格式,列表说明: | 格式类型 | 适用场景 | source | target | 格式 | dependency_type | | -------- | ------------------------------------------------------------ | ------------------------- | :-----------------------: | ------------------------------------------------------------ | ------------------------------------------------------------ | | 1 | 目标代码和第三方组件的原生边,即便没有检测出有依赖关系,也会有这条边 | Target_code | 第三方组件id | {
"source": "target_code",
"target": "process_18341b731e9fe1551a751360818f10c9"
}, | 没有该字段 | | 2 | 两个模块之间检测出依赖关系 | target_code或第三方组件id | target_code或第三方组件id | {
"source": "cpython_2cce877f77af0b0e8e3e4abd241066dc",
"dependency_type": "#include",
"dependency_statement": {
"statement": "io.h",
"filepath": "D:\\wsj\\open-harmony\\harmony_source_repos\\third_party_python\\Modules\\_decimal\\libmpdec\\io.c"
},#依赖语句
"dependency_file": "third_party_python\\Modules\\_decimal\\libmpdec\\io.h",#依赖的头文件
"target": "mpdecimal_143f21fc96c1c336a002eafa737e618c"
} | #include(表示2模块之间通过include语句依赖),'extern function'(表示2模块之间通过extern关键字 +函数名方式依赖),'extern var'(表示模块之间通过extern关键字+变量名依赖) | | 3 | 两个模块之间检测出依赖关系 | target_code或第三方组件id | target_code或第三方组件id | {
"source": "thread_b3ae09b9b129ec43dd38f2f420545e0b",
"dependency_type": "indirect", #依赖类型
"dependency_statement": {
"statement": "class Pred {",
"filepath": "third_party_boost\\libs\\fiber\\test\\test_condition_variable_any_dispatch.cpp",
"namespace": ""
},#依赖语句
"dependency_id": {
"feature_type": "class",
"name": "Pred",
"filepath": "third_party_boost\\libs\\thread\\test\\sync\\conditions\\condition_variable\\wait_for_pred_pass.cpp",
"namespace": "",
"weight": 2
},#依赖的标识符
"target": "fiber_dd653fd6b2f47ad48c588e18584d3e22"
} | indirect(表示2模块之间间接依赖) | #### 2.3仅成分分析 (src/component_identification/components.py) ``` python -m src.component_identification.components --target_src_path 目标代码绝对路径字符串 --component_output_path 分析报告的存放路径 ``` | 参数名称 | 类型 | 说明 | 是否必须 | | ----------------------- | ----- | :----------------------------------------------------------: | -------- | | --target_src_path | str | 需要检测的目标代码绝对路径 | 是 | | --theta | float | 成分分析使用到的参数,表示每个文件有theta比例的函数被复用,默认0.7 | 否 | | --beta | float | 成分分析使用到的参数,表示整个第三方库有beta比例的文件被复用,默认0.6 | 否 | | --component_output_path | str | 成分分析报告存放的目录路径 eg:C:\Users\USER\Desktop\sample,最后结果命名为:目标代码名称_components.json | 否 | | --cpu | int | 并发执行的进程数,默认8 | 否 | 输出: 如果没有检测出开源成分 ```json components=None ``` 如果检测出开源成分 --components格式,同上 #### 2.4仅组件成分的依赖关系构建(src/dependency_construction/dependency_construction.py) ``` python -m src.dependency_construction.dependency_construction --report_path 成分分析报告绝对路径 --target_src_path 目标代码绝对路径 ``` | 参数名称 | 类型 | 说明 | 是否必须 | | ------------------ | ---- | :----------------------------------------------------------: | -------- | | --target_src_path | str | 需要检测的目标代码绝对路径 | 是 | | --report_path | str | 成分分析报告路径,目标代码名称_components.json | 是 | | --deps_output_path | str | 依赖关系构建的结果存放的目录路径eg:C:\Users\USER\Desktop\sample,最后结果命名为:目标代码名称_deps.json | 否 | | --cpu | int | 并发执行的进程数,默认8 | 否 | 输出depsdata格式,同上 ### 3.特征库构建功能 #### 3.1修改配置项 1.切换执行环境 ``` python -m src.change_env_config --env 'construction_DB' ``` | 参数 | 类型 | 说明 | 是否必须 | | ----- | ---- | ----------------------------------------------- | -------- | | --env | str | construction_DB,component_detector 只有两种取值 | 是 | 2.修改特征库构建的运行环境 ``` python -m src.constructdb_config --ctags_path 等参数 ,详见下表 ``` | 参数 | 类型 | 说明 | 是否必须 | | ----------------- | ---- | --------------------------------------------- | -------- | | --ctags_path | str | ctags.exe的绝对路径 | 是 | | --mongo_ip | str | mongodb的Ip | 是 | | --mongo_port | int | 数据库端口 | 是 | | --mongo_user | str | 用户 | 是 | | -mongo_pwd | str | 密码 | 是 | | --local_data_path | str | 中间文件还有开源软件实体包存放的路径 | 是 | | --github_token | str | 因为会涉及到从github API查数据,所以需要token | 是 | | --gitlab_token | str | 同理 | 是 | | --gitee_token | str | 同理 | 是 | | | | | | 直接修改src/config.yml ```yaml ##config.yml component_detector: ##使用工具进行检测时需要的配置项 ctags_path: E:\ctags\ctags.exe mongodb: ip: localhost port: 27017 pwd: xxxxxxxx user: xxxx construction_DB: ##构建数据库需要的配置项 ctags_path: E:\ctags\ctags.exe giteetoken: 0866a638c1ac71e02e1bb200f12da15d githubtoken: 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 gitlabtoken: glpat-syvQu3abTy3LiKT3cC3K local_data_path: D:\wsj #表示收集到的开源软件还有其他的中间文件存放路径 mongodb: ip: 202.199.6.248 port: 27017 pwd: xxxxxxxx user: xxxx similar_threshold: 50 env: component_detector #当前使用环境,设置为construction_DB构建数据库和成分检测都可以使用 ``` ***3.注意:使用该部分功能时,需要提前建立一个工作目录,即一个文件夹,config.yml中的local_data_path,表示这部分功能的产生的中间文件和其他数据存放的路径*** 该部分功能完整执行后,local_data_path如下图: ![](doc/assets/特征库构建的整体目录.png) #### 3.2新库构建 ##### 3.2.1开源软件签名库构建 1.先将作为出发点的git仓库,像下面的形式写入local_data_path\open-harmony\ossdb_construct\process_oss.jl文件中,这个文件表示需要收集的git仓库 ```json {"name": "libidn", "url": "https://salsa.debian.org/debian/libidn", "source": "debian"} {"name": "libraw1394", "url": "https://github.com/kyrofa/libraw1394", "source": "github"} {"name": "libsndfile", "url": "https://github.com/libsndfile/libsndfile", "source": "vcpkg"} ``` 2.启动下载仓库程序src/oss_dataset_construction/clone_oss.py ``` python -m src.oss_dataset_construction.clone_oss ``` 3.此时上述仓库已经被下载到local_data_path\open-harmony\oss_dataset_repos中,其中local_data_path是需要人为配置的,其他路径中节点名是固定的 ![](doc/assets/实体包存放路径.png) 4.启动src\oss_dataset_construction\repository_collection.py循环收集开源软件,其中需要从互联网上收集数据时使用了方法requests.get(url, proxies=proxy,headers=headers),其中 ``` 我在src/common_utils/utils_file.py代码中直接设定了端口,使用时如果报错,可以关注一下 proxy = { 'http': 'http://127.0.0.1:10809', 'https': 'http://127.0.0.1:10809' } ``` ``` python -m src.oss_dataset_construction.repository_collection --count 收集轮次数字 ``` 5.收集完开源数据后,提取相应特征构建初始签名库,启动src/oss_dataset_construction/preprocessing_oss.py,构建数据库HarmonyOSS.InitialSig,HarmonyOSS.RepoFunction,Harmony.OSSTagInfo ``` python -m src.oss_dataset_construction.preprocessing_oss --cpu 并发执行数,非必要参数,默认是8 ``` ##### 3.2.2开源软件特征库构建 1.1初始签名库构建好后,启动src\ossdb_construction\generate_verweight.py 给每个开源软件每个函数设立权重,为之后版本对比做准备,构建数据库HarmonyOSS.Verweight ``` python -m src.ossdb_construction.generate_verweight ``` 1.2启动src/ossdb_construction/oss_function_mapper.py,这是生成函数索引,获取签名库中所有函数出现的位置,即每个函数都是在哪些oss中出现的(可以中途停掉程序,因为每隔一分钟会记录数据,所以重新启动时会继续上一次的结果),会产生2个local_data_path\open-harmony\component_construct\func_info_all_midres.json,local_data_path\open-harmony\component_construct\func_info_all.json中间文件 ``` python -m src.ossdb_construction.oss_function_mapper --cpu 并发执行数,非必要参数,默认是8 ``` 2.执行 src/ossdb_construction/generate_func_origin.py,这是给每个func找原始oss,用来做代表性特征过滤(可以中途停掉程序,因为每隔一分钟会记录数据,所以重新启动时会继续上一次的结果),会产生2个local_data_path\open-harmony\component_construct\func_origin.json,local_data_path\open-harmony\component_construct\func_origin_all_res.json中间文件 ``` python -m src.ossdb_construction.generate_func_origin ``` 3.执行 src/ossdb_construction/code_segmentation.py 过滤代表行特征,生成最后的特征库HarmonyOSS.Component ``` python -m src.ossdb_construction.code_segmentation --cpu 并发执行数,非必要参数,默认是8 ``` #### 3.3从已有库开始更新 1.首先,要将获取的现成数据库中所有开源软件下载到本地,即读取HarmonyOSS.InitialSig中所有数据,使用git命令将所有软件下载到local_data_path\open-harmony\oss_dataset_repos中,每个软件的文件名命名为对应的sig_full_name 2.更新已有的开源数据集,就是对local_data_path\open-harmony\oss_dataset_repos中已经存在的软件更新,获取新版本,将新版本特征添加到开源软件签名库,执行src/oss_dataset_construction/update_localoss.py ``` python -m src.oss_dataset_construction.update_localoss --cpu 并发执行数,非必要参数,默认是8 ``` 3.如果想向开源软件数据集中添加新软件,打开src/oss_dataset_construction/data_out/process_oss.jl文件,在文末加入想添加的开源软件,如3.1.1节step1-step5 4.每一次对开源软件签名库进行更新后,都要重新执行一遍3.1.2节的step1-step3,即重新生成一遍Verweight,Component库,注意再更新前先将旧的Verweight,Component备份或删除,还需要删除之前执行step1-step3生成的local_data_path\open-harmony\component_construct的4个中间文件,防止更新出错 ### 4.数据库部署 #### 4.1检测功能用到的数据库 | 数据库名.集合名 | 大小 | 说明 | 重要等级 | | ----------------------- | ------- | ---------------------------- | -------------------- | | HarmonyOSS.InitialSig | 2.49G | 开源软件签名库 | 特别重要 | | HarmonyOSS.Component | 1.26G | 开源软件特征库 | 根据InitialSig库生成 | | HarmonyOSS.RepoFunction | 46.24G | 开源软件每个版本对应的函数库 | 特别重要 | | Harmony.OSSTagInfo | 14.93MB | 开源软件版本信息 | 特别重要 | | HarmonyOSS.Verweight | 2.45G | 开源软件每个函数的版本权重 | 根据InitialSig库生成 | - HarmonyOSS.InitialSig - 存储开源软件的签名简明信息 | 字段名称 | 数据库存储类型 | 说明 | | -------------- | -------------- | ------------------------------------------------------------ | | _id | ObjectID | mongodb自动生成的唯一索引 | | sig_full_name | 字符串 | 唯一索引,仓库名_一串字符串(将仓库地址编成了md5哈希值,为了避免同名的情况) | | oss_url | 字符串 | 开源软件地址 | | src_local_path | 字符串 | 开源软件的本地地址 | | sig_info | 二进制 | 开源软件签名 | | ver_cnt | Int32 | 这个oss总的版本数 | | sig_info_cnt | Int32 | 这个oss去重后函数总数 | | repo_name | 字符串 | 开源软件仓库名 | | oss_name | 字符串 | 开源软件在收集平台的名字 | | oss_source | 字符串 | 开源软件的来源 | ```json { "_id": ObjectId("64f861ffac66b4cef6cc03f6"), "sig_full_name": "nyancat_f20f4e14c25df7873fda535d3188df52", "repo_name": "nyancat", "oss_name": "nyancat", "oss_source": "github", "oss_url": "https://github.com/klange/nyancat", "src_local_path": "open-harmony\\oss_dataset_repos\\nyancat_f20f4e14c25df7873fda535d3188df52", "sig_info": BinData(0, "H4sIAP9h+GQC/6WSO25UQRBFkQwS8rAQolH9ursq7E/1AtgB+COPNMKBZzICErKRsMRjv9QzRngCIjqp1nvSubfu7a+vf365ePV0Tpur+/3+5uqwu//8sJw21ze3H4/7w/Xu6rD8WE5vPx13+8Nu/XXxcLN++rZ8WN6fZioOY+YmE5MT9Z4MkZlqhgoE6g3NqRGyZUvCWDLMygCibN7KbLnZWL4H6w1u0xaX3xOeJy2PpzlSAyQFBTDNBJkIG6oKQMHhwICsA6kbcS+CzskBW0gAdy+aW0foq8jd5d3m7l0gFVbkCJhkadCZ0wST0eM6LNC92wQAhEolRgd2sGZdilgKRRJMeoakNpHYQt0rdmnVZ+k2nHLnnsOsWm4MUikBeqIJqc3SkkhhyDxztWT1CbniQg0sdhWCcA+gNHtEwKCdXYso5BJhhjeBPopkHjk2NYjgI99EZdJoZw6rO8jsnZFmGlJNPPDShDjTCHmmHjEj19LG9JTZTUqRPhQMaHLFhOdLSxlgzgWnVZviXh0t7KQwJeETElbFXEUUwUc4G4Q2JOeuSuzURwRwhmSLlWxM0hALtBpMbZEPeDEm9DizFmCEVMBGtmgRVGGwh2BjMUU7b3s8V1PiPb6sJv2rmrxWg3+qKX+ruVxznP+He9H05vG4/QVa3jIEhwMAAA=="), "sig_info_cnt": NumberInt("10"), "ver_cnt": NumberInt("3") } ``` - HarmonyOSS.TagInfo - 存储开源软件的tag信息 - 存储方式 - - | 字段名称 | 数据库存储类型 | 说明 | | ------------- | -------------- | ------------------------------------------------------------ | | _id | ObjectID | mongodb自动生成的唯一索引 | | sig_full_name | 字符串 | 唯一索引,仓库名_一串字符串(将仓库地址编成了md5哈希值,为了避免同名的情况) | | tag_time | 数组 | 存放每个tag的名称和对应的提交时间 | - ```json { "_id": ObjectId("64f861ffac66b4cef6cc03f8"), "sig_full_name": "nyancat_f20f4e14c25df7873fda535d3188df52", "tag_time": [ [ "1.5.2", "2018-08-18 22:40:20" ], [ "1.5.1", "2015-11-23 21:05:00" ], [ "1.5.0", "2015-10-31 14:51:33" ] ] } ``` - HarmonyOSS.RepoFunction - 存储每个oss所提取的每个版本的函数哈希和对应的路径 - 存储方式 - - | 字段名称 | 数据库存储类型 | 说明 | | ----------------- | -------------- | ------------------------------------------------------------ | | _id | ObjectID | mongodb自动生成的唯一索引 | | sig_full_tag_name | 字符串 | 唯一索引,仓库名_一串字符串(将仓库地址编成了md5哈希值,为了避免同名的情况)@@tagname | | tag_func | 二进制 | 每个函数对应的tag和路径 | | file_cnt | Int32 | 该版本下c文件数 | | func_cnt | Int32 | 该版本下函数数量 | - ```json { "_id": ObjectId("64d34ad7d47cc695f527ffb1"), "sig_full_tag_name": "sarmage_db469668e154b03137645f75f2069d09@@master_8be1154", "tag_func": BinData(0, "H4sIANdK02QC/yXJsQrCMBCAYUGHQl/ESZLrJW3G9KoP4OxS0wqBYMGku4tboILn+0rxH7//ufsum3+5dFMIo0t+ukfO5TDe+jmkwbvEH87FdfYh+XVt47jSi8+cTwgkkDrRajSaSNW1bUE3giQQWkAEaRvTgYUOlTSKUBOaqhKgbFOJGltZ45EX3ufiEvtHPx0cv+PhBxROLUmaAAAA"), "file_cnt": NumberInt("1"), "func_cnt": NumberInt("1") } ``` - HarmonyOSS.Component数据库 - 存储最终用来对比的特征 - 存储方式 - - | 字段名称 | 数据库存储类型 | 说明 | | ---------------- | -------------- | ------------------------------------------------------------ | | _id | ObjectID | mongodb自动生成的唯一索引 | | sig_full_name | 字符串 | 唯一索引,仓库名_一串字符串(将仓库地址编成了md5哈希值,为了避免同名的情况) | | oss_url | 字符串 | 开源软件地址 | | src_local_path | 字符串 | 开源软件的本地地址 | | func_feature | 二进制 | 开源软件签名 | | ver_cnt | Int32 | 这个oss总的版本数 | | sig_info_cnt | Int32 | 这个oss去重后函数总数 | | func_feature_cnt | Int32 | 代表性特征函数的总数 | | ave_func | Int32 | 平均每个版本的函数总数 | | repo_name | 字符串 | 开源软件仓库名 | | oss_name | 字符串 | 开源软件在收集平台的名字 | | oss_source | 字符串 | 开源软件的来源 | | metafile | 数组 | 这个开源软件的readme,license,copying的相对路径,用来做后续的自动化验证 | - ```json { "_id": ObjectId("6569da02e13a35860c0b4e81"), "sig_full_name": "sarmage_db469668e154b03137645f75f2069d09", "repo_name": "sarmage", "oss_name": "sarmage", "oss_source": "github", "oss_url": "https://github.com/997678299/sarmage", "src_local_path": "open-harmony\\oss_dataset_repos\\sarmage_db469668e154b03137645f75f2069d09", "sig_info_cnt": NumberInt("1"), "ver_cnt": NumberInt("1"), "func_feature": BinData(0, "H4sIAALaaWUC/yXJTQrCMBBAYUEXQsFzuJJkOmmSZTrVA3gB6U+EQLRg0r0bdwEF0/tK8S2/99zM8+pfKvrRe9tHN95DTsVgr+3k4+D6mL85bbvJ+eiWtQ52oVc+53RCIIbUsLpCXREJKU0NlWLEgdAAInCjdAMGGhRcC8KKUJclA2FUySTWXOIxv/M+7W5tiPZxUZ3lXGD+hMMP3Fbz76AAAAA="), "func_feature_cnt": NumberInt("1"), "ave_func": NumberInt("1"), "metafile": [ "README.md" ] } ``` - HarmonyOSS.Verweight数据库 - 存储最终用来对比的特征 - 存储方式 - - | 字段名称 | 数据库存储类型 | 说明 | | ------------- | -------------- | ------------------------------------------------------------ | | _id | ObjectID | mongodb自动生成的唯一索引 | | sig_full_name | 字符串 | 唯一索引,仓库名_一串字符串(将仓库地址编成了md5哈希值,为了避免同名的情况) | | weight | 二进制 | { func_hash1:0.1, func_hash2:0.5 .......} | | ver_cnt | Int32 | 这个oss总的版本数 | - ```json { "_id": ObjectId("6554853c5187c2e85610386a"), "sig_full_name": "nyancat_f20f4e14c25df7873fda535d3188df52", "weight": BinData(0, "H4sIADyFVGUC/6WSPW4UQRBGLRkkJF+ECNVfd1dFqLu62jk3MMaWVlrZAeuEiIRsMy/H4GJk3IBaZKQ1iIhOZtQjvXr1ffP5xde787NfZ39xfb/d3lzvNvd3Hw/7iw83t1cP292HzfXu8HjYv3r/sNnuNsdPL2+391fHyy+Hd4fX+1VawFx1yMISRO7FEJmpV+hAoDHQggYhW7UijK3C6gwgyhajrVGHzcPl2dPZr1kGICkogGklqEQ4UFUAGs4ABmSdSG7E3gSDSwCO5AF7NK3DEfyUqHAkzmRJlQHOXBaYTM/XaUl2twUACJ1aPhw4wIa5NLGSA0mw6CmRxkJiy9nR0WX0WM1tBlVnr6mqVgeDdCqAUWhBGauNItIYKq/arVg/XL798fj907fzi336DLBcVghSH0BpeWbAoM6hTRRqy+jSTsBnk8qz5qoGGXOmWagtmuPUsUeALHdGWmVKN4mkyxDiSjMFmDxjRu5tzBWlcpi0Jj4VDGhxx4LPtpY2wYIbLuu2JKIHWsqUVJK0hIJdsXYRRYiZXpPQptTqqsRBPjOBUyJb7mNzkeaoJKvB0pH5QDRjwsizegNGKA1sVssSQRUmR84bLKZoz7qeT820/PNOmyn/aqYem8HfzbS/munr/4h/dv3w5ifsK6JJeQMAAA=="), "ver_cnt": NumberInt("3") } ``` ### #### 4.2构建特征库用到的数据库 | 数据库名.集合名 | 大小 | 说明 | 重要等级 | | ---------------- | ------ | ------------------------------------------------------------ | -------- | | HarmonyOSS.OSSDB | 4.19MB | 这是开源软件索引库,保存着从debian,conan等平台收集的开源软件和对应的仓库地址 | 重要 | HarmonyOSS.OSSDB数据库 - 存储着开源软件的名称还有来源,仓库地址等信息,用来构建开源数据集,遇到不在索引库中的开源软件还要添加到数据库内 - 存储方式 - | 字段名称 | 数据库存储类型 | 说明 | | -------------- | -------------- | ------------------------------------------------------------ | | _id | ObjectID | mongodb自动生成的唯一索引 | | oss_name | 字符串 | 开源软件的名称 | | oss_source | 字符串 | 开源软件的来源,例如:github,gitee,buckaroo | | upstream_url | 字符串 | 开源软件仓库地址 | | git_upstream | 布林值 | 开源软件的仓库是否可以直接git,其实放到这个库中的开源软件都是可以直接git的 | | search_count | Int32 | 记录在构建开源数据集的时候,被搜索过多少次,表示是不是被使用比较频繁的开源软件。这不是每个数据都有的字段。 | | is_debian_repo | 布林值 | 这个开源软件的仓库是不是直接使用的debian仓库,这是因为在收集开源软件时debian平台的软件包没有提供真实的上游仓库,但是提供了debian仓库,debian仓库不会更改软件源码所以可以被收集,但是后续处理版本时会有差别,所以需要额外记录一下。这不是每个数据都有的字段。 | - 存储示例 ```json { "_id": ObjectId("646b593e0b09f4ec5a10838a"), "oss_name": "naga", "oss_source": "debian", "upstream_url": "https://salsa.debian.org/java-team/naga", "git_upstream": true, "is_debian_repo": true, "search_count": NumberInt("65") } ```