一、前置工作
1.必要环境
centos7系统,root权限,下列所有操作均在centos7桌面版本的root权限下进行
1.1 安装rust
curl --proto ‘=https’ --tlsv1.2 https://sh.rustup.rs -sSf | sh
1.2 安装gmp
yum install gmp-devel
1.3 安装nodejs npm
curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -
yum install -y nodejs
1.4 安装pcre
yum install -y pcre pcre-devel
1.5 需要先安装python3.7以上的python3才能执行下列命令
pip3 install virtualenv
pip3 install virtualenvwrapper
pip3 install pipenv
ln -s /usr/local/python3/bin/pipenv /usr/bin/pipenv
1.6 安装沙盒
yum install epel-release
yum install bubblewrap
yum install ocaml-camlp4-devel
yum install pcre-devel
二、安装ocaml
2.1 安装ocaml
bash -c “sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)”
2.2 安装完成之后初始化
opam init
eval $(opam env)
2.3 安装平台环境
bash < <(curl -sL https://ocaml.org/install-platform.sh)
ocaml-platform
2.4 选择版本
opam switch create 4.14.0
eval $(opam env)
ocaml -version
2.5 安装ocaml-lsp-server 需要gcc 9,先升级gcc再执行下列命令
opam install ocaml-lsp-server ocamlformat
opam user-setup install
2.6 安装semgrep1.19.0依赖
opam install -y alcotest.1.7.0 ANSITerminal.0.8.5 atdgen.2.11.0 atdpy.2.11.0 base.v0.14.3 bloomf.0.2.0 cmdliner.1.2.0 conf-pkg-config.2 ctypes_stubs_js.0.1 dune.3.7.1 dune-glob.3.6.2 easy_logging.0.8.1 easy_logging_yojson.0.8.1 feather.0.3.0 fpath.0.7.3 grain_dypgen.0.2 http-lwt-client.0.2.3 integers_stubs_js.1.0 junit_alcotest.2.0.2 js_of_ocaml.5.1.1 js_of_ocaml-compiler.5.1.1 js_of_ocaml-ppx.5.1.1 logs.0.7.0 lsp.1.7.0 merlin.4.8-414 menhir.20211128 num.1.4 ocamlfind.1.9.6 ocamlformat.0.21.0 ocamlgraph.2.0.0 ocp-indent.1.8.1 ounit2.2.2.7 pcre.7.5.0 parmap.1.2.5 ppxlib.0.25.1 ppx_deriving.5.2.1 ppx_deriving_cmdliner.0.6.0 ppx_hash.v0.14.0 ppx_sexp_conv.v0.14.3 re.1.10.4 stdcompat.19 sexplib.v0.14.0 terminal_size.0.2.0 tsort.2.1.0 uri.4.2.0 utop.2.12.1 uucp.15.0.0 uutf.1.0.3 yaml.3.1.0 yojson.2.0.2 visitors.20210608
三、semgrep源码
3.1 下载semgrep1.19.0源码
https://github.com/returntocorp/semgrep
3.2 进入.gitmodules文件,将url中的项目全部下载并按照path路径安装,再下载项目semgrep-kotlin semgrep-c semgrep-ruby的mj-fix-only-dune分支,将该分支的CST.ml,Boilerplate.ml,Parse.ml文件替换至原分支,其中有些错误需要自己手动修改
3.3 在该languages\tree-sitter-lang\semgrep-hack\lib\scanner.cc文件的文件头加上#include
3.4 进入目录semgrep-1.19.0\interfaces,找到该目录所有同名的atd文件并将其替换
3.5 删除src\core\lang该文件,新建同名目录,将semgrep-1.19.0\cli\src\semgrep\lang该目录下的文件拷贝至新建目录
3.6 下载该项目https://github.com/tree-sitter/tree-sitter至任意目录,进入含有makefile的目录执行 make && make install 命令
3.7 屏蔽解决不了报错的语言,执行dune build会提示,需要一个个文件修改
3.8 在目录semgrep-1.19.0下执行dune build,没有任何错误则编译完成
四、centos7中安装vscode
rpm --import https://packages.microsoft.com/keys/microsoft.asc
sh -c ‘echo -e “[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc” > /etc/yum.repos.d/vscode.repo’
yum check-update
sudo yum install code
在命令行中输入code即可打开vscode
五、调试semgrep
5.1 将debug文件的内容替换为下列命令,LD_LIBRARY_PATH路径替换为自己的路径
set -eu
export LD_LIBRARY_PATH=/data/vscode/semgrep-1.19.0/_build/install/default/lib/stublibs
./scripts/run-ocamldebug.sh ./_build/default/src/main/Main.bc
5.2 在debug文件目录下执行 bash ./debug
5.3 输入命令
set arguments -j 1 --debug -e ‘foo($X, $Y)’ -l java tests/patterns/java/concrete_syntax.java
5.4 输入命令
run
5.5 如无错误则会输出结果
5.6 以下是 OCaml 调试器 ocamldebug 的常用命令:
info modules:列出所有程序模块,有助于获取它们的名称。
break @ []
注意:即使在“up”之后,它始终默认为帧0模块!
有时必须将其放置在前一行才能正常工作。
break [.]:在函数处中断。
必须先运行程序,例如:“r”,“break …”,“g 0”,“r”,“up”…。
有用的断点:OUnit.assert_failure(或Alcotest等效)。
r[un]、s[tep]、n[ext]:类似于 gdb 的程序运行。
bt、frame、up、down:类似于 gdb 的调用堆栈导航。
g[oto] :向前或向后跳转时间。
print
:打印变量。
fin[ish]:运行到当前函数返回。
print *:打印最近的函数结果(例如,在完成后)。
list [startline [endline]]:打印当前位置周围的源代码。
help []:列出命令或有关一个命令的信息。
quit:退出(也可使用 Ctrl-D)。
OCaml 调试器版本为 4.14.0。