浏览代码

Add a warning when variables are used uninitialized.

Bill Hoffman 15 年之前
父节点
当前提交
48b5b85593
共有 3 个文件被更改,包括 21 次插入1 次删除
  1. 6 1
      Source/cmCommandArgumentParserHelper.cxx
  2. 11 0
      Source/cmMakefile.cxx
  3. 4 0
      Source/cmMakefile.h

+ 6 - 1
Source/cmCommandArgumentParserHelper.cxx

@@ -119,10 +119,15 @@ char* cmCommandArgumentParserHelper::ExpandVariable(const char* var)
     cmOStringStream ostr;
     ostr << this->FileLine;
     return this->AddString(ostr.str().c_str());
-    } 
+    }
   const char* value = this->Makefile->GetDefinition(var);
   if(!value && !this->RemoveEmpty)
     {
+    if(!this->Makefile->VariableCleared(var))
+      {
+      std::cerr << this->FileName << ":" << this->FileLine << ":" <<
+        " warning: uninitialized variable \'" << var << "\'\n";
+      }
     return 0;
     }
   if (this->EscapeQuotes && value)

+ 11 - 0
Source/cmMakefile.cxx

@@ -43,6 +43,7 @@ class cmMakefile::Internals
 {
 public:
   std::stack<cmDefinitions, std::list<cmDefinitions> > VarStack;
+  std::set<cmStdString> VarRemoved;
 };
 
 // default is not to be building executables
@@ -1694,9 +1695,19 @@ void cmMakefile::AddDefinition(const char* name, bool value)
 #endif
 }
 
+bool cmMakefile::VariableCleared(const char* var) const
+{
+  if(this->Internal->VarRemoved.find(var) != this->Internal->VarRemoved.end())
+    {
+    return true;
+    }
+  return false;
+}
+
 void cmMakefile::RemoveDefinition(const char* name)
 {
   this->Internal->VarStack.top().Set(name, 0);
+  this->Internal->VarRemoved.insert(name);
 #ifdef CMAKE_BUILD_WITH_CMAKE
   cmVariableWatch* vv = this->GetVariableWatch();
   if ( vv )

+ 4 - 0
Source/cmMakefile.h

@@ -61,6 +61,10 @@ public:
   unsigned int GetCacheMajorVersion();
   unsigned int GetCacheMinorVersion();
 
+  /* return true if a variable has been set with
+     set(foo )
+  */
+  bool VariableCleared(const char* ) const;
   /** Return whether compatibility features needed for a version of
       the cache or lower should be enabled.  */
   bool NeedCacheCompatibility(int major, int minor);