ลิขสิทธิ์ (c) 2023 Jiacai Cui [email protected]
นี่คือกรอบการวิเคราะห์แบบคงที่ CPP แบบง่าย ๆ ที่พัฒนาขึ้นระหว่างหลักสูตรห้องปฏิบัติการวิศวกรรมซอฟต์แวร์ของมหาวิทยาลัยหนานจิง
โครงการเป็นส่วนบุคคลและแจกจ่ายภายใต้ใบอนุญาตสาธารณะ GNU ทั่วไป
การออกแบบโครงการนี้ได้รับแรงบันดาลใจจาก Tai-E ซึ่งเป็นกรอบการวิเคราะห์แบบคงที่สำหรับ Java โปรดดูรายงานเทคนิคสำหรับรายละเอียดเพิ่มเติม
เครื่องวิเคราะห์แบบคงที่ CPP นี้ใช้เสียงดังกราวเป็นส่วนหน้า ดังนั้นคุณต้องติดตั้ง LLVM และ Clang บนระบบท้องถิ่นของคุณเพื่อสร้างและเรียกใช้โครงการนี้ มันได้รับการพัฒนาภายใต้ LLVM 16.0.2 ทดสอบภายใต้ LLVM 16.0.2 และ 17.0.0 แต่รุ่นล่าสุดก็ควรจะโอเคเช่นกัน
ขอแนะนำให้ติดตั้ง LLVM โดยใช้ไบนารีที่คอมไพล์ล่วงหน้าแทนที่จะสร้างจากแหล่งที่มาด้วยตนเอง
นี่คือวิธีการตั้งค่าสภาพแวดล้อมที่เหมาะสมของโครงการนี้
ใช้ Homebrew เป็นผู้จัดการแพ็คเกจ Run
brew install cmake ninja llvm doxygenจากนั้นตรวจสอบ CMake, Ninja, LLVM และ Clang โดย clang โดย cmake
cmake --version
ninja --version
llvm-config --version
clang --version
doxygen --versionใช้แหล่งข้อมูล LLVM APT Run
sudo apt update
sudo apt install lsb-release wget software-properties-common gnupg zlib1g zlib1g-dev git cmake ninja-build build-essential doxygen graphviz
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
./llvm.sh 17 allจากนั้นตรวจสอบ CMake, Ninja, LLVM และ Clang โดย clang โดย cmake
cmake --version
ninja --version
clang-17 --version
llvm-config-17 --version
doxygen --versiongit clone https://github.com/JacyCui/cpp-static-analyzer.gitในไดเรกทอรีรากของโครงการรัน
mkdir build
cd build
cmake -G=Ninja ..
ninjaหลังจากรวบรวม ในไดเรกทอรีรากของโครงการ รัน
./build/tests/testsจากนั้นคุณควรเห็นบางอย่างเช่นด้านล่างซึ่งหมายถึงการทดสอบการทดสอบ 627 จะผ่านไปแล้ว
# a lot of log information here ...
===============================================================================
[doctest] test cases: 35 | 35 passed | 0 failed | 0 skipped
[doctest] assertions: 627 | 627 passed | 0 failed |
[doctest] Status: SUCCESS !หลังจากรวบรวม ในไดเรกทอรีรากของโครงการ รัน
./build/tools/reaching-definition-analyzer --source-dir=resources/dataflow/ReachDef สิ่งนี้จะเรียกใช้การวิเคราะห์คำจำกัดความที่เข้าถึงได้สำหรับไฟล์ต้นฉบับทั้งหมดในไดเรกทอรี resources/dataflow/ReachDef
./build/tools/reaching-definition-analyzer --help
A Simple CPP Reaching Definition Static Analyzer
Copyright (c) 2023-2023
Usage: ./build/tools/reaching-definition-analyzer/reaching-definition-analyzer [OPTIONS]
Options:
-h,--help Print this help message and exit
-S,--source-dir TEXT REQUIRED
directory of all source files
-I,--include-dir TEXT directory of all header files
--std,--standard TEXT c++ language standard (support all standards that clang supports)ในทำนองเดียวกัน ในไดเรกทอรีรากของโครงการ รัน
./build/tools/live-variable-analyzer --source-dir=resources/dataflow/LiveVar สิ่งนี้จะเรียกใช้การวิเคราะห์ตัวแปรสดสำหรับไฟล์ต้นฉบับทั้งหมดในไดเรกทอรี resources/dataflow/LiveVar
./build/tools/live-variable-analyzer --help
A Simple CPP Live Variable Static Analyzer
Copyright (c) 2023-2023
Usage: ./build/tools/live-variable-analyzer [OPTIONS]
Options:
-h,--help Print this help message and exit
-S,--source-dir TEXT REQUIRED
directory of all source files
-I,--include-dir TEXT directory of all header files
--std,--standard TEXT c++ language standard (support all standards that clang supports)ขั้นตอนที่ 01 : ใช้ที่เก็บนี้เป็นแหล่งเก็บข้อมูลของที่เก็บโครงการของคุณ
git submodule add https://github.com/JacyCui/cpp-static-analyzer.git path/to/put/this/project ขั้นตอนที่ 02 : ลิงก์ไปยัง libanalyzer ในคุณ CMakeLists.txt
# suppose your target is called your_target
add_subdirectory ( path /to/put/this/project)
target_include_directories (your_target
PUBLIC path /to/put/this/project/ include
)
target_link_libraries (your_target
libanalyzer
)ขั้นตอนที่ 03 : ใช้ APIs ที่ให้ไว้ที่นี่ในซอร์สโค้ดของคุณ การใช้ตัวอย่างมีให้ในการทดสอบคำจำกัดความ
คุณสามารถสร้างเอกสาร HTML Doxygen API ในท้องถิ่น ในไดเรกทอรีบิล
# in the build directory
ninja libanalyzer-api-doc และคุณจะพบเอกสาร HTML ของคุณอยู่ที่ไดเรกทอรี build/docs/api-doc/html
คุณสามารถอ่านได้โดยเปิด build/docs/api-doc/html/index.html ในเว็บเบราว์เซอร์ท้องถิ่นของคุณ
โปรดทราบว่าเอกสารไม่รวมอยู่ในเป้าหมายการสร้างเริ่มต้น
คุณต้องสร้างมันอย่างชัดเจนเช่นข้างต้นหากคุณต้องการอ่าน