Răsfoiți Sursa

Tests: Cover execute_process with abnormal exit on all platforms

Use a dedicated helper program instead of a Python script.
This also avoids an interactive popup on macOS.

Fixes: #25973
Brad King 1 an în urmă
părinte
comite
151a7d63dd

+ 6 - 1
Tests/RunCMake/CMakeLists.txt

@@ -516,10 +516,15 @@ set_property(TEST RunCMake.add_subdirectory APPEND PROPERTY LABELS "Fortran")
 add_RunCMake_test(add_test -DPSEUDO_EMULATOR=$<TARGET_FILE:pseudo_emulator>)
 add_RunCMake_test(build_command)
 add_executable(exit_code exit_code.c)
+if(NOT CMAKE_C_COMPILER_ID MATCHES "OrangeC|Watcom"
+    AND NOT CMAKE_C_FLAGS MATCHES "-fsanitize=")
+  add_executable(exit_crash exit_crash.c)
+  set(EXIT_CRASH_EXE $<TARGET_FILE:exit_crash>)
+endif()
 set(execute_process_ARGS
   -DEXIT_CODE_EXE=$<TARGET_FILE:exit_code>
+  -DEXIT_CRASH_EXE=${EXIT_CRASH_EXE}
   -DPRINT_STDIN_EXE=$<TARGET_FILE:print_stdin>
-  -DPython_EXECUTABLE=${Python_EXECUTABLE}
   -DCYGWIN=${CYGWIN}
   )
 if(NOT CMake_TEST_EXTERNAL_CMAKE)

+ 1 - 1
Tests/RunCMake/execute_process/AnyCommandAbnormalExit-stderr.txt

@@ -1,4 +1,4 @@
 CMake Error at .*AnyCommandAbnormalExit.cmake:[0-9]+ \(execute_process\):
   execute_process failed command indexes:
 
-    1: "Abnormal exit with child return code: Segmentation fault
+    1: "Abnormal exit with child return code:

+ 1 - 2
Tests/RunCMake/execute_process/AnyCommandAbnormalExit.cmake

@@ -1,5 +1,4 @@
-execute_process(COMMAND "${Python_EXECUTABLE}" -c
-    "import os; os.kill(os.getpid(),11)"
+execute_process(COMMAND "${EXIT_CRASH_EXE}"
   COMMAND ${CMAKE_COMMAND} -E true
   COMMAND_ERROR_IS_FATAL ANY
   )

+ 2 - 4
Tests/RunCMake/execute_process/LastCommandAbnormalExit-1.cmake

@@ -1,12 +1,10 @@
-execute_process(COMMAND "${Python_EXECUTABLE}" -c
-    "import os; os.kill(os.getpid(),11)"
+execute_process(COMMAND "${EXIT_CRASH_EXE}"
   COMMAND ${CMAKE_COMMAND} -E true
   RESULT_VARIABLE result
   )
 
 if(result EQUAL "0")
-  execute_process(COMMAND "${Python_EXECUTABLE}" -c
-      "import os; os.kill(os.getpid(),11)"
+  execute_process(COMMAND "${EXIT_CRASH_EXE}"
     COMMAND ${CMAKE_COMMAND} -E true
     COMMAND_ERROR_IS_FATAL LAST
     )

+ 1 - 1
Tests/RunCMake/execute_process/LastCommandAbnormalExit-2-stderr.txt

@@ -1,2 +1,2 @@
 CMake Error at .*LastCommandAbnormalExit-2.cmake:[0-9]+ \(execute_process\):
-  execute_process Abnormal exit: Segmentation fault
+  execute_process Abnormal exit:

+ 2 - 4
Tests/RunCMake/execute_process/LastCommandAbnormalExit-2.cmake

@@ -1,13 +1,11 @@
 execute_process(COMMAND ${CMAKE_COMMAND} -E true
-  COMMAND "${Python_EXECUTABLE}" -c
-    "import os; os.kill(os.getpid(),11)"
+  COMMAND "${EXIT_CRASH_EXE}"
   RESULT_VARIABLE result
   )
 
 if(NOT result EQUAL "0")
   execute_process(COMMAND ${CMAKE_COMMAND} -E true
-    COMMAND "${Python_EXECUTABLE}" -c
-      "import os; os.kill(os.getpid(),11)"
+    COMMAND "${EXIT_CRASH_EXE}"
     COMMAND_ERROR_IS_FATAL LAST
     )
 endif()

+ 4 - 4
Tests/RunCMake/execute_process/RunCMakeTest.cmake

@@ -41,10 +41,10 @@ run_cmake_command(StderrNoexist ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/Stder
 run_cmake_command(StdoutStderrNoexist ${CMAKE_COMMAND} -P ${RunCMake_SOURCE_DIR}/StderrNoexist.cmake)
 run_cmake_command(InOutErrDirectory ${CMAKE_COMMAND} -DPRINT_STDIN_EXE=${PRINT_STDIN_EXE} -P ${RunCMake_SOURCE_DIR}/InOutErrDirectory.cmake)
 
-if(UNIX AND Python_EXECUTABLE)
-  run_cmake_command(AnyCommandAbnormalExit ${CMAKE_COMMAND} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/AnyCommandAbnormalExit.cmake)
-  run_cmake_command(LastCommandAbnormalExit-1 ${CMAKE_COMMAND} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/LastCommandAbnormalExit-1.cmake)
-  run_cmake_command(LastCommandAbnormalExit-2 ${CMAKE_COMMAND} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/LastCommandAbnormalExit-2.cmake)
+if(EXIT_CRASH_EXE)
+  run_cmake_command(AnyCommandAbnormalExit ${CMAKE_COMMAND} -DEXIT_CRASH_EXE=${EXIT_CRASH_EXE} -P ${RunCMake_SOURCE_DIR}/AnyCommandAbnormalExit.cmake)
+  run_cmake_command(LastCommandAbnormalExit-1 ${CMAKE_COMMAND} -DEXIT_CRASH_EXE=${EXIT_CRASH_EXE} -P ${RunCMake_SOURCE_DIR}/LastCommandAbnormalExit-1.cmake)
+  run_cmake_command(LastCommandAbnormalExit-2 ${CMAKE_COMMAND} -DEXIT_CRASH_EXE=${EXIT_CRASH_EXE} -P ${RunCMake_SOURCE_DIR}/LastCommandAbnormalExit-2.cmake)
 endif()
 
 if(WIN32 OR CYGWIN)

+ 14 - 0
Tests/RunCMake/exit_crash.c

@@ -0,0 +1,14 @@
+int main(int argc, const char* argv[])
+{
+#ifndef __clang_analyzer__ /* Suppress clang-analyzer warnings */
+  /* Construct an invalid address that cannot be predicted by the
+     compiler/optimizer, and that is not NULL (which is undefined
+     behavior to dereference).  */
+  volatile int* invalidAddress = 0;
+  invalidAddress += argc ? 1 : 2;
+  (void)argv;
+  /* Write to the invalid address to cause SIGSEGV or similar.  */
+  *invalidAddress = 0;
+#endif
+  return 0;
+}