diff options
author | Brian Silverman <brian@peloton-tech.com> | 2016-01-20 23:05:25 -0500 |
---|---|---|
committer | Brian Silverman <brian@peloton-tech.com> | 2016-01-20 23:05:25 -0500 |
commit | 96c2dd5dfc7359936ca02ac5e18142caeb485a33 (patch) | |
tree | 72d98d5ced420c849bb66f518da7d29999a86259 /src/google | |
parent | fe066bd514fcd08f2c2bf94d3d0e89e3c4f10884 (diff) | |
download | protobuf-96c2dd5dfc7359936ca02ac5e18142caeb485a33.tar.gz protobuf-96c2dd5dfc7359936ca02ac5e18142caeb485a33.tar.bz2 protobuf-96c2dd5dfc7359936ca02ac5e18142caeb485a33.zip |
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.
Diffstat (limited to 'src/google')
-rw-r--r-- | src/google/protobuf/stubs/statusor.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/google/protobuf/stubs/statusor.h b/src/google/protobuf/stubs/statusor.h index a9d2b374..ad848701 100644 --- a/src/google/protobuf/stubs/statusor.h +++ b/src/google/protobuf/stubs/statusor.h @@ -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; } |