حل مفتوح بالكامل وقوي لتعديل وتوليد رمز المصدر C ++. تقليل كمية رمز Boilerplate في مشاريع C ++ الخاصة بك.
صفحة المشروع الرئيسية: https://blockspacer.github.io/flex_docs/
تم اختباره على Ubuntu 20.04.2 LTS.
قد تعمل على منصات أخرى مع تعديلات طفيفة.
لتكون قادرًا على إضافة قائمة أجهزة التحكم عن بعد التبعية ، يرجى كتابة الأمر التالي:
cmake -E time conan config install conan/remotes/
# OR:
# cmake -E time conan config install conan/remotes_disabled_ssl/ دليل التثبيت
حزم كونان
ملاحظة: قد يستغرق التشبث مع بناء LLVM بضع ساعات.
يستخدم الأمر أدناه --profile clang12_compiler12_compiler .
مثال Conan profile ~/.conan/profiles/clang :
[ settings ]
# We are building in Ubuntu Linux
os_build=Linux
os=Linux
arch_build=x86_64
arch=x86_64
compiler=clang
compiler.version=10
compiler.libcxx=libstdc++11
[ env ]
CC=/usr/bin/clang-10
CXX=/usr/bin/clang++-10
[ build_requires ]
cmake_installer/3.15.5@conan/stableإنشاء ملف تعريف clang12_compiler:
[settings]
# We are building in Ubuntu Linux
os_build=Linux
os=Linux
arch_build=x86_64
arch=x86_64
compiler=clang
compiler.version=12
compiler.libcxx=libstdc++11
compiler.cppstd=17
llvm_9:build_type=Release
[env]
CC=/usr/bin/clang-12
CXX=/usr/bin/clang++-12
[build_requires]
cmake_installer/3.15.5@conan/stableقبل إنشاء ملف تعريف Conan ، راجع: https://docs.conan.io/en/latest/using_packages/using_profiles.html.
نستخدم .cmake Script لتنزيل وتثبيت حزم 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 إذا كنت ترغب في تثبيت Flextool والإضافات الخاصة به في أمر واحد ، فقم بتغيير الخيارات المقدمة إلى tools/buildConanThirdparty.cmake .
ملاحظة: tools/buildConanThirdparty.cmake ستقوم بإعادة بناء كاملة ؛ قد يستغرق الأمر بضع ساعات.
يستخدم الأمر أدناه --profile clang12_compiler12_compiler . قبل إنشاء ملف تعريف Conan ، راجع: https://docs.conan.io/en/latest/using_packages/using_profiles.html.
نستخدم برنامج buildConanThirdparty.cmake Script لتنزيل وتثبيت حزم Conan.
ملاحظة: set -DENABLE_CLING=FALSE إذا قمت بالفعل بتثبيت التشبث باستخدام tools/buildConanThirdparty.cmake أعلاه.
git clone https://github.com/blockspacer/conan_github_downloader.git ~ /conan_github_downloader
cmake
-DSCRIPT_PATH= " $PWD /get_conan_dependencies.cmake "
-DENABLE_CLING=TRUE
-DENABLE_LLVM=TRUE
-DENABLE_LLVM_INSTALLER=FALSE
-DENABLE_FLEXTOOL=TRUE
-DENABLE_BASIS_PLUGIN_HELPER=TRUE
-DENABLE_FLEX_REFLECT_PLUGIN=TRUE
-DENABLE_SQUARETS=TRUE
-DENABLE_FLEX_SQUARETS_PLUGIN=TRUE
-DENABLE_FLEX_PIMPL_PLUGIN=TRUE
-DENABLE_FLEX_TYPECLASS_PLUGIN=TRUE
-DENABLE_FLEX_META_PLUGIN=TRUE
-DENABLE_FLEX_META_DEMO=TRUE
-DEXTRA_CONAN_OPTS= " --profile;clang12_compiler
;-s;build_type=Debug
;-s;cling_conan:build_type=Release
;-s;llvm_12:build_type=Release
;--build;missing "
-P ~ /conan_github_downloader/conan_github_downloader.cmake
# clean build cache
conan remove " * " --build --forceاستخدم الأمر أدناه لإعادة بناء flextool (يجب تثبيت المكونات الإضافية بشكل منفصل).
يستخدم الأمر أدناه --profile clang12_compiler12_compiler . قبل إنشاء ملف تعريف Conan ، راجع: https://docs.conan.io/en/latest/using_packages/using_profiles.html
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
# NOTE: change `build_type=Debug` to `build_type=Release` in production
# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`
cmake -E time
conan create . conan/stable
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
--profile clang12_compiler
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
# clean build cache
conan remove " * " --build --forcecompile_commands.jsonتعطيل توليد قاعدة بيانات التجميع عند استخدام Flextool.
إذا كنت تستخدم cmake ، فقم بتعيين CMAKE_EXPORT_COMPILE_COMMANDS إلى FALSE .
في حالة وجود compile_commands.json في مجلد البناء (أو في المجلد الأصل) ، فقد يفشل Flextool.
هذا المشروع ممكن بسبب 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 (تغيير دليل بناء إلى مسار PACEPACEPROJECT)!
للحصول على التفاصيل ، راجع: https://docs.conan.io/en/latest/developing_packages/workspaces.html
على سبيل المثال ، نريد بناء كل من Flextool و FlexLib في نفس الوقت (يتطلب Flextool flexlib).
# change ~ to desired build folder
cd ~
# Replace paths to yours!
# Make sure each project in NOT in editable mode!
cat << EOF > ~/conanws.yml
editables:
flexlib/master@conan/stable:
path: /......../flexlib
flextool/master@conan/stable:
path: /......../flextool
layout: layout_flex
workspace_generator: cmake
root:
- flextool/master@conan/stable
EOF
cat << EOF > ~/layout_flex
# This helps to define the location of CMakeLists.txt within package
[source_folder]
.
# This defines where the conanbuildinfo.cmake will be written to
[build_folder]
build/{{settings.build_type}}
EOF mkdir build_flex
cd build_flex
cat << EOF > CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(WorkspaceProject)
include( $ {CMAKE_BINARY_DIR}/conanworkspace.cmake)
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flexlib_SRC}/cmake")
list(PREPEND CMAKE_MODULE_PATH " $ {PACKAGE_flextool_SRC}/cmake")
conan_workspace_subdirectories()
add_dependencies(flextool flexlib)
EOF
# must contain `include(${CMAKE_BINARY_DIR}/conanworkspace.cmake)` without slash `` (slash added for bash cat command)
cat CMakeLists.txt
# combines options from all projects
conan workspace install
../conanws.yml
--profile=clang
-s build_type=Debug
-s cling_conan:build_type=Release
-s llvm_tools:build_type=Release
-o openssl:shared=True
-o chromium_base:shared=True
-e basis:enable_tests=True
-e abseil:enable_llvm_tools=True
-o chromium_base:use_alloc_shim=True
-o chromium_tcmalloc:use_alloc_shim=True
-o perfetto:is_hermetic_clang=False
-e flextool:enable_tests=True
-e flextool:enable_llvm_tools=True
-o flexlib:shared=False
-o flexlib:enable_clang_from_conan=False
-e flexlib:enable_tests=True بناء في مجلد تم إنشاؤه بواسطة conan workspace install :
# NOTE: change `build_type=Debug` to `build_type=Release` in production
export build_type=Debug
# optional
# remove old CMakeCache
(rm CMakeCache.txt || true)
# configure via cmake
cmake -E time cmake .
-DCMAKE_VERBOSE_MAKEFILE=TRUE
-DENABLE_TESTS=TRUE
-DBASE_NEED_GEN_BUILD_DATE=FALSE
-DENABLE_DOCTEST=ON
-DBUILD_SHARED_LIBS=FALSE
-DCONAN_AUTO_INSTALL=OFF
-DCMAKE_BUILD_TYPE= ${build_type}
# remove generated files
# change paths to yours
# rm ~/flex_typeclass_plugin/build/Debug/*generated*
# build code
cmake -E time cmake --build .
--config ${build_type}
-- -j8
# run unit tests for flexlib
cmake -E time cmake --build .
--config ${build_type}
--target flexlib_run_all_tests
# run unit tests for flextool
cmake -E time cmake --build .
--config ${build_type}
--target flextool_run_all_testsتتيح مساحة العمل إجراء تغييرات سريعة في ملفات المصدر الموجودة.
نستخدم self.in_local_cache للكشف عن الوضع القابل للتحرير:
# Local build
# see https://docs.conan.io/en/latest/developing_packages/editable_packages.html
if not self . in_local_cache :
self . copy ( "conanfile.py" , dst = "." , keep_path = False )تأكد من أن جميع الأهداف لها أسماء فريدة من نوعها.
على سبيل المثال: لا يمكنك الحصول على هدف في كل مشروع بنفس الاسم مثل "Test". يمكنك حل هذه المشكلة عن طريق إضافة بادئة خاصة بالمشروع لتسمية كل هدف مثل "$ {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 Build مع -e flextool:enable_llvm_tools=True .
تثبيت cppcheck عبر كونان:
cd /tmp
git clone -b testing/1.90 https://github.com/bincrafters/conan-cppcheck_installer.git
cd conan-cppcheck_installer
export VERBOSE=1
export CONAN_REVISIONS_ENABLED=1
export CONAN_VERBOSE_TRACEBACK=1
export CONAN_PRINT_RUN_COMMANDS=1
export CONAN_LOGGING_LEVEL=10
# NOTE: change `build_type=Debug` to `build_type=Release` in production
# NOTE: use --build=missing if you got error `ERROR: Missing prebuilt package`
cmake -E time
conan create . conan/stable
-s build_type=Release
# clean build cache
conan remove " * " --build --force الاستخدام (يدير 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-Auto-Load-Safe-Path."
لمزيد من التفاصيل حول .gdbinit ، اقرأ: https://metricpanda.com/tips-for-production-debugging-with-gdb
لمزيد من التفاصيل حول gdb ، اقرأ: http://www.yolinux.com/tutorials/gdb-commands.html
يمكن أن تكون جلسة تصحيح الأخطاء GDB تلقائيًا مثل ذلك:
# see https://gist.github.com/williballenthin/8bd6e29ad8504b9cb308039f675ee889
gdb
-ex " run "
-ex " set pagination off "
-ex " bt "
-ex " set confirm off "
-ex " quit "
--args
${APP_EXE}
${APP_CMD_ARGS} تأكد من استخدام Debug Build مع -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 للكشف عن طريق Deadlocks المحتملة وسباقات البيانات.
ملاحظة: استخدم 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
TODO: قد لا يدعم Valgrind قاعدة الكروم ، FixMe. وإزالة gtest_no_suite
تأكد من استخدام Debug Build مع -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 Build مع -e flextool:enable_llvm_tools=True
لمزيد من التفاصيل ، راجع: https://chromium.googlesource.com/chromium/src.git/+/master/docs/clang_static_analyzer.md and https://clang-analyzer.llvm.org/scan-build.html
يعمل برنامج CCC-Analyzer مثل برنامج التحويل البرمجي المزيف ، حيث يقوم بإعادة توجيه وسيطات سطر الأوامر الخاصة به إلى المترجم لإجراء تجميع منتظم و clang لإجراء تحليل ثابت.
يعمل تشغيل التكوين عادةً على توليد Makefiles التي تحتوي على مسارات صلبة إلى المترجم ، ومن خلال تشغيل التكوين من خلال Buil 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 افتح ملف scanbuildout/...../index.html
تأكد من استخدام Debug Build مع -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 Build مع -e flextool:enable_llvm_tools=True
تشمل ما يمكنك استخدامك (IWYU) هو مشروع يهدف إلى تحسينه.
سيحسب الرؤوس المطلوبة وإضافة / إزالة يتضمن حسب الاقتضاء.
للحصول على التفاصيل ، راجع: https://include-hat-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: use // IWYU pragma: associated في ملفات مصدر C ++.
ملاحظة: اقرأ عن iwyu pragmas: https://github.com/include-what-you-use/include-hat-you-use/blob/master/docs/iwyupragmas.md
ملاحظة: لا تستخدم "بت/" أو "/تفاصيل/*" تشمل ، أضفها إلى ملف التعيينات (.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-cache-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/peeding-up-cmake/
ملاحظة: الذهب غير مترابط افتراضيًا ، قم بتكوينه "-الخيوط"
ملاحظة: قد تكون LLD ذات الخيوط افتراضيًا ، أسرع من الذهب
تأكد من استخدام Debug Build مع -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
للحصول على التفاصيل ، راجع: 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 فقط الترتيب بناءً على SortIncludes .
لسوء الحظ ، فإن clang-format غير قابل للتكوين بما فيه الكفاية ، بحيث يمكن استخدامه فقط لفرز يشمل. انظر: https://stackoverflow.com/a/32191189
نحن نستخدم Uncrustify Bacause Clang-Format و Astyle لا يدعمان الكثير من الخيارات.
للحصول على التفاصيل ، راجع: https://patrickhenson.com/2018/06/07/uncrustify-configuration.html
تثبيت:
cd ~
git clone https://github.com/uncrustify/uncrustify.git
cd uncrustify
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build .
export UNCRUSTIFY_HOME= ~ /uncrustify/build
export PATH= $UNCRUSTIFY_HOME : $PATH
# OR sudo make install
uncrustify --version الاستخدام (يدير 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-configيحتوي Uncrustify على الكثير من الخيارات القابلة للتكوين. ربما ستحتاج إلى واجهة المستخدم الرسومية العالمية (في رد Konstantin) أيضًا لتكوينها: 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:
راجع https://github.com/blockspacer/llvm_9_installer#how-to-use-with-sanitizers
يتطلب 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 من كونانcompile_with_llvm_tools يعين متغيرات cmake المطلوبة لاستخدام clang 10 من كونان قم بتشغيل 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++ ملاحظة: قد يتطلب تغيير المترجم إعادة بناء جميع DEPS ( --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 مع "-جهد 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
ملاحظة: مساحات أسماء المستندات في مستندات/مساحات الأسماء.
ملاحظة: الملفات والأدلة والرموز التي لا توجد وثائق غير موجودة في الإخراج على الإطلاق
نمط التعليقات المستخدمة:
/ **
* @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 هي تقنية اختبار برمجيات الصندوق الأسود.
يتكون 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 etc.):
ملاحظة: هناك بعض الأشياء التي يجب مراعاتها عند استخدام مطهر العنوان. حتى لو عثرت ASAN على انتهاك للوصول إلى الذاكرة ، فإنه لا يعطل التطبيق تلقائيًا. هذه مشكلة عند استخدام أدوات الغموض الآلية لأنها عادة ما تحاول اكتشاف SegFaults عن طريق التحقق من رمز الإرجاع. ومع ذلك ، يمكننا إجبار ASAN على تعطل البرامج عندما يحدث خطأ مع متغير البيئة ASAN_OPTIONS قبل الزعنفة: 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
قبل اندفاع البرنامج ، قد نطلب التبديل إلى المستخدم الجذر لترتيب Core_pattern. تسجيل الدخول كجذر واكتب الأمر التالي:
# 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 على Vyrvisors المنخفضة.
يستخدم afl-fuzz لتشغيل AFL. بناء الجملة الفعلي كما يلي:
# see https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries
# -i is a directory of files to use as fuzz input "seeds"
# -o is a directory to write the results (including inputs that provoke crashes or hangs)
# -m is the memory allowed to use. Example: -m500
# You can use -m none to disable memory limit
# -t is the maximum time that a run is allowed to take before being declared a "hang"
# Timeout of 10 seconds: -t 10000
# @@ is fuzzer input file name
# if you skip @@ it will pass the fuzzed file on the standard input
AFL_PERSISTENT=1 afl-fuzz -i [TESTCASE DIR] -o [RESULT_DIR] [TARGET_BINARY] [BINARY_PARAMS] @@
# Example 1: runs `tar` with arguments `xfJ @@ -C fuzz-garbage/ --force-local`
# where @@ is fuzzer input file name
./afl-1.56b/afl-fuzz -i fuzz-input/ -o fuzz-state/ -t 10000 ~ /tar-1.28/src/tar xfJ @@ -C fuzz-garbage/ --force-local
# Example 2: server is dual core, so we can run one AFL instance per core
AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -M master ./fuzz_capstone
# In another terminal
AFL_PERSISTENT=1 afl-fuzz -i inputs -o multi_sync -S slave1 ./fuzz_capstoneلفهم شاشة حالة AFL ، اقرأ: https://afl-1.readthedocs.io/en/latest/user_guide.html#status-screen
ملاحظة: إذا بقيت total paths في 1 ، فربما تكون قد وضعت شيئًا خاطئًا.
ملاحظة: تفضل -m none . نحن نستخدم العنوان. هذا يعين الكثير من الصفحات لذاكرة الظل ، لذلك يتعين علينا إزالة حد الذاكرة لتشغيله وتشغيله.
ملاحظة: مع -m none ، قد يحاول برنامجك الغامض بالفعل تخصيص واستخدام الكثير من الذاكرة بسبب العينات المزعجة. قد يؤدي هذا إلى حوادث عشوائية في نظامك. يجب ألا تقوم بأي عمل مهم أثناء القيام بذلك.
ملاحظة: يمكنك تجربة ASAN_OPTIONS=hard_rss_limit_mb=2000 لتجنب -m none . انظر: https://countuponsecurity.com/category/fuzzing/
يمكنك كتابة ثنائي مخصص سيتم تشغيله باستخدام afl-fuzz . قد يلف الوظيفة التي تريد اختبارها مثل:
// harness is simply a C program that makes use of certain methods from
// a library, allowing you to indirectly fuzz it
# include < cstdio >
# include < cstdlib >
# include < string >
# include < iostream >
# include < ifstream >
int main ( int argc, char *argv[]) {
{
// init resources here
if (argc > 1 ) {
std::ifstream fin;
fin. open (argv[ 1 ]);
parse (fin); // custom logic
} else {
// / note requires AFL_PERSISTENT=1
// __AFL_LOOP is the way that we have to tell AFL
// that we want persistent mode.
// Each fuzzing iteration,
// instead of to fork and re-execute the target with a different input,
// is just an execution of this loop.
// Force AFL to run 1000 times,
// with 1000 different inputs fed to the library.
// After that, the process is restarted by AFL.
// This ensures we regularly replace the process to avoid memory leaks.
// see https://toastedcornflakes.github.io/articles/fuzzing_capstone_with_afl.html
while ( __AFL_LOOP ( 1000 )) {
parse (std::cin); // custom logic
}
}
// free resources here
return 0 ;
} ملاحظة: __AFL_LOOP () يسمح لـ AFL بإجراء غزو الثنائي في العملية من خلال بعض معالجات الذاكرة ، بدلاً من بدء عملية جديدة لكل اختبار جديد نريد اختباره. يتطلب AFL_PERSISTENT=1 .
افتراضيًا ، تقوم AFL بشحن عملية في كل مرة يختبر فيها إدخالًا مختلفًا. يمكننا التحكم في AFL لتشغيل حالات زغب متعددة في مثيل واحد من البرنامج ، بدلاً من العودة إلى حالة البرنامج مرة أخرى لكل عينة اختبار. سيؤدي ذلك إلى تقليل الوقت الذي تقضيه في مساحة النواة ويحسن سرعة الغموض. وهذا ما يسمى الوضع AFL_PERSINGETING. يمكننا أن نفعل ذلك من خلال تضمين الماكرو __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 ثم قم بتوجيه fuzzer إليه عبر خيار -x في سطر الأوامر. اقرأ: https://afl-1.readthedocs.io/en/latest/fuzzing.html#fuzzing-binaries و https://github.com/mirrorer/afl/blob/master/dictionaries/readme.dictionaries
يمكنك أيضًا استخدام 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) ، راجع: 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 @@عندما لا يمكنك إعادة إنتاج حادث تصادم موجود بواسطة 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
يوفر AFL البرنامج النصي استكشاف التعطل في experimental/crash_triage/triage_crashes.sh
عند التشغيل ، سيقوم برنامج Triage Script بالدورة من خلال كل ملف تحطم في دليل /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-mode.html
ملاحظة: يكتشف AFL الأعطال عن طريق التحقق من أول عملية تموت بسبب الإشارة (SIGSEGV ، SIGABRT ، إلخ). قد تحتاج البرامج التي تثبت معالجات مخصصة لهذه الإشارات إلى تعليق الرمز ذي الصلة.
لمزيد من التفاصيل ، راجع:
يعد Libfuzzer جزءًا من مشروع LLVM Legiler للبنية التحتية ويأتي مدمجًا مع برنامج التحويل البرمجي Clang.
ثم يمكن ربط libfuzzer بالسائق المطلوب من خلال تمرير -fsanitize=fuzzer خلال مرحلة الارتباط.
ملاحظة: -fsanitize=fuzzer في رمز Libfuzzer الرئيسي ().
ملاحظة: في معظم الحالات ، قد ترغب في الجمع بين libfuzzer مع العنوان (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 ، يمكنك استخدامه: ASAN_OPTIONS=hard_rss_limit_mb=2000 (مع العنوان).
libfuzzer يتطلب مجموعة البذور. للحصول على التفاصيل ، راجع: https://github.com/google/fuzzing/blob/master/tutorial/libfuzzertorial.md
لمزيد من التفاصيل ، راجع:
يدعم Clang تعليقات سلامة الخيوط (Guarded_by)
-Wthread-safety-analysisbase/thread_annotations.h https://github.com/chromium/chromium/blob/master/base/thread_annotations.h للحصول على التفاصيل ، راجع:Clang FAS الدعم من الدرجة الأولى للمطهرات. راجع تفاصيل حول MSAN ، Asan ، Tsan ، إلخ. في المستندات.
يمكن بناء clang مع ملف تعريف مدى الحياة:
-Wlifetime للحصول على التفاصيل ، راجع:يتم استخدام جميع مكونات المصدر المفتوح ضمن تراخيص المصادر المفتوحة المرتبطة بها.
مكونات مفتوحة المصدر تستخدم:
انظر ملفات الترخيص
ترخيص معهد ماساتشوستس للتكنولوجيا
انظر ترخيص المحتوى الكامل للتراخيص.
هذا المشروع مفتوح المصدر استنادًا إلى مشروع Google Chromium.
هذا ليس منتج Google الرسمي.
أجزاء حقوق الطبع والنشر (ج) Google Inc.
انظر ملفات الترخيص.