浏览代码

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 : "";
   }