diff --git a/CMakeLists.txt b/CMakeLists.txt index dd255a220c5274d9fc275d60bf9df96903d464a7..0bbb3ea012072e3342e12cac467e214925f6ee8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,14 @@ if(WITH_WEBENGINE) add_definitions(-DWITH_WEBENGINE) endif() +option(ENABLE_ASAN "Enable address sanitization" OFF) +if(ENABLE_ASAN AND NOT MSVC) + message(STATUS "Address sanitization enabled for client") + # Add AddressSanitizer flags for both compiler and linker + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") +endif() + # init some variables for includes, libs, etc. set(CLIENT_INCLUDE_DIRS, "") set(CLIENT_LINK_DIRS, "") @@ -43,7 +51,10 @@ set(CLIENT_LIBS, "") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_FLAGS_DEBUG "-Og -ggdb") +if(NOT MSVC) + set(CMAKE_CXX_FLAGS_DEBUG "-Og -ggdb") +endif() + set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) diff --git a/build.py b/build.py index 1942af217cfeb081383c40a235f34af20ecb6793..a61c40347ead5774ee2ef1310c0b8721ee3f2108 100755 --- a/build.py +++ b/build.py @@ -28,6 +28,7 @@ import shutil import subprocess import sys import time +import re OSX_DISTRIBUTION_NAME = "osx" WIN32_DISTRIBUTION_NAME = "win32" @@ -392,6 +393,8 @@ def run_install(args): install_args.append('-u') if args.debug: install_args.append('-d') + if args.asan: + install_args.append('-A') if args.no_libwrap: install_args.append('-W') if args.no_webengine: @@ -719,6 +722,8 @@ def parse_args(): ap.add_argument('--global-install', default=False, action='store_true') ap.add_argument('--debug', default=False, action='store_true', help='Build with debug support; run in GDB') + ap.add_argument('--asan', default=False, action='store_true', + help='Build both daemon and client with ASAN') ap.add_argument('--background', default=False, action='store_true') ap.add_argument('--no-priv-install', dest='priv_install', default=True, action='store_false') diff --git a/extras/scripts/install.sh b/extras/scripts/install.sh index 11ce4c855bbcba06945aeee9a53566f1ca3f2c15..cb7ba034bf336917f912f3c13f5ffa77879a4838 100755 --- a/extras/scripts/install.sh +++ b/extras/scripts/install.sh @@ -43,9 +43,10 @@ proc='1' priv_install=true enable_libwrap=true enable_webengine=true +asan= arch='' -while getopts gsc:dQ:P:p:uWwa: OPT; do +while getopts gsc:dQ:P:p:uWwa:A OPT; do case "$OPT" in g) global='true' @@ -77,6 +78,9 @@ while getopts gsc:dQ:P:p:uWwa: OPT; do a) arch="${OPTARG}" ;; + A) + asan='true' + ;; \?) exit 1 ;; @@ -116,7 +120,7 @@ else mkdir -p contrib/native ( cd contrib/native - ../bootstrap ${prefix:+"--prefix=$prefix"} + ../bootstrap ${prefix:+"--prefix=$prefix"} ${asan:+"--enable-asan"} make -j"${proc}" ) @@ -135,6 +139,10 @@ else CONFIGURE_FLAGS+=" --enable-debug" fi + if [ "${asan}" = "true" ]; then + CONFIGURE_FLAGS+=" --enable-asan" + fi + # Build the daemon itself. test -f configure || ./autogen.sh @@ -183,6 +191,11 @@ client_cmake_flags=(-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" -DCMAKE_PREFIX_PATH="${qtpath}" -DENABLE_LIBWRAP="${enable_libwrap}" -DWITH_WEBENGINE="${enable_webengine}") + +if [ "${asan}" = "true" ]; then + client_cmake_flags+=(-DENABLE_ASAN=true) +fi + if [[ "$OSTYPE" == "darwin"* ]]; then #detect arch for macos CMAKE_OSX_ARCHITECTURES="arm64"