Fix some undefined behavior when parsing YAML input: don't try to compare an
authorRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 22 Dec 2012 00:31:54 +0000 (00:31 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Sat, 22 Dec 2012 00:31:54 +0000 (00:31 +0000)
uninitialized value against a default value. Found by -fsanitize=enum.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170970 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/YAMLTraits.h

index 4487eae248237b8bbd3ffb7bd7b5751a107a3ce0..3fb1f09063ad7047fea6e6e81b29951889226cad 100644 (file)
@@ -360,7 +360,7 @@ public:
 
   template <typename T>
   void enumCase(T &Val, const char* Str, const T ConstVal) {
-    if ( matchEnumScalar(Str, (Val == ConstVal)) ) {
+    if ( matchEnumScalar(Str, outputting() && Val == ConstVal) ) {
       Val = ConstVal;
     }
   }
@@ -368,14 +368,14 @@ public:
   // allow anonymous enum values to be used with LLVM_YAML_STRONG_TYPEDEF
   template <typename T>
   void enumCase(T &Val, const char* Str, const uint32_t ConstVal) {
-    if ( matchEnumScalar(Str, (Val == static_cast<T>(ConstVal))) ) {
+    if ( matchEnumScalar(Str, outputting() && Val == static_cast<T>(ConstVal)) ) {
       Val = ConstVal;
     }
   }
 
   template <typename T>
   void bitSetCase(T &Val, const char* Str, const T ConstVal) {
-    if ( bitSetMatch(Str, ((Val & ConstVal) == ConstVal)) ) {
+    if ( bitSetMatch(Str, outputting() && (Val & ConstVal) == ConstVal) ) {
       Val = Val | ConstVal;
     }
   }
@@ -383,7 +383,7 @@ public:
   // allow anonymous enum values to be used with LLVM_YAML_STRONG_TYPEDEF
   template <typename T>
   void bitSetCase(T &Val, const char* Str, const uint32_t ConstVal) {
-    if ( bitSetMatch(Str, ((Val & ConstVal) == ConstVal)) ) {
+    if ( bitSetMatch(Str, outputting() && (Val & ConstVal) == ConstVal) ) {
       Val = Val | ConstVal;
     }
   }
@@ -423,7 +423,7 @@ private:
                                                                 bool Required) {
     void *SaveInfo;
     bool UseDefault;
-    const bool sameAsDefault = (Val == DefaultValue);
+    const bool sameAsDefault = outputting() && Val == DefaultValue;
     if ( this->preflightKey(Key, Required, sameAsDefault, UseDefault,
                                                                   SaveInfo) ) {
       yamlize(*this, Val, Required);