# 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如下图:

#### 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是需要人为配置的,其他路径中节点名是固定的

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")
}
```