try_run: Avoid crash in keyword-dispatched signature when cross-compiling

Since commit aa9220d3a0 (try_compile: Add keyword-dispatched signature,
2022-09-02, v3.25.0-rc1~178^2) the `DoNotRunExecutable` code path may be
reached with no single source-file argument.  Do not assume it exists.

Fixes: #24295
This commit is contained in:
Brad King
2023-01-12 11:04:16 -05:00
parent 6b92224f6c
commit 2f85ec0a37
3 changed files with 18 additions and 6 deletions

View File

@@ -40,7 +40,7 @@ public:
std::string* runOutputStdOutContents,
std::string* runOutputStdErrContents);
void DoNotRunExecutable(const std::string& runArgs,
const std::string& srcFile,
cm::optional<std::string> const& srcFile,
std::string const& compileResultVariable,
std::string* runOutputContents,
std::string* runOutputStdOutContents,
@@ -128,7 +128,7 @@ bool TryRunCommandImpl::TryRunCode(std::vector<std::string> const& argv)
if (this->Makefile->IsOn("CMAKE_CROSSCOMPILING") &&
!this->Makefile->IsDefinitionSet("CMAKE_CROSSCOMPILING_EMULATOR")) {
this->DoNotRunExecutable(
runArgs, *arguments.SourceDirectoryOrFile,
runArgs, arguments.SourceDirectoryOrFile,
*arguments.CompileResultVariable,
captureRunOutput ? &runOutputContents : nullptr,
captureRunOutputStdOutErr && arguments.RunOutputStdOutVariable
@@ -238,7 +238,7 @@ void TryRunCommandImpl::RunExecutable(const std::string& runArgs,
the executable would have produced.
*/
void TryRunCommandImpl::DoNotRunExecutable(
const std::string& runArgs, const std::string& srcFile,
const std::string& runArgs, cm::optional<std::string> const& srcFile,
std::string const& compileResultVariable, std::string* out,
std::string* stdOut, std::string* stdErr)
{
@@ -421,9 +421,11 @@ void TryRunCommandImpl::DoNotRunExecutable(
comment += "The ";
comment += compileResultVariable;
comment += " variable holds the build result for this try_run().\n\n"
"Source file : ";
comment += srcFile + "\n";
comment += " variable holds the build result for this try_run().\n\n";
if (srcFile) {
comment += "Source file : ";
comment += *srcFile + "\n";
}
comment += "Executable : ";
comment += copyDest + "\n";
comment += "Run arguments : ";

View File

@@ -0,0 +1,8 @@
include(${CMAKE_CURRENT_SOURCE_DIR}/${try_compile_DEFS})
# Pretend we are cross-compiling to take that try_run code path.
set(CMAKE_CROSSCOMPILING 1)
set(RUN_RESULT 0)
try_run(RUN_RESULT COMPILE_RESULT ${try_compile_bindir_or_SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/src.c)
unset(CMAKE_CROSSCOMPILING)

View File

@@ -11,6 +11,8 @@ run_cmake(BadLinkLibraries)
run_cmake(BinDirEmpty)
run_cmake(BinDirRelative)
run_cmake(CrossCompile)
run_cmake(WorkingDirArg)
run_cmake(NoCompileOutputVariable)