Полностью открытый исходный код, мощное решение для модификации и генерации исходного кода 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/ Руководство по установке
Конан Пакеты
ПРИМЕЧАНИЕ: CLING с Build LLVM может занять пару часов.
Команда ниже используется --profile clang12_compiler12_compiler .
Пример профиля 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/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Перед созданием файла профиля Конана см.: 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 . Перед созданием файла профиля Конана см.: Https://docs.conan.io/en/latest/using_packages/using_profiles.html.
Мы используем скрипт buildConanThirdparty.cmake для загрузки и установки пакетов Conan.
Примечание. Установите -DENABLE_CLING=FALSE если вы уже установили Cling, используя 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 . Перед созданием файла профиля Конана см.: 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 может потерпеть неудачу.
Этот проект возможен из -за autoprogrammer Flexferrum.
Статьи об autoprogrammer Flexferrum в СМИ:
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 (Справочник по сбору сборки на путь рабочего пространства)!
Подробнее см.: 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_testsWorkspace позволяет быстро изменить существующие исходные файлы.
Мы используем self.in_local_cache для обнаружения редактируемого режима 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 )Убедитесь, что все цели имеют глобально уникальные имена.
Например: вы не можете иметь цель в каждом проекте с тем же именем, таким как «тест». Вы можете решить эту проблему, добавив префикс-специфический для проекта к имени каждой цели, например, «$ {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 Используйте add_dependencies в 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 Добавить параметры плагинов в 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 Убедитесь, что вы используете сборку Debug с -e flextool:enable_llvm_tools=True .
Установите cppcheck через 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 Использование (запускает CMAKE с -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.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 'Add-Auto-Load-Safe-Path.'
Для получения более подробной информации о .gdbinit , прочитайте: https://metricpanda.com/tips-for-production-debugging-with-gdb
Для получения более подробной информации о gdb , прочитайте: http://www.yolinux.com/tutorials/gdb-commands.html
Сессия отладки GDB может быть автоматизирована как SO:
# 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} Убедитесь, что вы используете сборку 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 (см. Ниже).
Запустите Valgrind через 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 Чтобы найти утечки, вы можете снять definitely lost в файле журнала.
Примечание. Вы можете добавить подавления Valgrind в cmake/valgrind.cfg .
Примечание: программа компиляции с флагом отладки для работы под Valgrind.
Примечание. Используйте valgrind --tool=helgrind чтобы обнаружить потенциальные тупики и расы данных.
ПРИМЕЧАНИЕ. Используйте valgrind --tool=massif --massif-out-file=massif_file --stacks=true для измерения размера кучи. См. Также: https://kde.org/applications/development/org.kde.massif-visualizer
Для получения подробной информации см.: Https://stackoverflow.com/a/44989219
TODO: Попробуйте построить с Valgrind и Clang 10 https://stackoverflow.com/questions/40509986/valgrind-reporting-domisceed-free-delete-delete
TODO: Valgrind может не поддерживать базу хрома, fixme. И удалить gtest_no_suite
Убедитесь, что вы используете сборку 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. Использование (запускает CMAKE с -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 Убедитесь, что вы используете сборку Debug с -e flextool:enable_llvm_tools=True
Подробнее см.: Https://chromium.googlesource.com/chromium/src.git/+/master/docs/clang_static_analyzer.md и https://clang-analyzer.llvm.org/scan-build.html
Программа CCC-Analyzer действует как фальшивый компилятор, передавая свои аргументы командной строки компилятору для выполнения регулярного компиляции и Clang для выполнения статического анализа.
Запуск Configure Обычно генерирует MakeFiles, которые имеют жесткие пути к компилятору, и путем запуска настройки через Scan-Build этот путь устанавливается на 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 Open Resulting scanbuildout/...../index.html файл
Убедитесь, что вы используете сборку 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 Использование (запускает CMAKE с -DENABLE_CPPCLEAN=ON ):
# 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)
Убедитесь, что вы используете сборку Debug с -e flextool:enable_llvm_tools=True
Включите, что вы используете (iwyu),-это проект, предназначенный для оптимизации включения.
Он будет рассчитывать требуемые заголовки и добавить / удалить включает в себя в зависимости от необходимости.
Для получения подробной информации см.: Https://include-wathat-you-use.org/
Использование (запускает CMAKE с -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: Использование // IWYU pragma: associated в исходных файлах C ++.
ПРИМЕЧАНИЕ. Прочитайте об iwyu Pragmas: https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/iwyupragmas.md
ПРИМЕЧАНИЕ. Не используйте «биты/» или «/detail/*», включайте, добавьте их в файл сопоставления (.IMP)
Подробнее см.:
Использовать -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-ccache-with-cmake-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 Примечание: base_dir требуется для CCache, чтобы обмениваться кэшированными компиляциями одного и того же файла в разных репозиториях / путях; Это сделает это только для путей под base_dir . Таким образом, этот вариант требуется для эффективного использования CCACHE с рабочими GIT (описано ниже).
Вы не должны устанавливать 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-cmake/
ПРИМЕЧАНИЕ. Золото не по умолчанию, настраивайтесь с "-enable-threads"
Примечание: LLD по умолчанию может быть быстрее, чем золото
Убедитесь, что вы используете сборку 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 Использование (запускает CMAKE с -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.htmlOpen Report.html
См. Учебник Oclint: http://docs.oclint.org/en/stable/intro/tutorial.html
См. Список правил Oclint по адресу: 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
Использование (запускает CMAKE с -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 Мы используем файл .clang-format . Подробнее см.: Https://clang.llvm.org/docs/clangformatstyleoptions.html
Примечание. Мы используем DisableFormat , поэтому Clang-Format изменится только по заказу на основе SortIncludes .
К сожалению, clang-format недостаточно настраивается, поэтому его можно использовать только для сортировки. См.: Https://stackoverflow.com/a/32191189
Мы используем Uncrustify Bacause Clang-формат, а 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 Использование (запускает cmake с -DENABLE_UNCRUSTIFY=ON ):
# 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-configUncrustify имеет много настраиваемых вариантов. Вам, вероятно, понадобится универсальный графический интерфейс (в ответе Константина), чтобы настроить его: http://universalindent.sourceforge.net/
Используйте комментарии, содержащие /* *INDENT-OFF* */ и /* *INDENT-ON* */ для отключения обработки частей исходного файла.
См. disable_processing_cmt из 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 Вы можете интегрировать uncrustify с IDE:
См
Требуется enable_llvm_tools=True , compile_with_llvm_tools=True , и 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 10 из Conancompile_with_llvm_tools устанавливает переменные cmake, необходимые для использования Clang 10 из Conan Запустите 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 Используйте Cmake Build с '-target doxydoc' и -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 * .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 не обновлять AFL от lcamtuf.coredump.cx/afl
Fuzzing - это метод тестирования программного обеспечения Black Box.
Fuzzing состоит в поиске ошибок в реализации с использованием узолового/полуосмысленного впрыска данных автоматизированным образом.
Fuzzer пытается изменить вход, чтобы он мог достичь как можно больше строк программы.
Следовательно, Fuzzing позволяет обнаружить уязвимостей, лежащих в кодовых путях, которые трудно достичь при нормальном использовании.
Установить + составьте исходный код, используя следующие команды:
# 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 и т. Д.):
Примечание: есть некоторые вещи, которые следует учитывать при использовании дезинфицирующего средства. Даже если Асан находит нарушение доступа к памяти, он не автоматически срабатывает приложение. Это проблема при использовании автоматизированных инструментов пузырьков, потому что они обычно пытаются обнаружить Segfaults, проверяя код возврата. Однако мы можем заставить Асан сбой программного обеспечения, когда возникает ошибка с переменной среды asan_options перед Fuzzing: 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-is-an-art.html
Для получения подробной информации см.: Использование ASAN с AFL
Перед пупзением программы нам может потребоваться переключение на root user, чтобы распорядиться 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Примечание: не запускайте Fuzzer с корнем доступа
Примечание. Получите твердую среду для Fuzzer; Никогда не запускайте 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-creen
ПРИМЕЧАНИЕ. Если total paths остается на уровне 1, у вас, вероятно, что -то не так.
ПРИМЕЧАНИЕ: предпочитаю -m none . Мы используем AddressSanitizer; Это отображает множество страниц для теневой памяти, поэтому мы должны удалить предел памяти, чтобы его запустить.
Примечание. С -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 выполнять пузырь двоичного файла в процессе через некоторое мастерство памяти, в отличие от запуска нового процесса для каждого нового TestCase, который мы хотим протестировать. Требуется AFL_PERSISTENT=1 .
По умолчанию AFL разбивает процесс каждый раз, когда он тестирует другой вход. Мы можем управлять AFL для запуска нескольких случаев нефтяных случаев в одном экземпляре программы, а не возвращать состояние программы обратно для каждого тестового образца. Это уменьшит время, проведенное в пространстве ядра, и улучшит скорость пушина. Это называется режим AFL_PERSISTENT. Мы можем сделать это, включив макрос __afl_loop (1000) в нашу тестовую жгут.
ПРИМЕЧАНИЕ. Вы можете быть заинтересованы в __afl_init; См. Подробности: https://robertheaton.com/2019/07/08/how-to-write-an-afl-wrapper-for-any-language/
Пусть Fuzzer работает в течение нескольких часов или дней, поскольку он генерирует максимальные пути выполнения кода на основе предоставленных тестовых случаев.
Остановите пузырь, выпускающий ctrl+c' observing общим количеством путей and аварии UNIQ in the section «Экрана статистики AFL».
Создайте словарь, который берет все константы и струны, найденные в бинарном бинарстве, и добавляет их в словарь. См. Код сценария: 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 ] ; doneВам необходимо создать словарь в одном из двух форматов, обсуждаемых в словарях/readme.dictionaries, а затем указать на него раздумку через опцию -x в командной строке. Читайте: https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries и https://github.com/mirrorer/afl/blob/master/dictionaries/readme.dictionary
Вы также можете использовать libtokencap для создания словаря; См.: https://github.com/mirrorer/afl/blob/master/libtokencap/readme.tokencap
Мы можем найти тестовые случаи, которые вызывают сбой в папке results , которую мы создали. При навигации до results папки мы наблюдаем, как генерируется несколько папок.
Примечание: сохраните входные файлы данных маленькими; до 1 КБ идеально.
Используйте afl-cmin чтобы минимизировать количество файлов входных данных.
Используйте afl-tmin , чтобы минимизировать каждый файл входных данных (удаляет любые байты, которые не влияют на пути кода).
Используйте afl-ptmin для запуска afl-tmin параллельно. Для получения подробной информации см.: Https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/
Чтобы воспроизвести обнаруженные сбои, вы можете использовать crashwalk (это плагин GDB), см.
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-from-start-to-finish/
ПРИМЕЧАНИЕ. Поместив рабочий каталог AFL на оперативную диску, вы можете получить дополнительную скорость и одновременно избегать изнашивания дисков. Подробнее см.: 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 иннома
AFL предоставляет сценарий разведки с аварией в experimental/crash_triage/triage_crashes.sh
При запуске скрипт сортировки будет проходить через каждый файл сбоя в каталоге /out/crashes и распечатывает полученные данные о сбое на экран.
triage_crashes Использование: ./triage_crashes.sh ~/targets/out/ ~/targets/target-app/target-app_binary для получения подробной информации см.
Примечание: инструмент с AFL только библиотеки, которые вы действительно хотите, чтобы испытать стресс сейчас, по одному. Пусть программа использует общеобразовательную, неисстроенную библиотеки для любых функций, которые вы на самом деле не хотите раздуваться.
Примечание. Вы можете включить crash exploration mode через -C ; См.: https://lcamtuf.blogspot.com/2014/11/afl-fuzz-crash-exploration-dode.html
ПРИМЕЧАНИЕ. AFL обнаруживает неисправности, проверяя на первое породимое процесс, умирающий из -за сигнала (Sigsegv, Sigabrt и т. Д.). Программы, которые устанавливают пользовательские обработчики для этих сигналов, могут потребоваться прокомментировать соответствующий код.
Подробнее см.:
Libfuzzer является частью проекта инфраструктуры компилятора LLVM и встроен в встроенный компилятор Clang.
Тогда Libfuzzer может быть связан с желаемым водителем, передавая -fsanitize=fuzzer во время стадии связывания.
-fsanitize=fuzzer .
Примечание. В большинстве случаев вы можете объединить либфузззер с адресатом AddressSanitizer (ASAN), UndefinedBehaviorsAnitizer (UBSAN) или оба. Вы также можете построить с помощью Memorysanitizer (MSAN), но поддержка является экспериментальной: -fsanitize=undefined,address,fuzzer .
Исполняемый файл неоднократно вызывает следующую функцию:
extern " C " int LLVMFuzzerTestOneInput ( const uint8_t *Data, size_t Size ) {
// DoStuffWithYourAPI(Data, Size);
return 0 ;
} Использовать -fsanitize=address,fuzzer . Обратите внимание, что вы можете изменить дезинфицирующее средство (адрес, память, поток и т. Д.).
ПРИМЕЧАНИЕ. Если вы подозреваете утечки памяти в своей цели, вы должны запустить Libfuzzer с -runs=N или -max_total_time=N . Если у вашей цели есть огромные утечки, у вас в конечном итоге закончится оперативная память. Чтобы защитить свою машину от OOM Death, вы можете использовать: ASAN_OPTIONS=hard_rss_limit_mb=2000 (с адресазанизаторизаторами).
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/blob/master/base/thread_annotations.h для получения подробной информации см.Кланг FAS Первоклассная поддержка дезинфицирующих средств. Смотрите подробности о MSAN, ASAN, TSAN и т. Д. В DOCS.
Clang можно построить с профилем пожизненного времени:
-Wlifetime для получения подробной информации, см.:Все компоненты с открытым исходным кодом используются в соответствии с их связанными лицензиями с открытым исходным кодом.
Использовали компоненты с открытым исходным кодом:
См. Файлы лицензии
Лицензия MIT
Смотрите лицензию на полное содержание лицензий.
Этот проект с открытым исходным кодом на основе проекта Google Chromium.
Это не официальный продукт Google.
Порции Copyright (C) Google Inc.
См. Файлы лицензии.