mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-09 19:24:23 +01:00
Merge pull request #510 from miloyip/issue509_writingnaninf
Fix #509 by checking Nan/Inf when writing a double
This commit is contained in:
commit
8fbe442925
@ -40,6 +40,7 @@ public:
|
||||
|
||||
bool IsNan() const { return (u_ & kExponentMask) == kExponentMask && Significand() != 0; }
|
||||
bool IsInf() const { return (u_ & kExponentMask) == kExponentMask && Significand() == 0; }
|
||||
bool IsNanOrInf() const { return (u_ & kExponentMask) == kExponentMask; }
|
||||
bool IsNormal() const { return (u_ & kExponentMask) != 0 || Significand() == 0; }
|
||||
bool IsZero() const { return (u_ & (kExponentMask | kSignificandMask)) == 0; }
|
||||
|
||||
|
@ -235,6 +235,9 @@ protected:
|
||||
}
|
||||
|
||||
bool WriteDouble(double d) {
|
||||
if (internal::Double(d).IsNanOrInf())
|
||||
return false;
|
||||
|
||||
char buffer[25];
|
||||
char* end = internal::dtoa(d, buffer);
|
||||
for (char* p = buffer; p != end; ++p)
|
||||
@ -381,6 +384,9 @@ inline bool Writer<StringBuffer>::WriteUint64(uint64_t u) {
|
||||
|
||||
template<>
|
||||
inline bool Writer<StringBuffer>::WriteDouble(double d) {
|
||||
if (internal::Double(d).IsNanOrInf())
|
||||
return false;
|
||||
|
||||
char *buffer = os_->Push(25);
|
||||
char* end = internal::dtoa(d, buffer);
|
||||
os_->Pop(static_cast<size_t>(25 - (end - buffer)));
|
||||
|
@ -375,3 +375,28 @@ TEST(Writer, InvalidEventSequence) {
|
||||
EXPECT_FALSE(writer.IsComplete());
|
||||
}
|
||||
}
|
||||
|
||||
extern double zero; // clang -Wmissing-variable-declarations
|
||||
double zero = 0.0; // Use global variable to prevent compiler warning
|
||||
|
||||
TEST(Writer, NaN) {
|
||||
double nan = zero / zero;
|
||||
EXPECT_TRUE(internal::Double(nan).IsNan());
|
||||
StringBuffer buffer;
|
||||
Writer<StringBuffer> writer(buffer);
|
||||
EXPECT_FALSE(writer.Double(nan));
|
||||
}
|
||||
|
||||
TEST(Writer, Inf) {
|
||||
double inf = 1.0 / zero;
|
||||
EXPECT_TRUE(internal::Double(inf).IsInf());
|
||||
StringBuffer buffer;
|
||||
{
|
||||
Writer<StringBuffer> writer(buffer);
|
||||
EXPECT_FALSE(writer.Double(inf));
|
||||
}
|
||||
{
|
||||
Writer<StringBuffer> writer(buffer);
|
||||
EXPECT_FALSE(writer.Double(-inf));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user