summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-12-22 00:31:54 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-12-22 00:31:54 +0000
commit9679a04da65b33037abac50a54884bb9b7b73698 (patch)
tree13c46d85288eb36a684d4ceddacb299a5b9514bf /include
parent2b45dd58b22da40bb08e82d1564ccecca4a700f5 (diff)
downloadllvm-9679a04da65b33037abac50a54884bb9b7b73698.tar.gz
llvm-9679a04da65b33037abac50a54884bb9b7b73698.tar.bz2
llvm-9679a04da65b33037abac50a54884bb9b7b73698.tar.xz
Fix some undefined behavior when parsing YAML input: don't try to compare an
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
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Support/YAMLTraits.h10
1 files changed, 5 insertions, 5 deletions
diff --git a/include/llvm/Support/YAMLTraits.h b/include/llvm/Support/YAMLTraits.h
index 4487eae248..3fb1f09063 100644
--- a/include/llvm/Support/YAMLTraits.h
+++ b/include/llvm/Support/YAMLTraits.h
@@ -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);