diff options
author | Tim Shen <timshen91@gmail.com> | 2016-10-28 22:45:33 +0000 |
---|---|---|
committer | Tim Shen <timshen91@gmail.com> | 2016-10-28 22:45:33 +0000 |
commit | b4991548c80b2bcac37ea5f2eb7d8b6dfec63d03 (patch) | |
tree | 632255d5e510f541eb81a36f319e61db38b3bc21 /llvm/lib/Support/APFloat.cpp | |
parent | db6b6a7f0c951c6b11b68605ede0aacbbda4bb2a (diff) | |
download | bcm5719-llvm-b4991548c80b2bcac37ea5f2eb7d8b6dfec63d03.tar.gz bcm5719-llvm-b4991548c80b2bcac37ea5f2eb7d8b6dfec63d03.zip |
[APFloat] Fix memory bugs revealed by MSan
Reviewers: eugenis, hfinkel, kbarton, iteratee, echristo
Subscribers: mehdi_amini, llvm-commits
Differential Revision: https://reviews.llvm.org/D26102
llvm-svn: 285468
Diffstat (limited to 'llvm/lib/Support/APFloat.cpp')
-rw-r--r-- | llvm/lib/Support/APFloat.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index 05afa06a552..20e7841129d 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -818,7 +818,10 @@ IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics) { sign = false; } -IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, uninitializedTag tag) { +// Delegate to the previous constructor, because later copy constructor may +// actually inspects category, which can't be garbage. +IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, uninitializedTag tag) + : IEEEFloat(ourSemantics) { // Allocates storage if necessary but does not initialize it. initialize(&ourSemantics); } @@ -3877,7 +3880,9 @@ DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, APFloat &&First, DoubleAPFloat::DoubleAPFloat(const DoubleAPFloat &RHS) : Semantics(RHS.Semantics), - Floats(new APFloat[2]{APFloat(RHS.Floats[0]), APFloat(RHS.Floats[1])}) { + Floats(RHS.Floats ? new APFloat[2]{APFloat(RHS.Floats[0]), + APFloat(RHS.Floats[1])} + : nullptr) { assert(Semantics == &PPCDoubleDouble); } @@ -3888,7 +3893,7 @@ DoubleAPFloat::DoubleAPFloat(DoubleAPFloat &&RHS) } DoubleAPFloat &DoubleAPFloat::operator=(const DoubleAPFloat &RHS) { - if (Semantics == RHS.Semantics) { + if (Semantics == RHS.Semantics && RHS.Floats) { Floats[0] = RHS.Floats[0]; Floats[1] = RHS.Floats[1]; } else if (this != &RHS) { |