Solusi sumber yang sepenuhnya terbuka dan kuat untuk modifikasi dan pembuatan kode sumber C ++. Kurangi jumlah kode boilerplate dalam proyek C ++ Anda.
Halaman Proyek Utama: https://blockspacer.github.io/flex_docs/
Diuji pada Ubuntu 20.04.2 lts.
Dapat bekerja pada platform lain dengan modifikasi kecil.
Untuk dapat menambahkan daftar remote ketergantungan, harap ketik perintah berikut:
cmake -E time conan config install conan/remotes/
# OR:
# cmake -E time conan config install conan/remotes_disabled_ssl/ Panduan Instalasi
Paket Conan
CATATAN: Menempel dengan LLVM Build mungkin memakan waktu beberapa jam.
Perintah di bawah ini menggunakan --profile clang12_compiler12_compiler .
Contoh profil Conan ~/.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/stableBuat profil 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/stableSebelum membuat file profil conan, lihat: https://docs.conan.io/en/latest/using_packages/using_profiles.html.
Kami menggunakan skrip .cmake untuk mengunduh dan menginstal paket Conan.
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 Jika Anda ingin menginstal Flextool dan pluginnya dalam perintah tunggal, ubah opsi yang disediakan untuk tools/buildConanThirdparty.cmake .
Catatan: tools/buildConanThirdparty.cmake akan melakukan pembuatan ulang penuh; Mungkin butuh beberapa jam.
Perintah di bawah ini menggunakan --profile clang12_compiler12_compiler . Sebelum membuat file profil conan, lihat: https://docs.conan.io/en/latest/using_packages/using_profiles.html.
Kami menggunakan skrip buildConanThirdparty.cmake untuk mengunduh dan menginstal paket Conan.
CATATAN: Set -DENABLE_CLING=FALSE Jika Anda sudah menginstal cling menggunakan tools/buildConanThirdparty.cmake di atas.
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 --forceGunakan perintah di bawah ini untuk membangun kembali Flextool (plugin harus dipasang secara terpisah).
Perintah di bawah ini menggunakan --profile clang12_compiler12_compiler . Sebelum membuat file profil conan, lihat: 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.jsonNonaktifkan pembuatan database kompilasi saat Anda menggunakan Flextool.
Jika Anda menggunakan cmake, atur CMAKE_EXPORT_COMPILE_COMMANDS ke FALSE .
Jika compile_commands.json ada di folder build (atau di folder induk), Flextool mungkin gagal.
Proyek ini dimungkinkan karena autoprogrammer Flexferrum.
Artikel tentang autoprogrammer Flexferrum di Media:
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 Dengan paket yang dapat diedit, Anda dapat memberi tahu Conan di mana menemukan header dan artefak yang siap untuk dikonsumsi di direktori kerja lokal Anda. Tidak perlu menjalankan conan create atau conan export-pkg .
Untuk detailnya, lihat: https://docs.conan.io/en/latest/develevely_packages/editited_packages.html
Bangun secara lokal:
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_buildSetel paket ke mode yang dapat diedit:
conan editable add local_build/package_dir
flextool/master@conan/stable Perhatikan bahwa conanfile.py dimodifikasi untuk mendeteksi bangunan lokal melalui self.in_local_cache .
Setelah mengubah sumber di folder local_build (jalankan perintah di folder paket sumber):
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
Bangun proyek pengujian Anda.
Untuk mengembalikan mode yang dapat diedit cukup hapus tautan menggunakan:
conan editable remove
flextool/master@conan/stable Memungkinkan untuk membangun beberapa proyek sekaligus; Ini hanya membuat CMakeLists.txt dengan add_subdirectory menunjuk ke setiap folder paket.
Catatan: Anda dapat membuka ruang kerja di IDE seperti proyek berbasis CMake biasa (Ubah Direktori Build ke Path Workspaceproject)!
Untuk detailnya, lihat: https://docs.conan.io/en/latest/develding_packages/workspaces.html
Misalnya, kami ingin membangun Flextool dan Flexlib secara bersamaan (Flextool membutuhkan 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 Bangun ke dalam folder yang dibuat oleh 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_testsWorkspace memungkinkan untuk membuat perubahan cepat pada file sumber yang ada.
Kami menggunakan self.in_local_cache untuk mendeteksi mode editing conan:
# 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 )Pastikan semua target memiliki nama unik secara global.
Misalnya: Anda tidak dapat memiliki target di setiap proyek dengan nama yang sama seperti "tes". Anda dapat memecahkan masalah itu dengan menambahkan awalan khusus proyek ke nama setiap target seperti "$ {root_project_name} -test_main_gtest".
Karena CMAKE_BINARY_DIR akan menunjuk ke folder yang dibuat oleh conan workspace install , pastikan Anda lebih suka CMAKE_CURRENT_BINARY_DIR ke CMAKE_BINARY_DIR dll.
Sebelum Instalasi: Plugin memerlukan Flextool pra-buatan (di ruang kerja yang sama). Anda harus membangun ruang kerja tanpa plugin; Hanya dengan begitu Anda akan dapat membangun kembali dengan plugin.
Tambahkan plugin ke file 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 Gunakan add_dependencies di CMakeLists.txt :
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 Tambahkan opsi plugin ke 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=TrueBangun dan uji ruang kerja:
# 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 Pastikan Anda menggunakan Debug build dengan -e flextool:enable_llvm_tools=True .
Instal CPPCheck melalui Conan:
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 Penggunaan (menjalankan cmake dengan -DENABLE_CPPCHECK=ON ):
# 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.htmlBuka 'index.html' untuk melihat hasilnya.
Aplikasi desktop yang menyediakan konteks tunggal untuk mengelola dan menjalankan beberapa skrip.
Menyederhanakan pengaturan lingkungan dev lokal; Ini menghindari pembukaan banyak terminal shell.
Anda dapat menambahkan perintah khusus di package.json atau 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 --versionBangun proyek Anda melalui NPM:
npm installsudo npm install -g @vue/cli
sudo vue ui --dev --port 8061 Buka http://localhost:8061/ .
Impor Direktori Proyek.
Pilih Tasks , seperti build/test ...
Tugas dapat diubah di package.json .
Catatan: Kami menggunakan package.json hanya untuk tugas. Conan dikendalikan oleh file yang disebut conanfile.txt.
Tautan yang berguna:
Kami menggunakan .gdbinit add 'add-auto-load-safe-path.'
Untuk detail lebih lanjut tentang .gdbinit , baca: https://metricpanda.com/tips-for-productive-debugging-with-gdb
Untuk detail lebih lanjut tentang gdb , baca: http://www.yolinux.com/tutorials/gdb-commands.html
Sesi debugging GDB dapat diotomatisasi seperti itu:
# 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} Pastikan Anda menggunakan Debug build dengan -e flextool:enable_llvm_tools=True .
Untuk detailnya, lihat:
Instal Valgrind:
sudo apt install valgrind # Ubuntu, Debian, etc.
# OR
sudo yum install valgrind # RHEL, CentOS, Fedora, etc. Catatan: Pastikan Anda mengatur use_alloc_shim=False dan enable_valgrind=True (lihat di bawah).
Jalankan Valgrind via CMake:
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 Untuk menemukan kebocoran, Anda dapat menjahit karena definitely lost dalam file log.
Catatan: Anda dapat menambahkan penekan valgrind di cmake/valgrind.cfg .
Catatan: Kompilasi program dengan bendera debug untuk dijalankan di bawah Valgrind.
Catatan: Gunakan valgrind --tool=helgrind untuk mendeteksi kebuntuan potensial dan balapan data.
Catatan: Gunakan valgrind --tool=massif --massif-out-file=massif_file --stacks=true untuk mengukur ukuran heap. Lihat juga: https://kde.org/applications/development/org.kde.massif-visualizer
Untuk detailnya, lihat: https://stackoverflow.com/a/44989219
TODO: Cobalah untuk membangun dengan Valgrind dan Clang 10 https://stackoverflow.com/questions/40509986/valgrind-reporting-mismatched-free-delete-delete
TODO: Valgrind tidak dapat mendukung basis kromium, fixMe. Dan hapus gtest_no_suite
Pastikan Anda menggunakan Debug build dengan -e flextool:enable_llvm_tools=True
Instal Clang-Tidy:
sudo apt-get install clang-tidy # Ubuntu, Debian, etc.
# OR
sudo yum install clang-tidy # RHEL, CentOS, Fedora, etc. Penggunaan (menjalankan cmake dengan -DENABLE_CLANG_TIDY=ON ):
# creates local build in separate folder and runs cmake targets
cmake -DCLANG_TIDY= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake Pastikan Anda menggunakan Debug build dengan -e flextool:enable_llvm_tools=True
Untuk detailnya, lihat: https://chromium.googlesource.com/chromium/src.git/+/master/docs/clat_static_analyzer.md dan https://clat-analyzer.llvm.org/scan-build.html
Program CCC-Analyzer bertindak seperti kompiler palsu, meneruskan argumen baris perintahnya ke kompiler untuk melakukan kompilasi dan dentingan reguler untuk melakukan analisis statis.
Menjalankan Configure biasanya menghasilkan makefiles yang memiliki jalur hardwired ke kompiler, dan dengan menjalankan konfigurasi melalui pemindaian-build bahwa jalur diatur ke 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 Buka file scanbuildout/...../index.html
Pastikan Anda menggunakan Debug build dengan -e flextool:enable_llvm_tools=True
Untuk detailnya, lihat: https://github.com/myint/cppclean
Instalasi:
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 Penggunaan (menjalankan cmake dengan -DENABLE_CPPCLEAN=ON ):
# creates local build in separate folder and runs cmake targets
cmake -DCPPCLEAN= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake CATATAN: CPPCLEAN membutuhkan pengkodean file untuk: UTF-8 without BOM (ASCII)
Pastikan Anda menggunakan Debug build dengan -e flextool:enable_llvm_tools=True
Sertakan apa yang Anda gunakan (IWYU) adalah proyek yang dimaksudkan untuk dioptimalkan.
Ini akan menghitung header yang diperlukan dan menambah / menghapus termasuk yang sesuai.
Untuk detailnya, lihat: https://include-what-you-use.org/
Penggunaan (menjalankan cmake dengan -DENABLE_IWYU=ON ):
# creates local build in separate folder and runs cmake targets
cmake -DIWYU= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake Codestyle: gunakan // IWYU pragma: associated dalam file sumber C ++.
Catatan: Baca tentang Iwyu Pragma: https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/iwyupragmas.md
Catatan: Jangan gunakan "bit/" atau "/detail/*" termasuk, tambahkan mereka ke file pemetaan (.Imp)
Untuk detailnya, lihat:
Gunakan -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=DebugUntuk detailnya, lihat: https://www.virag.si/2015/07/use-ccache-with-cmake-for-faster-compilation/
Untuk mendapatkan hasil maksimal dari ccache, taruh sesuatu seperti ini: ~/.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 CATATAN: base_dir diperlukan untuk CCACHE untuk berbagi kompilasi yang di -cache dari file yang sama di berbagai repositori / jalur; Ini hanya akan melakukan ini untuk jalur di bawah base_dir . Jadi opsi ini diperlukan untuk penggunaan ccache yang efektif dengan Git Worktrees (dijelaskan di bawah).
Anda tidak boleh mengatur base_dir ke "/", atau di mana saja yang berisi header sistem (sesuai dengan dokumen CCACHE).
Instalasi:
sudo apt-get install ccache
# On OS X use homebrew:
# brew install ccache
ccache --version Gunakan -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=DebugUntuk detailnya, lihat: https://cristianadam.eu/20170709/speeding-in-d-cmake/
Catatan: Emas tidak berulir secara default, konfigurasikan dengan "--enable-threads"
CATATAN: LLD berulir secara default, mungkin lebih cepat dari emas
Pastikan Anda menggunakan Debug build dengan -e flextool:enable_llvm_tools=True
Untuk detailnya, lihat: https://oclint-docs.readthedocs.io/stable/devel/codingstandards.html
Instalasi:
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 Penggunaan (menjalankan cmake dengan -DENABLE_OCLINT=ON ):
# 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.htmlBuka Report.html
Lihat Oclint Tutorial: http://docs.oclint.org/en/stable/intro/tutorial.html
Lihat Daftar Peraturan Oclint di: https://oclint-docs.readthedocs.io/en/stable/rules/
Catatan: Anda dapat menekan peringatan oclint http://docs.oclint.org/en/stable/howto/suppress.html#oclint-comment
Untuk detailnya, lihat: https://lat.llvm.org/docs/clatformat.html
Penggunaan (menjalankan cmake dengan -DENABLE_CLANG_FORMAT=ON ):
# creates local build in separate folder and runs cmake targets
cmake -DCLANG_FORMAT= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake Kami menggunakan file .clang-format . Untuk detailnya, lihat: https://clat.llvm.org/docs/likformatstyleoptions.html
CATATAN: Kami menggunakan DisableFormat , jadi dentang-format hanya akan berubah termasuk pesanan berdasarkan SortIncludes .
Sayangnya, clang-format tidak cukup dapat dikonfigurasi, sehingga hanya dapat digunakan untuk mengurutkan. Lihat: https://stackoverflow.com/a/32191189
Kami menggunakan Bacause-format dan Astyle yang tidak rencanakan tidak mendukung banyak opsi.
Untuk detailnya, lihat: https://patrickhenson.com/2018/06/07/uncrustify-configuration.html
Instalasi:
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 Penggunaan (menjalankan cmake dengan -DENABLE_UNCRUSTIFY=ON ):
# creates local build in separate folder and runs cmake targets
cmake -DUNCRUSTIFY= " ON " -DCLEAN_OLD= " ON " -P tools/run_tool.cmake Kami menggunakan file uncrustify.cfg . Untuk detailnya, lihat: https://patrickhenson.com/2018/06/07/uncrustify-configuration.html
Untuk mendapatkan daftar semua opsi yang tersedia, gunakan:
uncrustify --show-configUncrustify memiliki banyak opsi yang dapat dikonfigurasi. Anda mungkin membutuhkan GUI Indent Universal (dalam balasan Konstantin) juga untuk mengonfigurasinya: http://universalindent.sourceForge.net/
Gunakan komentar yang berisi /* *INDENT-OFF* */ dan /* *INDENT-ON* */ untuk menonaktifkan pemrosesan bagian-bagian dari file sumber.
Lihat disable_processing_cmt dari uncrustify.cfg :
# 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 Anda dapat uncrustify dengan IDE: IDE:
Lihat https://github.com/blockspacer/llvm_9_installer#how-to-use-sush-sanitizers
Membutuhkan enable_llvm_tools=True , compile_with_llvm_tools=True , dan 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 menginstal Clang 10 dari Conancompile_with_llvm_tools mengatur variabel cmake diperlukan untuk menggunakan dentang 10 dari conan Jalankan conan install atau conan create dengan:
# OR create conan profile https://docs.conan.io/en/latest/reference/profiles.html
-s compiler=clang
-s compiler.version=10
-s compiler.libcxx=libc++ Catatan: Perubahan kompiler mungkin memerlukan pembangunan kembali dari semua DEP ( --build=missing ).
Contoh dalam kasus bangunan lokal:
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_10Lakukan cek:
# check that `libcpp` symbol exists
nm -an EXECUTABLE_PATH | grep libcpp
# list linked dynamic libs
ldd EXECUTABLE_PATH MCSS_ROOT_DIR_FOR_DOCS harus menunjuk ke sumber m.css seperti di bawah ini:
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 Gunakan cmake build dengan '--sarget doxydoc' dan -DBUILD_DOXY_DOC=ON
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 * .htmlBuka doxydoc/html/index.html
CATATAN: Dokumen Namespaces di Docs/Namespaces.dox
Catatan: File, direktori, dan simbol tanpa dokumentasi tidak ada di output sama sekali
Gaya komentar bekas:
/ **
* @brief Path utils
*
* Example usage:
*
* @code{.cpp}
* const ::fs::path workdir = storage::getThisBinaryDirectoryPath ();
* @endcode
** /Melihat:
Untuk detailnya, lihat: https://afl-1.readthedocs.io/en/latest/index.html
CATATAN: Lebih suka github.com/google/afl atau aflplus.plus untuk tidak diperbarui afl dari lcamtuf.coredump.cx/afl
Fuzzing adalah teknik pengujian perangkat lunak kotak hitam.
Fuzzing terdiri dalam menemukan bug implementasi menggunakan injeksi data yang cacat/semi-malformasi secara otomatis.
Fuzzer mencoba memodifikasi input sehingga dapat mencapai sebanyak mungkin baris kode program.
Oleh karena itu, fuzzing memungkinkan penemuan kerentanan yang terletak di jalur kode yang sulit dijangkau dengan penggunaan normal.
Instal + Kompilasi kode sumber menggunakan perintah berikut:
# 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 Kami mengkompilasi kode menggunakan kompiler AFL: -DCMAKE_C_COMPILER=afl-clang-fast , -DCMAKE_CXX_COMPILER=afl-clang-fast++ , dan -DCMAKE_LINKER=afl-clang-fast .
Untuk memverifikasi apakah biner menggunakan kompiler AFL: nm BINARY_PATH | grep afl
Untuk membangun aplikasi dengan beberapa pembersih dan informasi debug diaktifkan: ( -DENABLE_ASAN=ON dll.):
Catatan: Ada beberapa hal yang perlu dipertimbangkan saat menggunakan pembersih alamat. Bahkan jika Asan menemukan pelanggaran akses memori, itu tidak secara otomatis merusak aplikasi. Ini adalah masalah saat menggunakan alat fuzzing otomatis karena mereka biasanya mencoba mendeteksi segfault dengan memeriksa kode pengembalian. Namun, kita dapat memaksa asan untuk merusak perangkat lunak ketika kesalahan terjadi dengan variabel lingkungan asan_options sebelum fuzzing: export ASAN_OPTIONS='abort_on_error=1'
Catatan: Nonaktifkan fungsi alokasi memori khusus. Ini dapat menyembunyikan bug akses memori dan mencegah deteksi kesalahan akses memori.
# 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. Catatan: Gunakan AFL_DONT_OPTIMIZE=1 ; Baca: http://moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-art.html
Untuk detailnya, lihat: Menggunakan asan dengan AFL
Sebelum memecahkan program, kami mungkin memerlukan pengalihan ke pengguna root untuk mengatur core_pattern. Masuk sebagai root dan ketik perintah berikut:
# 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
exitCatatan: Jangan jalankan fuzzer dengan akses root
Catatan: Dapatkan lingkungan yang solid untuk fuzzer; Jangan pernah menjalankan fuzzer pada hypervisor yang dikonfigurasi rendah.
afl-fuzz digunakan untuk menjalankan AFL. Sintaks yang sebenarnya adalah sebagai berikut:
# 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_capstoneUntuk memahami layar status AFL, baca: https://afl-1.readthedocs.io/en/latest/user_guide.html#status-screen
Catatan: Jika total paths tetap pada 1 Anda mungkin telah menyiapkan sesuatu yang salah.
CATATAN: lebih suka -m none . Kami menggunakan alamat ALAMAT; Ini memetakan banyak halaman untuk memori bayangan, jadi kita harus menghapus batas memori agar tetap dan berjalan.
Catatan: Dengan -m none , perangkat lunak fuzzed Anda mungkin benar -benar mencoba untuk benar -benar mengalokasikan dan menggunakan banyak memori karena sampel fuzzed Anda. Ini dapat menyebabkan kerusakan acak di sistem Anda. Anda seharusnya tidak melakukan pekerjaan penting saat melakukannya.
Catatan: Anda dapat mencoba ASAN_OPTIONS=hard_rss_limit_mb=2000 untuk menghindari -m none . Lihat: https://countuponsecurity.com/category/fuzzing/
Anda dapat menulis biner khusus yang akan berjalan menggunakan afl-fuzz . Ini mungkin membungkus fungsi yang ingin Anda uji seperti itu:
// 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 ;
} Catatan: __afl_loop () memungkinkan AFL untuk melakukan fuzzing biner dalam proses melalui beberapa sihir memori, sebagai lawan memulai proses baru untuk setiap testcase baru yang ingin kami uji. Membutuhkan AFL_PERSISTENT=1 .
Secara default, AFL menggabungkan proses setiap kali menguji input yang berbeda. Kami dapat mengontrol AFL untuk menjalankan beberapa kasus fuzz dalam satu contoh program, daripada mengembalikan status program kembali untuk setiap sampel uji. Ini akan mengurangi waktu yang dihabiskan di ruang kernel dan meningkatkan kecepatan fuzzing. Ini disebut mode AFL_PERSISTENT. Kita dapat melakukannya dengan memasukkan makro __afl_loop (1000) dalam harness uji kami.
Catatan: Anda mungkin tertarik pada __afl_init; Lihat detailnya: https://robertheaton.com/2019/07/08/how-to-write-an-afl-wrapper-for-any-language/
Biarkan fuzzer berjalan selama beberapa jam atau hari karena menghasilkan jalur eksekusi kode maksimum berdasarkan kasus uji yang disediakan.
Berhenti Fuzzing Mengeluarkan ctrl+c' observing Jalur Total and Uniq Crashes in the section Hasil Keseluruhan` dari Layar Statistik AFL.
Buat kamus yang mengambil semua konstanta dan string yang ditemukan dalam biner program dan menambahkannya ke kamus. Lihat Kode Script: http: //moyix.blogspot.com/2016/07/fuzzing-with-afl-is-an-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 ] ; doneAnda perlu membuat kamus dalam salah satu dari dua format yang dibahas dalam kamus/readme. Baca: https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries dan https://github.com/mirrorer/afl/blob/master/dictionaries/readme.dictionaries
Anda juga dapat menggunakan libtokencap untuk membuat kamus; Lihat: https://github.com/mirrorer/afl/blob/master/libtokencap/readme.tokencap
Kami dapat menemukan kasus uji yang menyebabkan crash di folder results yang telah kami buat. Saat menavigasi ke results folder, kami mengamati beberapa folder dihasilkan.
Catatan: Simpan file data input kecil; Di bawah 1 KB sangat ideal.
Gunakan afl-cmin untuk meminimalkan jumlah file data input.
Gunakan afl-tmin untuk meminimalkan setiap file data input (menghapus byte apa pun yang tidak mempengaruhi jalur kode yang diambil).
Gunakan afl-ptmin untuk menjalankan afl-tmin secara paralel. Untuk detailnya, lihat: https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/
Untuk mereproduksi crash yang ditemukan, Anda dapat menggunakan crashwalk (itu plugin GDB), lihat: https://ritcsec.wordpress.com/2018/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 @@Ketika Anda tidak dapat mereproduksi kecelakaan yang ditemukan oleh AFL-Fuzz, penyebab yang paling mungkin adalah Anda tidak mengatur batas memori yang sama seperti yang digunakan oleh alat. Baca: https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-Binaries
Catatan: Anda dapat menggunakan afl-cov untuk mengukur seberapa baik Anda menggunakan jalur kode yang tersedia dalam biner. Untuk detailnya, lihat: https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/
Catatan: Menempatkan direktori kerja AFL pada disk RAM, Anda berpotensi mendapatkan kecepatan tambahan dan menghindari memakai disk pada saat yang sama. Untuk detailnya, lihat: 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/ CATATAN: -fvisibility-inlines-hidden dapat merusak instrumentasi AFL
AFL menyediakan skrip eksplorasi crash di experimental/crash_triage/triage_crashes.sh
Saat dijalankan, skrip triase akan bersepeda melalui setiap file crash di direktori /out/crashes dan cetak data crash yang dihasilkan ke layar.
triage_crashes penggunaan: ./triage_crashes.sh ~/targets/out/ ~/targets/target-app/target-app_binary untuk detailnya, lihat: https://research.aurainfosec.io/hunting-for-bugs-101/
Catatan: Instrumen dengan AFL hanya perpustakaan yang sebenarnya ingin Anda uji stres sekarang, satu per satu. Biarkan program menggunakan perpustakaan di seluruh sistem, non-instrumented untuk fungsionalitas apa pun yang sebenarnya tidak ingin Anda fuzz.
Catatan: Anda dapat mengaktifkan crash exploration mode via -C ; Lihat: https://lcamtuf.blogspot.com/2014/11/afl-fuzz-crash-exploration-mode.html
CATATAN: AFL mendeteksi kesalahan dengan memeriksa proses yang dimuncang pertama karena sinyal (Sigsegv, SigabrT, dll). Program yang menginstal penangan khusus untuk sinyal -sinyal ini mungkin perlu memiliki kode yang relevan dikomentari.
Untuk detailnya, lihat:
Libfuzzer adalah bagian dari Proyek Infrastruktur Kompiler LLVM dan dilengkapi dengan kompiler dentang.
Kemudian libfuzzer dapat ditautkan ke driver yang diinginkan dengan meneruskan di -fsanitize=fuzzer selama tahap penghubung.
Catatan: -fsanitize=fuzzer dalam simbol libfuzzer () simbol.
CATATAN: Dalam kebanyakan kasus Anda mungkin ingin menggabungkan libfuzzer dengan addressanitizer (asan), tidak terdefinasibehaviorsanitizer (UBSAN), atau keduanya. Anda juga dapat membangun dengan MemorySanitizer (MSAN), tetapi dukungan bersifat eksperimental: -fsanitize=undefined,address,fuzzer .
Dieksekusi berulang kali memanggil fungsi berikut:
extern " C " int LLVMFuzzerTestOneInput ( const uint8_t *Data, size_t Size ) {
// DoStuffWithYourAPI(Data, Size);
return 0 ;
} Gunakan -fsanitize=address,fuzzer . Perhatikan bahwa Anda dapat mengubah pembersih (alamat, memori, utas, dll.).
Catatan: Jika Anda mencurigai kebocoran memori di target Anda, Anda harus menjalankan libfuzzer dengan -runs=N atau -max_total_time=N . Jika target Anda memiliki kebocoran besar, Anda akhirnya akan kehabisan RAM. Untuk melindungi mesin Anda dari kematian OOM, Anda dapat menggunakan: ASAN_OPTIONS=hard_rss_limit_mb=2000 (dengan alamatsanitizer).
Libfuzzer membutuhkan corpus benih. Untuk detailnya, lihat: https://github.com/google/fuzzing/blob/master/tutorial/libfuzzertutorial.md
Untuk detailnya, lihat:
Clang mendukung anotasi keselamatan utas (Guarded_by)
-Wthread-safety-analysisbase/thread_annotations.h https://github.com/chromium/chromium/blob/master/base/thread_annotations.h untuk detailnya, lihat:Dukungan kelas satu dentang untuk pembersih. Lihat detail tentang MSAN, Asan, Tsan, dll. Di Docs.
Dentang dapat dibangun dengan profil seumur hidup:
-Wlifetime untuk detailnya, lihat:Semua komponen open source digunakan di bawah lisensi open source yang terkait.
Menggunakan komponen open source:
Lihat file lisensi
Lisensi MIT
Lihat lisensi untuk konten lengkap lisensi.
Proyek open source itu berdasarkan proyek Google Chromium.
Ini bukan produk Google resmi.
Porsi Hak Cipta (C) Google Inc.
Lihat file lisensi.