mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-21 06:00:51 -06:00
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
This commit is contained in:
@@ -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(add_test -DPSEUDO_EMULATOR=$<TARGET_FILE:pseudo_emulator>)
|
||||||
add_RunCMake_test(build_command)
|
add_RunCMake_test(build_command)
|
||||||
add_executable(exit_code exit_code.c)
|
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
|
set(execute_process_ARGS
|
||||||
-DEXIT_CODE_EXE=$<TARGET_FILE:exit_code>
|
-DEXIT_CODE_EXE=$<TARGET_FILE:exit_code>
|
||||||
|
-DEXIT_CRASH_EXE=${EXIT_CRASH_EXE}
|
||||||
-DPRINT_STDIN_EXE=$<TARGET_FILE:print_stdin>
|
-DPRINT_STDIN_EXE=$<TARGET_FILE:print_stdin>
|
||||||
-DPython_EXECUTABLE=${Python_EXECUTABLE}
|
|
||||||
-DCYGWIN=${CYGWIN}
|
-DCYGWIN=${CYGWIN}
|
||||||
)
|
)
|
||||||
if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
if(NOT CMake_TEST_EXTERNAL_CMAKE)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
CMake Error at .*AnyCommandAbnormalExit.cmake:[0-9]+ \(execute_process\):
|
CMake Error at .*AnyCommandAbnormalExit.cmake:[0-9]+ \(execute_process\):
|
||||||
execute_process failed command indexes:
|
execute_process failed command indexes:
|
||||||
|
|
||||||
1: "Abnormal exit with child return code: Segmentation fault
|
1: "Abnormal exit with child return code:
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
execute_process(COMMAND "${Python_EXECUTABLE}" -c
|
execute_process(COMMAND "${EXIT_CRASH_EXE}"
|
||||||
"import os; os.kill(os.getpid(),11)"
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E true
|
COMMAND ${CMAKE_COMMAND} -E true
|
||||||
COMMAND_ERROR_IS_FATAL ANY
|
COMMAND_ERROR_IS_FATAL ANY
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
execute_process(COMMAND "${Python_EXECUTABLE}" -c
|
execute_process(COMMAND "${EXIT_CRASH_EXE}"
|
||||||
"import os; os.kill(os.getpid(),11)"
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E true
|
COMMAND ${CMAKE_COMMAND} -E true
|
||||||
RESULT_VARIABLE result
|
RESULT_VARIABLE result
|
||||||
)
|
)
|
||||||
|
|
||||||
if(result EQUAL "0")
|
if(result EQUAL "0")
|
||||||
execute_process(COMMAND "${Python_EXECUTABLE}" -c
|
execute_process(COMMAND "${EXIT_CRASH_EXE}"
|
||||||
"import os; os.kill(os.getpid(),11)"
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E true
|
COMMAND ${CMAKE_COMMAND} -E true
|
||||||
COMMAND_ERROR_IS_FATAL LAST
|
COMMAND_ERROR_IS_FATAL LAST
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
CMake Error at .*LastCommandAbnormalExit-2.cmake:[0-9]+ \(execute_process\):
|
CMake Error at .*LastCommandAbnormalExit-2.cmake:[0-9]+ \(execute_process\):
|
||||||
execute_process Abnormal exit: Segmentation fault
|
execute_process Abnormal exit:
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E true
|
execute_process(COMMAND ${CMAKE_COMMAND} -E true
|
||||||
COMMAND "${Python_EXECUTABLE}" -c
|
COMMAND "${EXIT_CRASH_EXE}"
|
||||||
"import os; os.kill(os.getpid(),11)"
|
|
||||||
RESULT_VARIABLE result
|
RESULT_VARIABLE result
|
||||||
)
|
)
|
||||||
|
|
||||||
if(NOT result EQUAL "0")
|
if(NOT result EQUAL "0")
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E true
|
execute_process(COMMAND ${CMAKE_COMMAND} -E true
|
||||||
COMMAND "${Python_EXECUTABLE}" -c
|
COMMAND "${EXIT_CRASH_EXE}"
|
||||||
"import os; os.kill(os.getpid(),11)"
|
|
||||||
COMMAND_ERROR_IS_FATAL LAST
|
COMMAND_ERROR_IS_FATAL LAST
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -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(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)
|
run_cmake_command(InOutErrDirectory ${CMAKE_COMMAND} -DPRINT_STDIN_EXE=${PRINT_STDIN_EXE} -P ${RunCMake_SOURCE_DIR}/InOutErrDirectory.cmake)
|
||||||
|
|
||||||
if(UNIX AND Python_EXECUTABLE)
|
if(EXIT_CRASH_EXE)
|
||||||
run_cmake_command(AnyCommandAbnormalExit ${CMAKE_COMMAND} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/AnyCommandAbnormalExit.cmake)
|
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} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/LastCommandAbnormalExit-1.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} -DPython_EXECUTABLE=${Python_EXECUTABLE} -P ${RunCMake_SOURCE_DIR}/LastCommandAbnormalExit-2.cmake)
|
run_cmake_command(LastCommandAbnormalExit-2 ${CMAKE_COMMAND} -DEXIT_CRASH_EXE=${EXIT_CRASH_EXE} -P ${RunCMake_SOURCE_DIR}/LastCommandAbnormalExit-2.cmake)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WIN32 OR CYGWIN)
|
if(WIN32 OR CYGWIN)
|
||||||
|
|||||||
14
Tests/RunCMake/exit_crash.c
Normal file
14
Tests/RunCMake/exit_crash.c
Normal file
@@ -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;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user