1 前言

现有的自动化警告标记技术主要基于关闭警告的启发式方法进行警告标记,给定同一个项目的多个版本,使用相同的静态分析工具对每个版本进行扫描并得到其扫描结果,通过比对不同版本之间的警告是否相同,如果一个版本中的某个警告 A 存在在后续所有的版本,那么该警告 A 被认为是无效警告(即误报警告),如果一个版本中的某个警告 A 在后续的版本中消失,那么该警告 A 被认为是有效警告(即正报警告)。然后,由于验证延迟(即有些警告会在未来的版本中被修复)或自动化警告标记方法固有的局限性(如:不精确的警告匹配算法),会使得自动化警告标记方法产生较多的噪音(即正报标记为误报,误报被标记为正报)。为了解决上述问题,本项目拟基于置信学习技术对自动化警告标记技术进行去噪,进而改善自动化警告标记技术标记的精度。

2 初始警告數據集收集—-環境配置

基于关闭警告的启发式警告标记方法:https://github.com/lxyeah/findbugs-violations.git,链接中给出了
该方法自动收集警告数据集的源码以及相关软件配置要求,静态分析工具是 SpotBugs。
項目運行環境:

  • Linux (Ubuntu 18.04)
  • Jdk 1.8
  • Maven 3.6.3: 需要更换阿⾥云镜像
  • Neo4J Community 3.5.X: 注意Jdk和Neo4J版本要相互对应,如:最新版本的Neo4J需要Jdk11,Neo4J 3.5.X需要Jdk 1.8

一個個來吧!

2.1 Ubuntu 18.04

  1. https://releases.ubuntu.com/18.04/下載鏡像。
  2. VMware創建虛擬机。


2.2 安裝Jdk 1.8

  1. https://www.oracle.com/java/technologies/downloads/#java8下載安裝包,我下的是x64-Compressed Archive那個。
  2. 下載完压縮包移動到/usr/share/java下,並解压。

    1
    2
    3
    4
    5
    kinghong@kinghong-virtual-machine:~$ cd /usr/share
    kinghong@kinghong-virtual-machine:/usr/share$ sudo mkdir java //沒有的話就創建
    kinghong@kinghong-virtual-machine:/usr/share$ cd java
    kinghong@kinghong-virtual-machine:/usr/share/java$ sudo cp -a /home/kinghong/下载/jdk-8u351-linux-x64.tar.gz/usr/share/java
    kinghong@kinghong-virtual-machine:/usr/share/java$ sudo tar -zxvf jdk-8u351-linux-x64.tar.gz
  3. 輸入sudo gedit ~/.bashrc配置环境变量,在打開的文件最後添加:

    1
    2
    3
    4
    export JAVA_HOME=/usr/share/java/jdk1.8.0_351
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH

    保存文件后輸入source /.bashrc更新配置文件

  4. 輸入java -version查看jdk环境

    1
    2
    3
    4
    kinghong@kinghong-virtual-machine:~$ java -version
    java version "1.8.0_351"
    Java(TM) SE Runtime Environment (build 1.8.0_351-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.351-b10, mixed mode)
  5. 管理员模式也得能找到,把环境变量加在/etc/profile里

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    kinghong@kinghong-virtual-machine:/etc$ sudo chmod -R 777 ./profile
    ####################################################################
    #在文件末尾添加:
    #JAVA_HOME=/usr/share/java/jdk1.8.0_351
    #PATH=$PATH:$JAVA_HOME/bin
    #CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    #export JAVA_HOME
    #export PATH
    #export CLASSPATH
    #####################################################################
    kinghong@kinghong-virtual-machine:/etc$ source ./profile
    kinghong@kinghong-virtual-machine:/etc$ sudo -i
    root@kinghong-virtual-machine:~# java -version
    java version "1.8.0_351"
    Java(TM) SE Runtime Environment (build 1.8.0_351-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.351-b10, mixed mode)

    2.3 安裝Maven3.6.3

  6. 去官网下載Maven: https://archive.apache.org/dist/maven/maven-3

  1. 跟上面一样,找個風水宝地把安裝包放進去,我是放在/usr/local下了,然後解壓安裝。

    1
    2
    kinghong@kinghong-virtual-machine:/usr/local$ sudo tar -zxf apache-maven-3.6.3-bin.tar.gz
    kinghong@kinghong-virtual-machine:/usr/local$ sudo mv apache-maven-3.6.3 /usr/local/maven-3.6.3
  2. 環境变量 sudo ~/.bashrc ,填入

    1
    2
    export M2_HOME=/usr/local/maven-3.6.3
    export PATH=${M2_HOME}/bin:$PATH

    保存,source /.bashrc更新。

  3. 輸 mvn-v 查看版本

    1
    2
    3
    4
    5
    6
    kinghong@kinghong-virtual-machine:/usr/local$ mvn -v
    Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
    Maven home: /usr/local/maven-3.6.3
    Java version: 1.8.0_351, vendor: Oracle Corporation, runtime: /usr/share/java/jdk1.8.0_351/jre
    Default locale: zh_CN, platform encoding: UTF-8
    OS name: "linux", version: "5.4.0-84-generic", arch: "amd64", family: "unix"
  4. 換阿里云鏡像。去安裝目錄下,我是/usr/local/maven-3.6.3,進入conf文件夾,先改一下settings.xml的讀寫权限: sudo chmod 777 ./settings.xml ,然后再打開它,找到標籤,往裏面添加:

    1
    2
    3
    4
    5
    6
    <mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
    </mirror>

    並保存。

    2.4 安裝Neo4j

    Neo4j是基于Java的图形数据库

  5. 官网下載安裝包: https://neo4j.com/download-center/#releases

  6. 找个好地方解压,我還是放/usr/local下:

    1
    2
    3
    kinghong@kinghong-virtual-machine:~$ sudo cp -a /home/kinghong/桌面/neo4j-community-3.5.5-unix.tar.gz /usr/local
    kinghong@kinghong-virtual-machine:~$ cd /usr/local
    kinghong@kinghong-virtual-machine:/usr/local$ sudo tar -zxvf neo4j-community-3.5.5-unix.tar.gz
  7. 运行,這一步有點坑,先進入root模式,再進入文件根目錄,在bin里运行它

    1
    2
    3
    kinghong@kinghong-virtual-machine:~$ sudo -i
    root@kinghong-virtual-machine:~# cd /usr/local/neo4j-community-3.5.5/bin
    root@kinghong-virtual-machine:/usr/local/neo4j-community-3.5.5/bin# ./neo4j console

    运行成功后在浏覽器打開http://localhost:7474/browser/ ,進入web端,默認用戶名和密碼都是”neo4j”。

    至此,環境就配置好了

    3 項目配置

    项⽬结构如下所示,其中violation-collection为本项⽬进⾏配置的警告数据收集部分。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    kinghong@kinghong-virtual-machine:~/文档/findbugs-violations-master$ tree -L 1
    .
    ├── data
    ├── GitTraverse
    ├── gumtree
    ├── Mined Fix Patterns
    ├── Parser
    ├── parsing-utils
    ├── PatternMining
    ├── README.md
    ├── Readme.pdf
    ├── repo-iterator
    ├── simple-utils
    └── violation-collection

    由于violation-collection依赖于simple-utils、repo-iterator、parsing-utils,需要先对这三部分进⾏构建, 最后对violation-collection进⾏构建。

  8. 进⼊這三個⽬录,执⾏”mvn clean install -DskipTests”。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ~/文档/findbugs-violations-master$ cd ./simple-utils
    ~/文档/findbugs-violations-master/simple-utils$ mvn clean install -DskipTests
    ............................................................................
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 50.483 s
    [INFO] Finished at: 2022-11-24T14:09:02+08:00
    [INFO] ------------------------------------------------------------------------
    ~/文档/findbugs-violations-master$ cd ./repo-iterator
    ~/文档/findbugs-violations-master/repo-iterator$ mvn clean install -DiskipTests
    ~/文档/findbugs-violations-master$ cd ./parsing-utils
    ~/文档/findbugs-violations-master/parsing-utils$ mvn clean install -DiskipTests

    构建过程中出現了無法解析依赖的情況,哈哈!樂,環境學院日常,去网上下jar包吧:https://mvnrepository.com/artifact/org.eclipse.core/runtime/3.10.0-v20140318-2214
    https://mvnrepository.com/artifact/org.eclipse.core/org.eclipse.core.runtime/3.10.0.v20140318-2214

    下完后执⾏命令”mvn install:install-file -Dfile=xxxxx.jar -DgroupId=xxxxx -DartifactId=xxxxx - Dversion=xxxxx -Dpackaging=jar”安裝,其中:

  • Dfile: 要安装的jar的本地路径
  • DgroupId:要安装的jar的groupId (org.eclipse.core)
  • DartifactId: 要安装的jar的 artificialId (org.eclipse.core.runtime)
  • Dversion: jar版本 (3.10.0-v20140318-2214)
  • Dpackaging: 打包类型 (jar)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    kinghong@kinghong-virtual-machine:~$ mvn install:install-file -Dfile=/home/kinghong/下载/
    org.eclipse.core.runtime-3.10.0.v20140318-2214.jar -DgroupId=org.eclipse.core -DartifactId=org.eclipse.core.runtime
    -Dversion=3.10.0-v20140318-2214 -Dpackaging=jar
    ........................................................................
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 0.187 s
    [INFO] Finished at: 2022-11-24T14:53:50+08:00
    [INFO] ------------------------------------------------------------------------
    重點來了!!!! 賊坑賊坑的一點是,此刻他仍是說無法解析的,我找了半天才發現原來安裝的時候把文件中間寫成了3.10.0-v20140318-2214,而他的依赖找的是3.10.0.v20140318-2214,所以它找不但找不到,还會自己多創一個文件夾,你得把文件夾和里面文件名上的”-“改成”.”才行。
    好了,接着install又發現沒有org.eclipse.core:org.eclipse.core.contenttype 3.4.200.v20140207-1251 的依赖了,如法炮制去https://mvnrepository.com/artifact/org.eclipse.core/org.eclipse.core.contenttype/3.4.200.v20140207-1251下一個安裝。
    最后终于成功了!
    三個都成功后便进⼊violation-collection⽬录执⾏”mvn clean install -DskipTests”。
  1. 启动neo4j数据库
  2. 创建repoDir和workingDir两个个⽂件夹,其中repoDir存放apache项⽬,workingDir存放⽣成的报告等数 据,⽂件结构如下图所示。

……………………….
人麻了已經,下面每一步都報一堆錯,也是很迷糊一個,等做成功了再來更新好了…搞了一天累死了