[PATCH] D26102: [APFloat] Fix memory bugs revealed by MSan
Tim Shen via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 28 15:53:51 PDT 2016
timshen created this revision.
timshen added reviewers: eugenis, hfinkel, kbarton, iteratee, echristo.
timshen added a subscriber: llvm-commits.
Herald added a subscriber: mehdi_amini.
https://reviews.llvm.org/D26102
Files:
llvm/include/llvm/ADT/APFloat.h
llvm/lib/Support/APFloat.cpp
Index: llvm/lib/Support/APFloat.cpp
===================================================================
--- llvm/lib/Support/APFloat.cpp
+++ llvm/lib/Support/APFloat.cpp
@@ -818,7 +818,10 @@
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 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::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) {
Index: llvm/include/llvm/ADT/APFloat.h
===================================================================
--- llvm/include/llvm/ADT/APFloat.h
+++ llvm/include/llvm/ADT/APFloat.h
@@ -777,6 +777,7 @@
APFloat(const fltSemantics &Semantics) : U(Semantics) {}
APFloat(const fltSemantics &Semantics, StringRef S);
APFloat(const fltSemantics &Semantics, integerPart I) : U(Semantics, I) {}
+ // TODO: Remove this constructor. This isn't faster than the first one.
APFloat(const fltSemantics &Semantics, uninitializedTag)
: U(Semantics, uninitialized) {}
APFloat(const fltSemantics &Semantics, const APInt &I) : U(Semantics, I) {}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26102.76263.patch
Type: text/x-patch
Size: 1970 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161028/b1822068/attachment.bin>
More information about the llvm-commits
mailing list