From f6fd0abc5bbfa7d677cd090ba8e2894d96afdde8 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 5 Sep 2016 09:04:30 -0400 Subject: Genex: Diagnose invalid LINK_ONLY usage instead of crashing When `$` is used outside of linking we may evaluate it without a `dagChecker`. Do not dereference the NULL pointer and issue a diagnostic instead. Closes: #16287 --- Source/cmGeneratorExpressionNode.cxx | 11 ++++++++--- .../GeneratorExpression/LINK_ONLY-not-linking-result.txt | 1 + .../GeneratorExpression/LINK_ONLY-not-linking-stderr.txt | 8 ++++++++ .../RunCMake/GeneratorExpression/LINK_ONLY-not-linking.cmake | 1 + Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake | 1 + 5 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-result.txt create mode 100644 Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-stderr.txt create mode 100644 Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking.cmake diff --git a/Source/cmGeneratorExpressionNode.cxx b/Source/cmGeneratorExpressionNode.cxx index 44e9ce1..c19a741 100644 --- a/Source/cmGeneratorExpressionNode.cxx +++ b/Source/cmGeneratorExpressionNode.cxx @@ -672,15 +672,20 @@ static const struct LinkOnlyNode : public cmGeneratorExpressionNode LinkOnlyNode() {} std::string Evaluate(const std::vector& parameters, - cmGeneratorExpressionContext* /*context*/, - const GeneratorExpressionContent* /*content*/, + cmGeneratorExpressionContext* context, + const GeneratorExpressionContent* content, cmGeneratorExpressionDAGChecker* dagChecker) const CM_OVERRIDE { + if (!dagChecker) { + reportError(context, content->GetOriginalExpression(), + "$ may only be used for linking"); + return std::string(); + } if (!dagChecker->GetTransitivePropertiesOnly()) { return parameters.front(); } - return ""; + return std::string(); } } linkOnlyNode; diff --git a/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-result.txt b/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-stderr.txt b/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-stderr.txt new file mode 100644 index 0000000..cded130 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking-stderr.txt @@ -0,0 +1,8 @@ +CMake Error at LINK_ONLY-not-linking.cmake:1 \(add_custom_target\): + Error evaluating generator expression: + + \$ + + \$ may only be used for linking +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\) diff --git a/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking.cmake b/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking.cmake new file mode 100644 index 0000000..16db0a2 --- /dev/null +++ b/Tests/RunCMake/GeneratorExpression/LINK_ONLY-not-linking.cmake @@ -0,0 +1 @@ +add_custom_target(Custom ALL COMMAND ${CMAKE_COMMAND} -E echo $) diff --git a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake index 625bab2..f5584d5 100644 --- a/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake +++ b/Tests/RunCMake/GeneratorExpression/RunCMakeTest.cmake @@ -29,6 +29,7 @@ run_cmake(COMPILE_LANGUAGE-unknown-lang) run_cmake(TARGET_FILE-recursion) run_cmake(OUTPUT_NAME-recursion) run_cmake(TARGET_PROPERTY-LOCATION) +run_cmake(LINK_ONLY-not-linking) run_cmake(ImportedTarget-TARGET_PDB_FILE) if(LINKER_SUPPORTS_PDB) -- cgit v0.12