一个完全开源的,有力的解决方案,用于修改和生成C ++源代码。减少C ++项目中的样板代码量。
主项目页面:https://blockspacer.github.io/flex_docs/
在Ubuntu 20.04.2 Lts上进行了测试。
可能会在其他经过少量修改的平台上工作。
为了添加依赖项遥控器列表,请键入以下命令:
cmake -E time conan config install conan/remotes/
# OR:
# cmake -E time conan config install conan/remotes_disabled_ssl/ 安装指南
柯南包
注意:使用LLVM构建使用可能需要几个小时。
下面的命令使用--profile clang12_compiler12_compiler 。
示例柯南个人资料~/.conan/profiles/clang :
[ settings ]
# We are building in Ubuntu Linux
os_build=Linux
os=Linux
arch_build=x86_64
arch=x86_64
compiler=clang
compiler.version=10
compiler.libcxx=libstdc++11
[ env ]
CC=/usr/bin/clang-10
CXX=/usr/bin/clang++-10
[ build_requires ]
cmake_installer/3.15.5@conan/stable创建Clang12_compiler配置文件:
[settings]
# We are building in Ubuntu Linux
os_build=Linux
os=Linux
arch_build=x86_64
arch=x86_64
compiler=clang
compiler.version=12
compiler.libcxx=libstdc++11
compiler.cppstd=17
llvm_9:build_type=Release
[env]
CC=/usr/bin/clang-12
CXX=/usr/bin/clang++-12
[build_requires]
cmake_installer/3.15.5@conan/stable在创建Conan配置文件之前,请参见:https://docs.conan.io/en/latest/using_packages/using_profiles.html。
我们使用.cmake脚本下载和安装柯南软件包。
git clone https://github.com/blockspacer/conan_github_downloader.git ~ /conan_github_downloader
cmake
-DSCRIPT_PATH= " $PWD /get_conan_dependencies.cmake "
-DENABLE_CLING=TRUE
-DENABLE_LLVM=TRUE
-DENABLE_LLVM_INSTALLER=FALSE
-DEXTRA_CONAN_OPTS= " --profile;clang12_compiler
;-s;build_type=Debug
;-s;cling_conan:build_type=Release
;-s;llvm_12:build_type=Release
;--build;missing "
-P ~ /conan_github_downloader/conan_github_downloader.cmake
# clean build cache
conan remove " * " --build --force如果要将Flextool及其插件安装在单个命令中,请将提供的选项更改为tools/buildConanThirdparty.cmake 。
注意: tools/buildConanThirdparty.cmake将执行完整的重建;可能需要几个小时。
下面的命令使用--profile clang12_compiler12_compiler 。在创建Conan配置文件之前,请参见:https://docs.conan.io/en/latest/using_packages/using_profiles.html。
我们使用buildConanThirdparty.cmake脚本下载和安装Conan软件包。
注意:set -DENABLE_CLING=FALSE如果您已经使用tools/buildConanThirdparty.cmake安装了固定。
git clone https://github.com/blockspacer/conan_github_downloader.git ~ /conan_github_downloader
cmake
-DSCRIPT_PATH= " $PWD /get_conan_dependencies.cmake "
-DENABLE_CLING=TRUE
-DENABLE_LLVM=TRUE
-DENABLE_LLVM_INSTALLER=FALSE
-DENABLE_FLEXTOOL=TRUE
-DENABLE_BASIS_PLUGIN_HELPER=TRUE
-DENABLE_FLEX_REFLECT_PLUGIN=TRUE
-DENABLE_SQUARETS=TRUE
-DENABLE_FLEX_SQUARETS_PLUGIN=TRUE
-DENABLE_FLEX_PIMPL_PLUGIN=TRUE
-DENABLE_FLEX_TYPECLASS_PLUGIN=TRUE
-DENABLE_FLEX_META_PLUGIN=TRUE
-DENABLE_FLEX_META_DEMO=TRUE
-DEXTRA_CONAN_OPTS= " --profile;clang12_compiler
;-s;build_type=Debug
;-s;cling_conan:build_type=Release
;-s;llvm_12:build_type=Release
;--build;missing "
-P ~ /conan_github_downloader/conan_github_downloader.cmake
# clean build cache
conan remove " * " --build --force在下面使用命令重新构建Flextool(必须单独安装插件)。
下面的命令使用--profile clang12_compiler12_compiler 。在创建Conan配置文件之前,请参见:https://docs.conan.io/en/latest/using_packages/using_profiles.html
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
# NOTE: change `build_type=Debug` to `build_type=Release` in production
# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`
cmake -E time
conan create . conan/stable
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
--profile clang12_compiler
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
# clean build cache
conan remove " * " --build --forcecompile_commands.json不兼容使用Flextool时禁用编译数据库的生成。
如果使用CMAKE,请将CMAKE_EXPORT_COMPILE_COMMANDS设置为FALSE 。
如果compile_commands.json存在于构建文件夹(或父文件夹)中,则Flextool可能会失败。
由于Flexferrum的autoprogrammer ,该项目是可能的。
有关Flexferrum在媒体中的autoprogrammer的文章:
find . -type f -name " *_buildflags.h " -exec rm {} ;
find . -type f -name " *_buildflags.tmp " -exec rm {} ;
(rm -rf local_build || true)
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
export PKG_NAME=flextool/master@conan/stable
(CONAN_REVISIONS_ENABLED=1
conan remove --force $PKG_NAME || true)
# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`
cmake -E time
conan install .
--install-folder local_build
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_12:build_type=Release
-o openssl:shared=True
-e basis:enable_tests=True
-o chromium_base:shared=True
-e chromium_base:enable_tests=True
-o perfetto:is_hermetic_clang=False
--profile clang12_compiler
-e flexlib:enable_tests=True
-o flexlib:shared=False
-o perfetto:is_hermetic_clang=False
-o flexlib:enable_cling=True
-e flextool:enable_tests=True
-o flextool:enable_cling=True
(rm local_build/CMakeCache.txt || true)
cmake -E time
conan source .
--source-folder .
--install-folder local_build
# You can use `cmake --build . -- -j14` on second run.
cmake -E time
conan build .
--build-folder local_build
--source-folder .
--install-folder local_build
conan package .
--build-folder local_build
--package-folder local_build/package_dir
--source-folder .
--install-folder local_build
cmake -E time
conan export-pkg . conan/stable
--package-folder local_build/package_dir
-s build_type=Debug
--force
-s cling_conan:build_type=Release
-s llvm_12:build_type=Release
-o openssl:shared=True
-e basis:enable_tests=True
-o chromium_base:shared=True
-e chromium_base:enable_tests=True
-o perfetto:is_hermetic_clang=False
--profile clang12_compiler
-e flexlib:enable_tests=True
-o flexlib:shared=False
-o perfetto:is_hermetic_clang=False
-o flexlib:enable_cling=True
-e flextool:enable_tests=True
-o flextool:enable_cling=True
cmake -E time
conan test test_package
flextool/master@conan/stable
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_12:build_type=Release
-o openssl:shared=True
-e basis:enable_tests=True
-o chromium_base:shared=True
-e chromium_base:enable_tests=True
-o perfetto:is_hermetic_clang=False
--profile clang12_compiler
-e flexlib:enable_tests=True
-o flexlib:shared=False
-o perfetto:is_hermetic_clang=False
-o flexlib:enable_cling=True
-e flextool:enable_tests=True
-o flextool:enable_cling=True借助可编辑的包装,您可以告诉柯南在哪里可以找到当地工作目录中的标题和工件。无需运行conan create或conan export-pkg 。
有关详细信息,请参见:https://docs.conan.io/en/latest/developing_packages/editable_packages.html
在本地建造:
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
cmake -E time
conan install .
--install-folder local_build
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
--profile clang12_compiler
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
cmake -E time
conan source .
--source-folder local_build
--install-folder local_build
conan build .
--build-folder local_build
--source-folder local_build
--install-folder local_build
conan package .
--build-folder local_build
--package-folder local_build/package_dir
--source-folder local_build
--install-folder local_build将软件包设置为可编辑模式:
conan editable add local_build/package_dir
flextool/master@conan/stable请注意,对conanfile.py进行了修改以通过self.in_local_cache检测本地构建。
在文件夹local_build中的更改源后(源软件包文件夹中的运行命令):
conan build .
--build-folder local_build
--source-folder local_build
--install-folder local_build
conan package .
--build-folder local_build
--package-folder local_build/package_dir
--source-folder local_build
--install-folder local_build
建立您的测试项目。
为了恢复可编辑模式,只需使用以下方式删除链接:
conan editable remove
flextool/master@conan/stable允许一次建立多个项目;它只是创建CMakeLists.txt ,并用add_subdirectory指向每个软件包文件夹。
注意:您可以像往常一样在IDE中打开工作区(基于CMAKE的项目(将构建目录转换为WorksPaceProject路径)!
有关详细信息,请参见:https://docs.conan.io/en/latest/developing_packages/workspaces.html
例如,我们希望同时构建Flextool和Flexlib(Flextool需要Flexlib)。
# change ~ to desired build folder
cd ~
# Replace paths to yours!
# Make sure each project in NOT in editable mode!
cat << EOF > ~/conanws.yml
editables:
flexlib/master@conan/stable:
path: /......../flexlib
flextool/master@conan/stable:
path: /......../flextool
layout: layout_flex
workspace_generator: cmake
root:
- flextool/master@conan/stable
EOF
cat << EOF > ~/layout_flex
# This helps to define the location of CMakeLists.txt within package
[source_folder]
.
# This defines where the conanbuildinfo.cmake will be written to
[build_folder]
build/{{settings.build_type}}
EOF mkdir build_flex
cd build_flex
cat << EOF > CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(WorkspaceProject)
include( $ {CMAKE_BINARY_DIR}/conanworkspace.cmake)
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flexlib_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flextool_SRC}/cmake")
conan_workspace_subdirectories()
add_dependencies(flextool flexlib)
EOF
# must contain `include(${CMAKE_BINARY_DIR}/conanworkspace.cmake)` without slash `` (slash added for bash cat command)
cat CMakeLists.txt
# combines options from all projects
conan workspace install
../conanws.yml
--profile=clang
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
-o openssl:shared=True
-o chromium_base:shared=True
-e basis:enable_tests=True
-e abseil:enable_llvm_tools=True
-o chromium_base:use_alloc_shim=True
-o chromium_tcmalloc:use_alloc_shim=True
-o perfetto:is_hermetic_clang=False
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
-o flexlib:shared=False
-o flexlib:enable_clang_from_conan=False
-e flexlib:enable_tests=True构建到由conan workspace install创建的文件夹:
# NOTE: change `build_type=Debug` to `build_type=Release` in production
export build_type=Debug
# optional
# remove old CMakeCache
(rm CMakeCache.txt || true)
# configure via cmake
cmake -E time cmake .
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DENABLE_TESTS=TRUE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=ON
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE= ${build_type}
# remove generated files
# change paths to yours
# rm ~/flex_typeclass_plugin/build/Debug/*generated*
# build code
cmake -E time cmake --build .
--config ${build_type}
-- -j8
# run unit tests for flexlib
cmake -E time cmake --build .
--config ${build_type}
--target flexlib_run_all_tests
# run unit tests for flextool
cmake -E time cmake --build .
--config ${build_type}
--target flextool_run_all_tests工作区允许快速更改现有源文件。
我们使用self.in_local_cache检测柯南可编辑模式:
# Local build
# see https://docs.conan.io/en/latest/developing_packages/editable_packages.html
if not self . in_local_cache :
self . copy ( "conanfile.py" , dst = "." , keep_path = False )确保所有目标都具有全球独特的名称。
例如:您无法在每个项目中都有一个具有相同名称的目标,例如“测试”。您可以通过将特定于项目的前缀添加到每个目标的名称中来解决该问题,例如“ $ {root_project_name} -test_main_gtest”。
因为CMAKE_BINARY_DIR将指向conan workspace install创建的文件夹,请确保您更喜欢CMAKE_CURRENT_BINARY_DIR而不是CMAKE_BINARY_DIR等。
安装之前:插件需要预先构建的Flextool(在同一工作区中)。您必须在没有插件的情况下构建工作区;只有这样,您才能使用插件重新构建它。
将插件添加到YML文件:
editables :
chromium_base/master@conan/stable :
path : /........./chromium_base
basis/master@conan/stable :
path : /........./basis
flex_support_headers/master@conan/stable :
path : /........./flex_support_headers
flexlib/master@conan/stable :
path : /........./flexlib
flextool/master@conan/stable :
path : /........./flextool
flex_reflect_plugin/master@conan/stable :
path : /........./flex_reflect_plugin
squarets/master@conan/stable :
path : /........./squarets
flex_squarets_plugin/master@conan/stable :
path : /........./flex_squarets_plugin
flex_typeclass_plugin/master@conan/stable :
path : /........./flex_typeclass_plugin
flex_pimpl_plugin/master@conan/stable :
path : /........./flex_pimpl_plugin
flex_meta_plugin/master@conan/stable :
path : /........./flex_meta_plugin
flex_meta_demo/master@conan/stable :
path : /........./flex_meta_demo
layout : layout_flex
workspace_generator : cmake
root :
- flex_reflect_plugin/master@conan/stable
- squarets/master@conan/stable
- flex_squarets_plugin/master@conan/stable
- flex_typeclass_plugin/master@conan/stable
- flex_pimpl_plugin/master@conan/stable
- flex_meta_plugin/master@conan/stable
- flex_meta_demo/master@conan/stable在CMakeLists.txt中使用add_dependencies :
mkdir build_flex
cd build_flex
cat << EOF > CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(WorkspaceProject)
include( $ {CMAKE_BINARY_DIR}/conanworkspace.cmake)
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_chromium_base_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_basis_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flex_support_headers_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flexlib_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flex_reflect_plugin_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_squarets_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flex_squarets_plugin_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flex_typeclass_plugin_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flex_meta_plugin_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flex_meta_demo_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flex_pimpl_plugin_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flextool_SRC}/cmake")
conan_workspace_subdirectories()
add_dependencies(basis chromium_base-static)
add_dependencies(flexlib basis)
add_dependencies(flextool flexlib basis flex_support_headers)
add_dependencies(flex_reflect_plugin flextool)
add_dependencies(flex_squarets_plugin squarets)
add_dependencies(flex_squarets_plugin flextool)
add_dependencies(flex_pimpl_plugin flextool)
add_dependencies(flex_pimpl_plugin flex_reflect_plugin)
add_dependencies(flex_pimpl_plugin flex_squarets_plugin)
add_dependencies(flex_typeclass_plugin flextool)
add_dependencies(flex_typeclass_plugin flex_squarets_plugin)
add_dependencies(flex_meta_demo flex_meta_plugin)
add_dependencies(flex_meta_demo flex_typeclass_plugin)
add_dependencies(flex_meta_demo flex_pimpl_plugin)
add_dependencies(flex_meta_demo flex_squarets_plugin)
EOF将插件选项添加到conan workspace install :
# combines options from all projects
conan workspace install
../conanws.yml
--profile=clang
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
-e basis:enable_tests=True
-o openssl:shared=True
-o chromium_base:shared=True
-o chromium_base:use_alloc_shim=True
-o perfetto:is_hermetic_clang=False
-o chromium_tcmalloc:use_alloc_shim=True
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
-o flexlib:shared=False
-o flexlib:enable_clang_from_conan=False
-e flexlib:enable_tests=True
-o flex_reflect_plugin:shared=True
-o flex_reflect_plugin:enable_clang_from_conan=False
-e flex_reflect_plugin:enable_tests=True
-o squarets:shared=False
-o squarets:enable_clang_from_conan=False
-e squarets:enable_tests=True
-o flex_squarets_plugin:shared=False
-o flex_squarets_plugin:enable_clang_from_conan=False
-e flex_squarets_plugin:enable_tests=True
-o flex_meta_plugin:shared=False
-o flex_meta_plugin:enable_clang_from_conan=False
-e flex_meta_plugin:enable_tests=True
-o flex_typeclass_plugin:shared=False
-o flex_typeclass_plugin:enable_clang_from_conan=False
-e flex_typeclass_plugin:enable_tests=True
-o flex_pimpl_plugin:shared=False
-o flex_pimpl_plugin:enable_clang_from_conan=False
-e flex_pimpl_plugin:enable_tests=True
-o flex_meta_demo:enable_clang_from_conan=False
-e flex_meta_demo:enable_tests=True构建和测试工作区:
# NOTE: change `build_type=Debug` to `build_type=Release` in production
export build_type=Debug
# optional
# remove old CMakeCache
(rm CMakeCache.txt || true)
# configure via cmake
cmake -E time cmake .
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DENABLE_TESTS=TRUE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=ON
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE= ${build_type}
# remove generated files
# change paths to yours
# rm ~/flex_typeclass_plugin/build/Debug/*generated*
# build code
cmake -E time cmake --build .
--config ${build_type}
-- -j8
# run unit tests for flexlib
cmake -E time cmake --build .
--config ${build_type}
--target flexlib_run_all_tests
# run unit tests for flextool
cmake -E time cmake --build .
--config ${build_type}
--target flextool_run_all_tests
# run unit tests for flex_reflect_plugin
cmake -E time cmake --build .
--config ${build_type}
--target flex_reflect_plugin_run_all_tests
# run unit tests for squarets
cmake -E time cmake --build .
--config ${build_type}
--target squarets_run_all_tests
# run unit tests for flex_squarets_plugin
cmake -E time cmake --build .
--config ${build_type}
--target flex_squarets_plugin_run_all_tests
# run unit tests for flex_squarets_plugin
cmake -E time cmake --build .
--config ${build_type}
--target flex_meta_plugin_run_all_tests
# run unit tests for flex_squarets_plugin
cmake -E time cmake --build .
--config ${build_type}
--target flex_typeclass_plugin_run_all_tests
# run unit tests for flex_squarets_plugin
cmake -E time cmake --build .
--config ${build_type}
--target flex_pimpl_plugin_run_all_tests
# run unit tests for flex_squarets_plugin
cmake -E time cmake --build .
--config ${build_type}
--target flex_meta_demo_run_all_tests确保使用-e flextool使用Debug构建-e flextool:enable_llvm_tools=True 。
通过柯南安装cppcheck:
cd /tmp
git clone -b testing/1.90 https://github.com/bincrafters/conan-cppcheck_installer.git
cd conan-cppcheck_installer
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
# NOTE: change `build_type=Debug` to `build_type=Release` in production
# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`
cmake -E time
conan create . conan/stable
-s build_type=Release
# clean build cache
conan remove " * " --build --force用法(使用-DENABLE_CPPCHECK=ON运行cmake):
# creates local build in separate folder and runs cmake targets
# NOTE: -DCLEAN_OLD="OFF" to keep generated html report
cmake -DCPPCHECK= " ON " -DCLEAN_OLD= " OFF " -P tools/run_tool.cmake # `index.html` must exist
# find $PWD -name index.html打开“ index.html”以查看结果。
提供单个上下文来管理和运行多个脚本的桌面应用程序。
简化了本地开发环境的设置;这避免了打开许多壳终端。
您可以在package.json或plugin/vue-cli-plugin/ui.js中添加自定义命令:
# Before: Install Latest Node.js and NPM
# see https://tecadmin.net/install-latest-nodejs-npm-on-ubuntu/
node --version
npm --version通过NPM构建您的项目:
npm installsudo npm install -g @vue/cli
sudo vue ui --dev --port 8061打开http://localhost:8061/ 。
导入项目目录。
选择Tasks ,例如构建/测试...
任务可以在package.json中更改。
注意:我们仅将package.json用于任务。柯南由名为conanfile.txt的文件控制。
有用的链接:
我们使用.gdbinit添加“ add-auto-load-saf-path”。
有关.gdbinit的更多详细信息,请阅读:https://metricpanda.com/tips-for-productive-debugging-with-gdb
有关gdb的更多详细信息,请阅读:http://www.yolinux.com/tutorials/gdb-commands.html
GDB调试会话可以像这样自动化:
# see https://gist.github.com/williballenthin/8bd6e29ad8504b9cb308039f675ee889
gdb
-ex " run "
-ex " set pagination off "
-ex " bt "
-ex " set confirm off "
-ex " quit "
--args
${APP_EXE}
${APP_CMD_ARGS} 确保使用-e flextool使用Debug构建-e flextool:enable_llvm_tools=True 。
有关详细信息,请参见:
安装Valgrind:
sudo apt install valgrind # Ubuntu, Debian, etc.
# OR
sudo yum install valgrind # RHEL, CentOS, Fedora, etc.注意:确保设置use_alloc_shim=False和enable_valgrind=True (请参见下文)。
通过cmake运行valgrind:
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
# NOTE: set `use_alloc_shim=False` and `enable_valgrind=True` for valgrind support
cmake -E time
conan install .
--install-folder local_build_valgrind
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
--profile clang12_compiler
-o flextool:enable_valgrind=True
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
-e abseil:enable_llvm_tools=True
-o chromium_base:enable_valgrind=True
-e chromium_base:enable_llvm_tools=True
-o chromium_base:use_alloc_shim=False
-o perfetto:is_hermetic_clang=False
-o basis:enable_valgrind=True
-e basis:enable_llvm_tools=True
-o flexlib:enable_valgrind=True
-e flexlib:enable_llvm_tools=True
-o flexlib:enable_clang_from_conan=False
-o chromium_tcmalloc:use_alloc_shim=False
--build chromium_base
--build chromium_tcmalloc
--build basis
--build flexlib
cd ~ /flextool
# see section about `conan editable mode`
cd local_build_valgrind
# optional
# remove old CMakeCache
(rm CMakeCache.txt || true)
# remove old build artifacts
rm -rf flextool
rm -rf bin
find . -iname ' *.o ' -exec rm {} ;
find . -iname ' *.a ' -exec rm {} ;
find . -iname ' *.dll ' -exec rm {} ;
find . -iname ' *.lib ' -exec rm {} ;
# NOTE: -DENABLE_VALGRIND=ON
cmake ..
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DENABLE_VALGRIND=ON
-DENABLE_TESTS=TRUE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=ON
-DENABLE_VALGRIND_TESTS=TRUE
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE=Debug
# NOTE: to run some tests under valgrind
# use `-DENABLE_VALGRIND_TESTS=TRUE`
cmake -E time cmake --build .
--target flextool-gmock_run_valgrind
# Cmake will print valgrind command that was executed.
# You can copy executed command and add custom command-line arguments:
# --gtest_filter=ToolsSanityTest.DISABLED_ValgrindTest
# --gtest_also_run_disabled_tests
# search for valgrind log file
find $PWD -name * valgrind * .log要查找泄漏,您可以在日志文件中definitely lost 。
注意:您可以在cmake/valgrind.cfg中添加valgrind抑制。
注意:使用调试标志编译程序,以在Valgrind下运行。
注意:使用valgrind --tool=helgrind检测潜在的死锁和数据竞赛。
注意:使用valgrind --tool=massif --massif-out-file=massif_file --stacks=true以测量堆的大小。另请参阅:https://kde.org/applications/development/org.kde.massif-visalizer
有关详细信息,请参见:https://stackoverflow.com/a/44989219
TODO:尝试使用Valgrind和Clang构建10 https://stackoverflow.com/questions/40509986/valgrind-reporting-mismist-free-delete-delete-delete
TODO:Valgrind可能不支持Chromium Base,FixMe。并删除gtest_no_suite
确保使用-e flextool使用Debug构建-e flextool:enable_llvm_tools=True
安装clang-tidy:
sudo apt-get install clang-tidy # Ubuntu, Debian, etc.
# OR
sudo yum install clang-tidy # RHEL, CentOS, Fedora, etc.用法(使用-DENABLE_CLANG_TIDY=ON运行cmake):
# creates local build in separate folder and runs cmake targets
cmake -DCLANG_TIDY= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake确保使用-e flextool使用Debug构建-e flextool:enable_llvm_tools=True
有关详细信息,请参见:https://chromium.googlesource.com/chromium/src.git/ +/master/docs/clang_static_analyzer.md and https://clang-analyzer.llvm.lvm.gm.gm.org/scan-build.html.html.html
该程序CCC-Analyzer的作用就像是假编译器,将其命令线论点转发给编译器以执行常规编译并clang曲以执行静态分析。
运行配置通常会生成具有编译器硬有线路径的makefiles,并且通过通过扫描构建运行配置,该路径设置为CCC-Analyzer。
# must exist
ccc-analyzer -v
# must exist
c++-analyzer -v
# must exist
scan-build -v
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
cmake -E time
conan install .
--install-folder local_build_scan_build
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
--profile clang12_compiler
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
cmake -E time
conan source .
--source-folder local_build_scan_build
--install-folder local_build_scan_build
# see section about `conan editable mode`
cd local_build_scan_build
# NOTE: change `build_type=Debug` to `build_type=Release` in production
export build_type=Debug
# optional
# remove old CMakeCache
(rm CMakeCache.txt || true)
# NOTE: changed CMAKE_C_COMPILER to ccc-analyzer (!!!)
# configure via cmake
scan-build
--use-cc=clang-10
--use-c++=clang++-10
-o ./scanbuildout/
cmake ..
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DCMAKE_C_COMPILER=ccc-analyzer
-DCMAKE_CXX_COMPILER=c++-analyzer
-DENABLE_TESTS=FALSE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=OFF
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE= ${build_type}
# remove old build artifacts
(make clean || true)
rm -rf bin
# NOTE: requires project configured in debug build
# disable other static analyzers
# run from build directory
scan-build
-maxloop 8
-enable-checker alpha.security.taint.TaintPropagation
-enable-checker alpha.core.BoolAssignment
-enable-checker alpha.core.CastSize
-enable-checker alpha.core.DynamicTypeChecker
-enable-checker alpha.core.FixedAddr
-enable-checker alpha.core.IdenticalExpr
-enable-checker alpha.core.PointerArithm
-enable-checker alpha.core.PointerSub
-enable-checker alpha.core.SizeofPtr
-enable-checker alpha.core.TestAfterDivZero
-enable-checker alpha.deadcode.UnreachableCode
-enable-checker alpha.security.ArrayBoundV2
-enable-checker alpha.security.MallocOverflow
-enable-checker alpha.security.ReturnPtrRange
-enable-checker alpha.unix.PthreadLock
-enable-checker alpha.unix.Stream
-enable-checker alpha.unix.cstring.BufferOverlap
-enable-checker alpha.unix.cstring.NotNullTerminated
-enable-checker alpha.unix.cstring.OutOfBounds
-enable-checker nullability.NullableDereferenced
-enable-checker optin.performance.Padding
-enable-checker security.insecureAPI.rand
-enable-checker security.insecureAPI.strcpy
--use-cc=clang-10
--use-c++=clang++-10
-o ./scanbuildout/
make
-j8打开产生的scanbuildout/...../index.html文件
确保使用-e flextool使用Debug构建-e flextool:enable_llvm_tools=True
有关详细信息,请参见:https://github.com/myint/cppclean
安装:
pip install --index-url=https://pypi.python.org/simple/ --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --upgrade cppclean用法(使用-DENABLE_CPPCLEAN=ON运行cmake):
# creates local build in separate folder and runs cmake targets
cmake -DCPPCLEAN= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake注意:cppclean要求文件编码为: UTF-8 without BOM (ASCII)
确保使用-e flextool使用Debug构建-e flextool:enable_llvm_tools=True
包括您使用的内容(IWYU)是一个旨在优化的项目。
它将计算所需的标头,并添加 /删除均应适当。
有关详细信息,请参见:https://include-what-you-use.org/
用法(使用-DENABLE_IWYU=ON运行cmake):
# creates local build in separate folder and runs cmake targets
cmake -DIWYU= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake CodeStyle:使用// IWYU pragma: associated 。
注意:阅读有关IWYU PRAGMAS:https://github.com/include-what-you-use/include-what-what-you-use/blob/blob/master/master/docs/iwyupragmas.md
注意:请勿使用“ bit/”或“/delect/*”包含“ bits/”或
有关详细信息,请参见:
使用-DUSE_CCACHE=ON
gcc -v
export CC=gcc
export CXX=g++
# NOTE: -DUSE_CCACHE=ON
cmake ..
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DUSE_CCACHE=ON
-DENABLE_TESTS=FALSE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=OFF
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE=Debug有关详细信息,请参见:https://www.virag.si/2015/07/use-ccace-with-cmake-for-for-faster-compilation/
为了充分利用CCACHE,请将类似的内容放入: ~/.ccache/ccache.conf :
max_size = 50.0G # or whatever cache size you prefer; default is 5G; 0 means unlimited
base_dir = /home/yourname # or wherever you keep your source files注意:CCACHE需要在不同的存储库 /路径上共享同一文件的缓存编译所必需的base_dir ;它只会对base_dir下的路径进行此操作。因此,此选项是有效地使用git工作室的CCACHE(如下所述)。
您不得将base_dir设置为“/”,也不能将包含系统标头的任何地方(根据CCACHE文档)。
安装:
sudo apt-get install ccache
# On OS X use homebrew:
# brew install ccache
ccache --version使用-DUSE_LD_GOLD=ON
gcc -v
export CC=gcc
export CXX=g++
# NOTE: -DUSE_LD_GOLD=ON
cmake ..
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DUSE_LD_GOLD=ON
-DENABLE_TESTS=FALSE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=OFF
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE=Debug有关详细信息,请参见:https://cristianadam.eu/20170709/speeding-up-cmake/
注意:默认情况下没有螺纹,使用“ - enable-threads”配置
注意:默认情况下螺纹可能比黄金快
确保使用-e flextool使用Debug构建-e flextool:enable_llvm_tools=True
有关详细信息,请参见:https://oclint-docs.readthedocs.io/en/stable/devel/codingstandards.html
安装:
cd ~
wget --no-check-certificate https://github.com/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz
# mirror 1: http://github.strcpy.cn/oclint/oclint/releases/download/v0.13.1/oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz
# mirror 2: http://archives.oclint.org/releases/0.8/oclint-0.8.1-x86_64-linux-3.13.0-35-generic.tar.gz
tar -xzvf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz
rm -rf oclint-0.13.1-x86_64-linux-4.4.0-112-generic.tar.gz
export OCLINT_HOME= ~ /oclint-0.13.1
export PATH= $OCLINT_HOME /bin: $PATH
oclint -version用法(使用-DENABLE_OCLINT=ON运行cmake):
# NOTE: -DCLEAN_OLD="OFF" to keep generated html report
# creates local build in separate folder and runs cmake targets
cmake -DOCLINT= " ON " -DCLEAN_OLD= " OFF " -P tools/run_tool.cmake # `report.html` must exist
# find $PWD -name report.htmlOpen Report Report.html
参见Oclint教程:http://docs.oclint.org/en/stable/intro/tutorial.html
请参阅以下网址:https://oclint-docs.readthedocs.io/en/stable/rules/列表
注意:您可以抑制Oclint警告http://docs.oclint.org/en/stable/howto/suppress.html#oclint-comment
有关详细信息,请参见:https://clang.llvm.org/docs/clangformat.html
用法(使用-DENABLE_CLANG_FORMAT=ON运行cmake):
# creates local build in separate folder and runs cmake targets
cmake -DCLANG_FORMAT= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake我们使用.clang-format文件。有关详细信息,请参见:https://clang.llvm.org/docs/clangformatstyleoptions.html
注意:我们使用DisableFormat ,因此Clang-Format只会更改基于SortIncludes的顺序。
不幸的是, clang-format不够配置,因此只能用于排序。请参阅:https://stackoverflow.com/a/32191189
我们使用不稳定的Bacause Clang-Format和Astyle不支持很多选择。
有关详细信息,请参见:https://patrickhenson.com/2018/06/07/uncrustify-configuration.html
安装:
cd ~
git clone https://github.com/uncrustify/uncrustify.git
cd uncrustify
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .
export UNCRUSTIFY_HOME= ~ /uncrustify/build
export PATH= $UNCRUSTIFY_HOME : $PATH
# OR sudo make install
uncrustify --version用法(使用-DENABLE_UNCRUSTIFY=ON运行cmake):
# creates local build in separate folder and runs cmake targets
cmake -DUNCRUSTIFY= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake我们使用uncrustify.cfg文件。有关详细信息,请参见:https://patrickhenson.com/2018/06/07/uncrustify-configuration.html
要获取所有可用选项的列表,请使用:
uncrustify --show-config不稳定具有许多可配置的选项。您可能还需要通用缩进GUI(在Konstantin的答复中)来配置它:http://universalindent.sourceforge.net/
使用包含/* *INDENT-OFF* */和/* *INDENT-ON* */以禁用源文件部分的处理。
请参阅uncrustify.cfg的disable_processing_cmt :
# Specify the marker used in comments to disable processing of part of the
# file.
# The comment should be used alone in one line.
#
# Default: *INDENT-OFF*
disable_processing_cmt = " *INDENT-OFF* " # string
# Specify the marker used in comments to (re)enable processing in a file.
# The comment should be used alone in one line.
#
# Default: *INDENT-ON*
enable_processing_cmt = " *INDENT-ON* " # string您可以与IDE集成uncrustify :
请参阅https://github.com/blockspacer/llvm_9_installer#how-to-us-sanitizers
需要enable_llvm_tools=True , compile_with_llvm_tools=True ,and llvm_tools:build_type=Release :
-s llvm_tools:build_type=Release
-e flextool:enable_llvm_tools=True
-e flextool:compile_with_llvm_tools=True
-o llvm_tools:include_what_you_use=True
...enable_llvm_tools从柯南安装clang 10compile_with_llvm_tools设置使用conan所需的CMAKE变量运行conan install或使用以下方式conan create
# OR create conan profile https://docs.conan.io/en/latest/reference/profiles.html
-s compiler=clang
-s compiler.version=10
-s compiler.libcxx=libc++注意:更改编译器可能需要重建所有DEP( --build=missing )。
例如,在本地构建的情况下:
export CC= $( find ~ /.conan/data/llvm_tools/master/conan/stable/package/ -path " *bin/clang " | head -n 1 )
export CXX= $( find ~ /.conan/data/llvm_tools/master/conan/stable/package/ -path " *bin/clang++ " | head -n 1 )
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
# NOTE: NO `--profile` argument cause we use `CXX` env. var
# NOTE: you may want to re-build `cling_conan` with clang 10
cmake -E time
conan install .
--install-folder local_build_clang_10
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
--build missing
--build cascade
-s cling_conan:compiler=clang
-s cling_conan:compiler.version=10
-s cling_conan:compiler.libcxx=libstdc++11
-o llvm_tools:include_what_you_use=True
-s llvm_tools:compiler=clang
-s llvm_tools:compiler.version=10
-s llvm_tools:compiler.libcxx=libstdc++11
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
-e flextool:compile_with_llvm_tools=True
-e boost:enable_llvm_tools=True
-e boost:compile_with_llvm_tools=True
-s compiler=clang
-s compiler.version=10
-s compiler.libcxx=libc++
cmake -E time
conan source .
--source-folder local_build_clang_10
--install-folder local_build_clang_10
# remove old CMakeCache
(rm local_build_clang_10/CMakeCache.txt || true)
# see section about `conan editable mode`
conan build .
--build-folder local_build_clang_10
--source-folder local_build_clang_10
--install-folder local_build_clang_10执行检查:
# check that `libcpp` symbol exists
nm -an EXECUTABLE_PATH | grep libcpp
# list linked dynamic libs
ldd EXECUTABLE_PATH MCSS_ROOT_DIR_FOR_DOCS必须指向m.css来源,如下:
cd ~
git clone https://github.com/mosra/m.css.git
pip3 install jinja2 Pygments
sudo apt install
texlive-base
texlive-latex-extra
texlive-fonts-extra
texlive-fonts-recommended
sudo apt-get install doxygen
sudo apt install python3-pip
# /usr/bin/python must point to python3
/usr/bin/python --version
# NOTE: switch to python3 for doxygen or use -DPYTHON_EXECUTABLE=/usr/bin/python3
alias python= ' /usr/bin/python3 '
# You may need sudo here
pip3 install jinja2 Pygments
sudo apt install
texlive-base
texlive-latex-extra
texlive-fonts-extra
texlive-fonts-recommended使用'-target doxydoc'和-DBUILD_DOXY_DOC=ON cmake build
cd ~ /flextool
# see section about `conan editable mode`
cd local_build_clang_10
# optional
# remove old CMakeCache
(rm CMakeCache.txt || true)
# remove old build artifacts
rm -rf flextool
rm -rf bin
find . -iname ' *.o ' -exec rm {} ;
find . -iname ' *.a ' -exec rm {} ;
find . -iname ' *.dll ' -exec rm {} ;
find . -iname ' *.lib ' -exec rm {} ;
# remove old build docs
rm -rf doc-mcss
rm -rf docs
cmake -E make_directory " doc-mcss "
# NOTE: you can change python version like so: -DPYTHON_EXECUTABLE=/usr/bin/python3
cmake ..
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DMCSS_ROOT_DIR_FOR_DOCS= $HOME /m.css
-DPYTHON_EXECUTABLE=/usr/bin/python3
-DENABLE_TESTS=TRUE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=ON
-DBUILD_DOXY_DOC=ON
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE=Debug
-DDOXY_ROOT_DIR= $PWD /doc-mcss
-DDOXY_DOC_COMMON_IMG_PATH= $PWD /..
-DPROJECT_SOURCES_DIR_FOR_DOCS= $PWD /../src
cmake -E time cmake --build .
--target doxyDoc_notheme
cmake -E time cmake --build .
--target doxyDoc
# Use to find index.html
find $PWD -name * .html打开doxydoc/html/index.html
注意:文档命名空间/docs/namespaces.dox
注意:输出中根本不存在文件,目录和符号
使用的评论样式:
/ **
* @brief Path utils
*
* Example usage:
*
* @code{.cpp}
* const ::fs::path workdir = storage::getThisBinaryDirectoryPath ();
* @endcode
** /看:
有关详细信息,请参见:https://afl-1.readthedocs.io/en/latest/index.html
注意:更喜欢github.com/google/afl或aflplus.plus,而不是从lcamtuf.coredump.cx/afl更新AFL
模糊是黑匣子软件测试技术。
模糊包括以自动化的方式使用畸形/半故障数据注入发现实现错误。
Fuzzer试图修改输入,以便它可以达到程序代码的尽可能多的行。
因此,模糊允许在正常使用中发现很难达到的代码路径中发现漏洞。
使用以下命令安装 +编译源代码:
# optional
# sudo apt-get update
# optional
# sudo apt-get -y install autoconf automake bison build-essential
ca-certificates llvm-dev libtool libtool-bin
libglib2.0-dev make nasm wget
# Tested with clang 10 and gcc 7
sudo apt-get -y install clang-10 g++-7 gcc-7
export CXX=g++-7
export CC=gcc-7
export PATH=/usr/bin/: $PATH
$CC -v
# llvm-config binary that coresponds to the same clang you are using to compile
export LLVM_CONFIG=/usr/bin/llvm-config-10
$LLVM_CONFIG --cxxflags
cd ~
git clone -b v2.56b https://github.com/google/AFL.git --recursive
# NOTE: original AFL not updated since November 2017,
# so prefer `google/AFL.git` to `lcamtuf.coredump.cx/afl`
# wget http://lcamtuf.coredump.cx/afl/releases/afl-latest.tgz
# tar -xf afl-latest.tgz
# rm afl-latest.tgz
# cd afl*
cd AFL
make
# build llvm using the sample compiler as afl code uses
# see https://groups.google.com/forum/#!topic/afl-users/1WqZpGXvYY0
make
-C llvm_mode
LLVM_CONFIG= $LLVM_CONFIG
CC=clang-10
CXX=clang++-10
#
# optional
# cd qemu_mode
# ./build_qemu_support.sh
# cd ..
#
make
-C libdislocator
make
-C libtokencap
sudo make install
# OR add to PATH via export PATH=$PATH:...
# do not forget to reset CC and LLVM_CONFIG
unset CXX
unset CC
unset LLVM_CONFIG我们使用AFL编译器编译代码: -DCMAKE_C_COMPILER=afl-clang-fast , -DCMAKE_CXX_COMPILER=afl-clang-fast++和-DCMAKE_LINKER=afl-clang-fast 。
验证二进制文件是否使用AFL编译器: nm BINARY_PATH | grep afl
使用一些消毒剂构建应用程序并启用了调试信息:( -DENABLE_ASAN=ON等):
注意:使用地址消毒剂时,有一些事情要考虑。即使ASAN发现违反内存访问权限,也不会自动崩溃应用程序。使用自动模糊工具时,这是一个问题,因为他们通常尝试通过检查返回代码来检测Segfaults。但是,当环境变量发生错误之前,我们可以将Asan迫使Asan崩溃软件: export ASAN_OPTIONS='abort_on_error=1'
注意:禁用自定义内存分配功能。这可以隐藏内存访问错误并阻止检测内存访问错误。
# see https://afl-1.readthedocs.io/en/latest/instrumenting.html
# Setting AFL_HARDEN automatically adds code hardening options
# when invoking the downstream compiler.
# This includes -D_FORTIFY_SOURCE=2 and -fstack-protector-all.
# NOTE: _FORTIFY_SOURCE not compatible with ASAN
# export AFL_HARDEN=1
# see https://aflplus.plus/docs/env_variables/
export AFL_EXIT_WHEN_DONE=1
# By default, the wrapper appends -O3 to optimize builds.
export AFL_DONT_OPTIMIZE=1
# or AFL_USE_MSAN, etc.
# READ https://aflplus.plus/docs/notes_for_asan/
NOTE: if you run several slaves only one should run the
# target compiled with ASAN (and UBSAN, CFISAN),
# the others should run the target with no sanitizers compiled in.
export AFL_USE_UBSAN=1
export AFL_USE_ASAN=1
# AFL_PRELOAD causes AFL to set LD_PRELOAD for the target binary
# without disrupting the afl-fuzz process itself.
# This is useful, among other things, for bootstrapping libdislocator.so.
# see __AFL_LOOP
# export AFL_PERSISTENT=1
# make sure you compile app with `-fsanitize=address` or `-fsanitize=memory` etc.注意:使用AFL_DONT_OPTIMIZE=1 ;阅读:http://moyix.blogspot.com/2016/07/fuzzing-with-afl-afl-is-an-art.html
有关详细信息,请参见:与AFL一起使用Asan
在模糊程序之前,我们可能需要切换到root用户以安排core_pattern。登录为root并键入以下命令:
# see https://afl-1.readthedocs.io/en/latest/tips.html#check-os-configuration
sudo su
# disable core dumps and CPU frequency scaling on your system (AFL will warn you if you should do this)
echo core > /proc/sys/kernel/core_pattern
# afl-fuzz will usually complain that you should change your `CPUFREQ` settings to performance because the automatic frequency scaling by the Linux kernel doesn't work well with afl.
echo performance | tee /sys/devices/system/cpu/cpu * /cpufreq/scaling_governor
exit注意:请勿使用root访问运行fuzzer
注意:为绒毛获得扎实的环境;切勿在低配置的虚拟机上运行模糊器。
afl-fuzz用于运行AFL。实际语法如下:
# see https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries
# -i is a directory of files to use as fuzz input "seeds"
# -o is a directory to write the results (including inputs that provoke crashes or hangs)
# -m is the memory allowed to use. Example: -m500
# You can use -m none to disable memory limit
# -t is the maximum time that a run is allowed to take before being declared a "hang"
# Timeout of 10 seconds: -t 10000
# @@ is fuzzer input file name
# if you skip @@ it will pass the fuzzed file on the standard input
AFL_PERSISTENT=1 afl-fuzz -i [TESTCASE DIR] -o [RESULT_DIR] [TARGET_BINARY] [BINARY_PARAMS] @@
# Example 1: runs `tar` with arguments `xfJ @@ -C fuzz-garbage/ --force-local`
# where @@ is fuzzer input file name
./afl-1.56b/afl-fuzz -i fuzz-input/ -o fuzz-state/ -t 10000 ~ /tar-1.28/src/tar xfJ @@ -C fuzz-garbage/ --force-local
# Example 2: server is dual core, so we can run one AFL instance per core
AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -M master ./fuzz_capstone
# In another terminal
AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -S slave1 ./fuzz_capstone要了解AFL状态屏幕,请阅读:https://afl-1.readthedocs.io/en/latest/user_guide.html#status-screen
注意:如果total paths保持在1,则可能设置了错误。
注意:优先-m none 。我们使用地址固定器;这为阴影内存绘制了很多页面,因此我们必须删除内存限制才能启动并运行它。
注意:使用-m none ,您的模糊软件实际上可能会由于您的模糊样本而尝试分配和使用大量内存。这可能会导致系统中随机崩溃。您不应该做任何重要的工作。
注意:您可以尝试ASAN_OPTIONS=hard_rss_limit_mb=2000以避免-m none 。请参阅:https://countuponsecurity.com/category/fuzzing/
您可以编写将使用afl-fuzz运行的自定义二进制文件。它可能要包装您要测试的功能:
// harness is simply a C program that makes use of certain methods from
// a library, allowing you to indirectly fuzz it
# include < cstdio >
# include < cstdlib >
# include < string >
# include < iostream >
# include < ifstream >
int main ( int argc, char *argv[]) {
{
// init resources here
if (argc > 1 ) {
std::ifstream fin;
fin. open (argv[ 1 ]);
parse (fin); // custom logic
} else {
// / note requires AFL_PERSISTENT=1
// __AFL_LOOP is the way that we have to tell AFL
// that we want persistent mode.
// Each fuzzing iteration,
// instead of to fork and re-execute the target with a different input,
// is just an execution of this loop.
// Force AFL to run 1000 times,
// with 1000 different inputs fed to the library.
// After that, the process is restarted by AFL.
// This ensures we regularly replace the process to avoid memory leaks.
// see https://toastedcornflakes.github.io/articles/fuzzing_capstone_with_afl.html
while ( __AFL_LOOP ( 1000 )) {
parse (std::cin); // custom logic
}
}
// free resources here
return 0 ;
}注意:__afl_loop()允许AFL通过某些内存巫术在过程中执行二进制文件的模糊,而不是为我们要测试的每个新测试柜启动一个新过程。需要AFL_PERSISTENT=1 。
默认情况下,AFL分叉每次测试不同输入时的过程。我们可以控制AFL在程序的单个实例中运行多个模糊案例,而不是为每个测试示例重新恢复程序状态。这将减少在内核空间中花费的时间并提高模糊速度。这称为afl_persistent模式。我们可以通过在我们的测试安全带中包括__AFL_LOOP(1000)宏来做到这一点。
注意:您可能对__afl_init感兴趣;有关详细信息,请参见:https://robertheaton.com/2019/07/08/how-to-to-write-an-afl-wrapper-for-any-language/
让模糊器运行几个小时或几天,因为它会根据所提供的测试案例生成最大的代码执行路径。
在AFL统计屏幕的整体结果in the section停止发出ctrl+c' observing总路径and UNIQ崩溃。
创建词典,以占据二进制程序中的所有常数和字符串,并将其添加到字典中。请参阅脚本代码:http://moyix.blogspot.com/2016/07/fuzzing-with-afl-afl-is-an-ar-art.html
#! /bin/bash
# see http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html
objdump -d " ${1} " | grep -Eo ' $0x[0-9a-f]+ ' | cut -c 2- | sort -u | while read const ; do echo $const | python -c ' import sys, struct; sys.stdout.write("".join(struct.pack("<I" if len(l) <= 11 else "<Q", int(l,0)) for l in sys.stdin.readlines())) ' > testcases/ $const ; done
i=0 ; strings " ${1} " | while read line ; do echo -n " $line " > testcases/string_ ${i} ; i=$[ $i + 1 ] ; done您需要在词典/readme.dictionaries中讨论的两种格式之一中创建字典,然后通过命令行中的-x选项将fuzzer指向它。阅读:https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries and https://github.com/mirrorer/afl/afl/afl/afl/blob/master/master/master/dictionaries/readme.dictionaries.dictionaries.dictionaries.dictionaries.dictionaries
您也可以使用libtokencap创建字典;请参阅:https://github.com/mirrorer/afl/blob/master/libtokencap/readme.tokencap
我们可以找到导致results文件夹中崩溃的测试用例。导航到文件夹results时,我们观察到很少生成文件夹。
注意:保持输入数据文件较小; 1 kb以下是理想的。
使用afl-cmin最小化输入数据文件的数量。
使用afl-tmin最大程度地减少每个输入数据文件(删除不影响所需代码路径的任何字节)。
使用afl-ptmin并行运行afl-tmin 。有关详细信息,请参见:https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-job-from-start-toart-toart-toar to-finish/
要重现发现的崩溃,您可以使用crashwalk (是GDB插件),请参见:https://ritcsec.wordpress.com/2018/05/05/10/vulnerability-discovery-by-fuzzing/
apt-get install gdb golang
mkdir src
cd src
git clone https://github.com/jfoote/exploitable.git
cd && mkdir go
export GOPATH= ~ /go
# crashwalk installed in $GOPATH/bin/
go get -u github.com/bnagy/crashwalk/cmd/...
# USAGE
~ /go/bin/cwtriage -root syncdir/fuzzer1/crashes/ -match id -- ~ /parse @@当您无法重现AFL-Fuzz发现的崩溃时,最有可能的原因是您没有设置与工具使用的相同内存限制。阅读:https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries
注意:您可以使用afl-cov来量化二进制中可用代码路径的操作程度。有关详细信息,请参见:https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-job-from-start-toart-toart-toar to-finish/
注意:将AFL的工作目录放在RAM磁盘上,您可能会获得一些额外的速度,并避免同时磨损磁盘。有关详细信息,请参见:https://bananamafia.dev/post/gb-fuzz/
# Fuzzing involves billions of reads and writes to the filesystem (!!!)
# Use RAMdisks for input since, we don't want to destroy harddrives
# Make a 1GB ramdisk file from which AFL can read input
sudo mkdir -p /mnt/inputfiles
sudo chown -R $USER : $( id -gn $USER ) /mnt/inputfiles
sudo mount -t tmpfs -o size=1024M tmpfs /mnt/inputfiles/注意: -fvisibility-inlines-hidden Flag可能会破坏AFL仪器
AFL在experimental/crash_triage/triage_crashes.sh中提供崩溃探索脚本
运行时,Triage脚本将循环浏览/out/crashes目录中的每个崩溃文件,并将结果崩溃数据打印到屏幕上。
triage_crashes用法: ./triage_crashes.sh ~/targets/out/ ~/targets/target-app/target-app_binary有关详细信息,请参见:https://research.aurainfosec.io/hunting-for-bugs-101/
注意:带有AFL的仪器仅仅是您实际上想立即强调测试的图书馆,一次是一个。让程序在整个系统范围内使用非启发式图书馆,以获取您实际上不想模糊的任何功能。
注意:您可以通过-C启用crash exploration mode ;请参阅:https://lcamtuf.blogspot.com/2014/11/afl-fuzz-crash-crash-ecploration-mode.html
注意:AFL通过检查由于信号(sigsegv,sigabrt等)而死亡的第一个产卵过程来检测故障。为这些信号安装自定义处理程序的程序可能需要评论相关的代码。
有关详细信息,请参见:
Libfuzzer是LLVM编译器基础架构项目的一部分,并与Clang编译器一起内置。
然后,可以通过在链接阶段传递-fsanitize=fuzzer将libfuzzer链接到所需的驱动程序。
注意: -fsanitize=fuzzer链接。
注意:在大多数情况下,您可能需要将libfuzzer与adversySanitizer(ASAN),UndefinedBehaviorSanitizer(UBSAN)或两者相结合。您也可以使用内存齐射器(MSAN)构建,但支持是实验性的: -fsanitize=undefined,address,fuzzer 。
可执行人员反复调用以下功能:
extern " C " int LLVMFuzzerTestOneInput ( const uint8_t *Data, size_t Size ) {
// DoStuffWithYourAPI(Data, Size);
return 0 ;
}使用-fsanitize=address,fuzzer 。请注意,您可以更改消毒剂(地址,内存,线程等)。
注意:如果您怀疑目标内存泄漏,则应使用-runs=N或-max_total_time=N运行libfuzzer。如果您的目标有巨大的泄漏,您最终将用尽RAM。为了保护您的机器免受OOM死亡的侵害,您可能会使用: ASAN_OPTIONS=hard_rss_limit_mb=2000 (带adversionSanitizer)。
libfuzzer需要种子语料库。有关详细信息,请参见:https://github.com/google/fuzzing/blob/master/tutorial/libfuzzertutorial.md
有关详细信息,请参见:
Clang支持线程安全注释(Guarded_by)
-Wthread-safety-analysisbase/thread_annotations.h https://github.com/chromium/chromium/chromium/blob/master/base/base/thread_annotations.h有关详细信息,请参阅:Clang FAS对消毒剂的一流支持。在文档中查看有关MSAN,ASAN,TSAN等的详细信息。
Clang可以通过终身配置文件来构建:
-Wlifetime有关详细信息,请参阅:所有开源组件均在其关联的开源许可下使用。
使用的开源组件:
请参阅许可证文件
麻省理工学院许可证
有关许可证的全部内容,请参见许可证。
基于Google Chromium项目的开源项目。
这不是Google产品。
部分版权(C)Google Inc.
请参阅许可证文件。