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"