config.m4 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. AC_MSG_CHECKING(for clang fuzzer SAPI)
  2. PHP_ARG_ENABLE([fuzzer],,
  3. [AS_HELP_STRING([--enable-fuzzer],
  4. [Build PHP as clang fuzzing test module (for developers)])],
  5. [no],
  6. [no])
  7. PHP_ARG_ENABLE([fuzzer-msan],,
  8. [AS_HELP_STRING([--enable-fuzzer-msan],
  9. [Enable msan instead of asan/ubsan when fuzzing])],
  10. [no],
  11. [no])
  12. dnl For newer clang versions see https://llvm.org/docs/LibFuzzer.html#fuzzer-usage
  13. dnl for relevant flags.
  14. dnl Macro to define fuzzing target
  15. dnl PHP_FUZZER_TARGET(name, target-var)
  16. dnl
  17. AC_DEFUN([PHP_FUZZER_TARGET], [
  18. PHP_FUZZER_BINARIES="$PHP_FUZZER_BINARIES $SAPI_FUZZER_PATH/php-fuzz-$1"
  19. PHP_SUBST($2)
  20. PHP_ADD_SOURCES_X([sapi/fuzzer],[fuzzer-$1.c],[],$2)
  21. $2="[$]$2 $FUZZER_COMMON_OBJS"
  22. ])
  23. if test "$PHP_FUZZER" != "no"; then
  24. AC_MSG_RESULT([yes])
  25. dnl Don't use PHP_REQUIRE_CXX() to avoid unnecessarily pulling in -lstdc++
  26. AC_PROG_CXX
  27. AC_PROG_CXXCPP
  28. PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/sapi/fuzzer/Makefile.frag)
  29. SAPI_FUZZER_PATH=sapi/fuzzer
  30. PHP_SUBST(SAPI_FUZZER_PATH)
  31. if test -z "$LIB_FUZZING_ENGINE"; then
  32. FUZZING_LIB="-fsanitize=fuzzer"
  33. FUZZING_CC="$CC"
  34. AX_CHECK_COMPILE_FLAG([-fsanitize=fuzzer-no-link], [
  35. CFLAGS="$CFLAGS -fsanitize=fuzzer-no-link"
  36. CXXFLAGS="$CXXFLAGS -fsanitize=fuzzer-no-link"
  37. if test "$PHP_FUZZER_MSAN" = "yes"; then
  38. CFLAGS="$CFLAGS -fsanitize=memory -fsanitize-memory-track-origins"
  39. CXXFLAGS="$CXXFLAGS -fsanitize=memory -fsanitize-memory-track-origins"
  40. else
  41. CFLAGS="$CFLAGS -fsanitize=address"
  42. CXXFLAGS="$CXXFLAGS -fsanitize=address"
  43. dnl Don't include -fundefined in CXXFLAGS, because that would also require linking
  44. dnl with a C++ compiler.
  45. dnl Disable object-size sanitizer, because it is incompatible with our zend_function
  46. dnl union, and this can't be easily fixed.
  47. dnl We need to specify -fno-sanitize-recover=undefined here, otherwise ubsan warnings
  48. dnl will not be considered failures by the fuzzer.
  49. CFLAGS="$CFLAGS -fsanitize=undefined -fno-sanitize=object-size -fno-sanitize-recover=undefined"
  50. fi
  51. ],[
  52. AC_MSG_ERROR(Compiler doesn't support -fsanitize=fuzzer-no-link)
  53. ])
  54. else
  55. FUZZING_LIB="$LIB_FUZZING_ENGINE"
  56. FUZZING_CC="$CXX -stdlib=libc++"
  57. fi
  58. PHP_SUBST(FUZZING_LIB)
  59. PHP_SUBST(FUZZING_CC)
  60. dnl PHP_SELECT_SAPI(fuzzer-parser, program, $FUZZER_SOURCES, , '$(SAPI_FUZZER_PATH)')
  61. PHP_ADD_BUILD_DIR([sapi/fuzzer])
  62. PHP_FUZZER_BINARIES=""
  63. PHP_BINARIES="$PHP_BINARIES fuzzer"
  64. PHP_INSTALLED_SAPIS="$PHP_INSTALLED_SAPIS fuzzer"
  65. PHP_ADD_SOURCES_X([sapi/fuzzer], [fuzzer-sapi.c], [], FUZZER_COMMON_OBJS)
  66. PHP_FUZZER_TARGET([parser], PHP_FUZZER_PARSER_OBJS)
  67. PHP_FUZZER_TARGET([execute], PHP_FUZZER_EXECUTE_OBJS)
  68. PHP_FUZZER_TARGET([unserialize], PHP_FUZZER_UNSERIALIZE_OBJS)
  69. PHP_FUZZER_TARGET([unserializehash], PHP_FUZZER_UNSERIALIZEHASH_OBJS)
  70. PHP_FUZZER_TARGET([json], PHP_FUZZER_JSON_OBJS)
  71. if test -n "$enable_exif" && test "$enable_exif" != "no"; then
  72. PHP_FUZZER_TARGET([exif], PHP_FUZZER_EXIF_OBJS)
  73. fi
  74. if test -n "$enable_mbstring" && test "$enable_mbstring" != "no"; then
  75. PHP_FUZZER_TARGET([mbstring], PHP_FUZZER_MBSTRING_OBJS)
  76. fi
  77. PHP_SUBST(PHP_FUZZER_BINARIES)
  78. fi
  79. AC_MSG_RESULT($PHP_FUZZER)