diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bf67866c7ac59..3c772e6509940 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -74,10 +74,7 @@ jobs: - template: azure/job.yml parameters: configurationName: DEBUG_ZTS_ASAN_UBSAN - configurationParameters: >- - --enable-debug --enable-zts - CFLAGS='-fsanitize=undefined,address -DZEND_TRACK_ARENA_ALLOC' - LDFLAGS='-fsanitize=undefined,address' + configurationParameters: '--enable-debug --enable-zts --enable-address-sanitizer --enable-undefined-sanitizer' runTestsParameters: --asan timeoutInMinutes: 360 - template: azure/msan_job.yml @@ -90,9 +87,8 @@ jobs: parameters: configurationName: COMMUNITY configurationParameters: >- - --enable-debug --enable-zts - CFLAGS='-fsanitize=undefined,address -fno-sanitize-recover -DZEND_TRACK_ARENA_ALLOC' - LDFLAGS='-fsanitize=undefined,address' + --enable-debug --enable-zts --enable-address-sanitizer --enable-undefined-sanitizer + CFLAGS='-fno-sanitize-recover' - template: azure/coverage_job.yml parameters: configurationName: COVERAGE_DEBUG_ZTS diff --git a/configure.ac b/configure.ac index 7bf90a44549dd..19568d1c5c489 100644 --- a/configure.ac +++ b/configure.ac @@ -982,6 +982,16 @@ PHP_ARG_ENABLE([memory-sanitizer],, [Enable memory sanitizer (clang only)])], [no], [no]) +PHP_ARG_ENABLE([address-sanitizer],, + [AS_HELP_STRING([--enable-address-sanitizer], + [Enable address sanitizer])], + [no], + [no]) +PHP_ARG_ENABLE([undefined-sanitizer],, + [AS_HELP_STRING([--enable-undefined-sanitizer], + [Enable undefined sanitizer])], + [no], + [no]) dnl Extension configuration. dnl ---------------------------------------------------------------------------- @@ -1372,10 +1382,38 @@ if test "$PHP_WERROR" = "yes"; then CXXFLAGS="$CXXFLAGS -Werror" fi +if test "$PHP_MEMORY_SANITIZER" = "yes" && + test "$PHP_ADDRESS_SANITIZER" = "yes"; then + AC_MSG_ERROR([MemorySanitizer and AddressSanitizer are mutually exclusive]) +fi + dnl Enable -fsanitize=memory late, because interceptors may break linking detection. if test "$PHP_MEMORY_SANITIZER" = "yes"; then - CFLAGS="$CFLAGS -fsanitize=memory -fsanitize-memory-track-origins" - CXXFLAGS="$CXXFLAGS -fsanitize=memory -fsanitize-memory-track-origins" + AX_CHECK_COMPILE_FLAG([-fsanitize=memory -fsanitize-memory-track-origins], [ + CFLAGS="$CFLAGS -fsanitize=memory -fsanitize-memory-track-origins" + CXXFLAGS="$CXXFLAGS -fsanitize=memory -fsanitize-memory-track-origins" + ], [AC_MSG_ERROR([MemorySanitizer is not available])]) +fi + +if test "$PHP_ADDRESS_SANITIZER" = "yes"; then + AX_CHECK_COMPILE_FLAG([-fsanitize=address], [ + CFLAGS="$CFLAGS -fsanitize=address -DZEND_TRACK_ARENA_ALLOC" + CXXFLAGS="$CXXFLAGS -fsanitize=address -DZEND_TRACK_ARENA_ALLOC" + ], [AC_MSG_ERROR([AddressSanitizer is not available])]) +fi + +if test "$PHP_UNDEFINED_SANITIZER" = "yes"; then + AX_CHECK_COMPILE_FLAG([-fsanitize=undefined], [ + CFLAGS="$CFLAGS -fsanitize=undefined" + CXXFLAGS="$CXXFLAGS -fsanitize=undefined" + ], [AC_MSG_ERROR([UndefinedBehaviorSanitizer is not available])]) +fi + +if test "$PHP_MEMORY_SANITIZER" = "yes" || + test "$PHP_ADDRESS_SANITIZER" = "yes" || + test "$PHP_UNDEFINED_SANITIZER" = "yes"; then + CFLAGS="$CFLAGS -fno-omit-frame-pointer" + CXXFLAGS="$CXXFLAGS -fno-omit-frame-pointer" fi dnl