Avoid upcasting uninitialized pointers

Fixes google/protobuf#693

msan flags this as being undefined behavior. I think it's triggering
because the compiler has to insert a branch to avoid changing the
pointer's value if it starts out NULL. I can't figure out if this is
actually undefined behavior or not, but it definitely seems to be a gray
area of the standard which is best avoided.
This commit is contained in:
Brian Silverman 2016-01-20 23:05:25 -05:00
parent fe066bd514
commit 96c2dd5dfc

View File

@ -224,14 +224,14 @@ inline StatusOr<T>& StatusOr<T>::operator=(const StatusOr<T>& other) {
template<typename T>
template<typename U>
inline StatusOr<T>::StatusOr(const StatusOr<U>& other)
: status_(other.status_), value_(other.value_) {
: status_(other.status_), value_(other.status_.ok() ? other.value_ : NULL) {
}
template<typename T>
template<typename U>
inline StatusOr<T>& StatusOr<T>::operator=(const StatusOr<U>& other) {
status_ = other.status_;
value_ = other.value_;
if (status_.ok()) value_ = other.value_;
return *this;
}