Преглед на файлове

Add a self-reference check for target properties.

Prevent constructs like:

 ... INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>"

Indirect self-references (cycles) are also prevented here, but
indirect generator expression references of any kind are not
possible yet anyway.
Stephen Kelly преди 13 години
родител
ревизия
eb250cd18a
променени са 1 файла, в които са добавени 16 реда и са изтрити 1 реда
  1. 16 1
      Source/cmGeneratorExpressionEvaluator.cxx

+ 16 - 1
Source/cmGeneratorExpressionEvaluator.cxx

@@ -14,6 +14,7 @@
 #include "cmGeneratorExpressionEvaluator.h"
 #include "cmGeneratorExpressionParser.h"
 #include "cmGeneratorExpressionDAGChecker.h"
+#include "cmGeneratorExpression.h"
 
 //----------------------------------------------------------------------------
 static void reportError(cmGeneratorExpressionContext *context,
@@ -264,7 +265,8 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
   std::string Evaluate(const std::vector<std::string> &parameters,
                        cmGeneratorExpressionContext *context,
                        const GeneratorExpressionContent *content,
-                       cmGeneratorExpressionDAGChecker *) const
+                       cmGeneratorExpressionDAGChecker *dagCheckerParent
+                      ) const
   {
     if (parameters.size() != 1 && parameters.size() != 2)
       {
@@ -289,6 +291,19 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
         }
       propertyName = parameters.at(1);
       }
+
+    cmGeneratorExpressionDAGChecker dagChecker(context->Backtrace,
+                                               target->GetName(),
+                                               propertyName,
+                                               content,
+                                               dagCheckerParent);
+
+    if (!dagChecker.check())
+      {
+      dagChecker.reportError(context, content->GetOriginalExpression());
+      return std::string();
+      }
+
     const char *prop = target->GetProperty(propertyName.c_str());
     return prop ? prop : "";
   }