add an option to enable address sanitizer

Thu, 22 May 2025 15:48:00 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 22 May 2025 15:48:00 +0200
changeset 1320
f76b70a72614
parent 1319
aa1f580f8f59
child 1321
1003c014bf92

add an option to enable address sanitizer

configure file | annotate | diff | comparison | revisions
make/project.xml file | annotate | diff | comparison | revisions
--- a/configure	Thu May 15 16:12:09 2025 +0200
+++ b/configure	Thu May 22 15:48:00 2025 +0200
@@ -111,8 +111,9 @@
   --release               add extra compile flags for release builds
 
 Optional Features:
-  --enable-api-docs
-  --enable-coverage
+  --enable-api-docs       run Doxygen during build
+  --enable-coverage       test coverage with gcov
+  --enable-asan           address sanitizer
   --disable-cxx-tests     the check-cxx makefile target
   --disable-szmul-builtin use custom implementation, instead
 
@@ -191,6 +192,8 @@
         "--disable-api-docs") unset FEATURE_API_DOCS ;;
         "--enable-coverage") FEATURE_COVERAGE=on ;;
         "--disable-coverage") unset FEATURE_COVERAGE ;;
+        "--enable-asan") FEATURE_ASAN=on ;;
+        "--disable-asan") unset FEATURE_ASAN ;;
         "--enable-cxx-tests") FEATURE_CXX_TESTS=on ;;
         "--disable-cxx-tests") unset FEATURE_CXX_TESTS ;;
         "--enable-szmul-builtin") FEATURE_SZMUL_BUILTIN=on ;;
@@ -339,6 +342,26 @@
     dep_checked_coverage=1
     return 0
 }
+dependency_error_asan()
+{
+    print_check_msg "$dep_checked_asan" "checking for asan... "
+    # dependency asan toolchain="gnuc"
+    while true
+    do
+        if notistoolchain "gnuc"; then
+            break
+        fi
+        TEMP_CFLAGS="$TEMP_CFLAGS -fsanitize=address"
+        TEMP_LDFLAGS="$TEMP_LDFLAGS -fsanitize=address"
+        print_check_msg "$dep_checked_asan" "yes\n"
+        dep_checked_asan=1
+        return 1
+    done
+
+    print_check_msg "$dep_checked_asan" "no\n"
+    dep_checked_asan=1
+    return 0
+}
 dependency_error_cxx()
 {
     print_check_msg "$dep_checked_cxx" "checking for cxx... "
@@ -631,6 +654,26 @@
 else
     :
 fi
+if [ -n "$FEATURE_ASAN" ]; then
+    # check dependency
+    if dependency_error_asan ; then
+        # "auto" features can fail and are just disabled in this case
+        if [ "$FEATURE_ASAN" = "auto" ]; then
+            DISABLE_FEATURE_ASAN=1
+        else
+            DEPENDENCIES_FAILED="$DEPENDENCIES_FAILED asan "
+            ERROR=1
+        fi
+    fi
+    if [ -n "$DISABLE_FEATURE_ASAN" ]; then
+        unset FEATURE_ASAN
+    fi
+fi
+if [ -n "$FEATURE_ASAN" ]; then
+    :
+else
+    :
+fi
 if [ -n "$FEATURE_CXX_TESTS" ]; then
     # check dependency
     if dependency_error_cxx ; then
@@ -772,6 +815,11 @@
 else
 echo "  coverage: off"
 fi
+if [ -n "$FEATURE_ASAN" ]; then
+echo "  asan: on"
+else
+echo "  asan: off"
+fi
 if [ -n "$FEATURE_CXX_TESTS" ]; then
 echo "  cxx-tests: on"
 else
--- a/make/project.xml	Thu May 15 16:12:09 2025 +0200
+++ b/make/project.xml	Thu May 22 15:48:00 2025 +0200
@@ -80,6 +80,11 @@
         <test>command -v gcovr</test>
     </dependency>
 
+    <dependency name="asan" toolchain="gnuc">
+        <cflags>-fsanitize=address</cflags>
+        <ldflags>-fsanitize=address</ldflags>
+    </dependency>
+
     <dependency name="no_coverage">
         <test>test -z "$FEATURE_COVERAGE"</test>
     </dependency>
@@ -87,14 +92,20 @@
     <target>
         <feature name="api-docs">
             <dependencies>doxygen</dependencies>
+            <desc>run Doxygen during build</desc>
             <make>
                 # Documentation
                 WITH_API_DOCS=yes
             </make>
         </feature>
         <feature name="coverage">
+            <desc>test coverage with gcov</desc>
             <dependencies>coverage</dependencies>
         </feature>
+        <feature name="asan">
+            <desc>address sanitizer</desc>
+            <dependencies>asan</dependencies>
+        </feature>
         <feature name="cxx-tests" default="true">
             <dependencies>cxx</dependencies>
             <desc>the check-cxx makefile target</desc>

mercurial