mirror of
				https://github.com/Tencent/rapidjson.git
				synced 2025-10-27 19:10:24 +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:
		| @@ -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; } | ||||
|  | ||||
|   | ||||
| @@ -242,6 +242,9 @@ protected: | ||||
|     } | ||||
|  | ||||
|     bool WriteDouble(double d) { | ||||
|         if (internal::Double(d).IsNanOrInf()) | ||||
|             return false; | ||||
|          | ||||
|         char buffer[25]; | ||||
|         char* end = internal::dtoa(d, buffer); | ||||
|         PutReserve(*os_, static_cast<size_t>(end - buffer)); | ||||
| @@ -394,6 +397,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)); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Milo Yip
					Milo Yip