Skip to content

Commit 0c62cfc

Browse files
authored
Merge pull request swiftlang#1978 from spevans/pr_sr_9685_42
[4.2] SR-9685: Accessing NSNumber(value: 1.2 as Float).description crashes
2 parents ff9b072 + b4cf0d1 commit 0c62cfc

File tree

2 files changed

+82
-2
lines changed

2 files changed

+82
-2
lines changed

Foundation/NSNumber.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -985,7 +985,7 @@ open class NSNumber : NSValue {
985985
return String(format: "%@", locale: locale, unsafeBitCast(_cfObject, to: UnsafePointer<CFNumber>.self))
986986
}
987987

988-
case kCFNumberFloatType, kCFNumberCGFloatType, kCFNumberFloatType:
988+
case kCFNumberFloatType, kCFNumberFloat32Type:
989989
return String(format: "%0.7g", locale: locale, self.floatValue)
990990

991991
case kCFNumberFloat64Type, kCFNumberDoubleType:
@@ -1022,7 +1022,7 @@ open class NSNumber : NSValue {
10221022
return String(format: "%@", locale: nil, unsafeBitCast(_cfObject, to: UnsafePointer<CFNumber>.self))
10231023
}
10241024

1025-
case kCFNumberFloatType, kCFNumberCGFloatType, kCFNumberFloatType:
1025+
case kCFNumberFloatType, kCFNumberFloat32Type:
10261026
return self.floatValue.description
10271027

10281028
case kCFNumberFloat64Type, kCFNumberDoubleType:

TestFoundation/TestNSNumber.swift

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,6 +1035,26 @@ class TestNSNumber : XCTestCase {
10351035
XCTAssertEqual(NSNumber(value: UInt32.max).description, "4294967295")
10361036
XCTAssertEqual(NSNumber(value: UInt64.min).description, "0")
10371037
XCTAssertEqual(NSNumber(value: UInt64.max).description, "18446744073709551615")
1038+
1039+
XCTAssertEqual(NSNumber(value: 1.2 as Float).description, "1.2")
1040+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Float).description, "1e+09")
1041+
XCTAssertEqual(NSNumber(value: -0.99 as Float).description, "-0.99")
1042+
XCTAssertEqual(NSNumber(value: Float(0)).description, "0.0")
1043+
XCTAssertEqual(NSNumber(value: Float.nan).description, "nan")
1044+
XCTAssertEqual(NSNumber(value: Float.leastNormalMagnitude).description, "1.1754944e-38")
1045+
XCTAssertEqual(NSNumber(value: Float.leastNonzeroMagnitude).description, "1e-45")
1046+
XCTAssertEqual(NSNumber(value: Float.greatestFiniteMagnitude).description, "3.4028235e+38")
1047+
XCTAssertEqual(NSNumber(value: Float.pi).description, "3.1415925")
1048+
1049+
XCTAssertEqual(NSNumber(value: 1.2 as Double).description, "1.2")
1050+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Double).description, "1000000000.0")
1051+
XCTAssertEqual(NSNumber(value: -0.99 as Double).description, "-0.99")
1052+
XCTAssertEqual(NSNumber(value: Double(0)).description, "0.0")
1053+
XCTAssertEqual(NSNumber(value: Double.nan).description, "nan")
1054+
XCTAssertEqual(NSNumber(value: Double.leastNormalMagnitude).description, "2.2250738585072014e-308")
1055+
XCTAssertEqual(NSNumber(value: Double.leastNonzeroMagnitude).description, "5e-324")
1056+
XCTAssertEqual(NSNumber(value: Double.greatestFiniteMagnitude).description, "1.7976931348623157e+308")
1057+
XCTAssertEqual(NSNumber(value: Double.pi).description, "3.141592653589793")
10381058
}
10391059

10401060
func test_descriptionWithLocale() {
@@ -1060,6 +1080,26 @@ class TestNSNumber : XCTestCase {
10601080
XCTAssertEqual(NSNumber(value: UInt64.min).description(withLocale: nil), "0")
10611081
XCTAssertEqual(NSNumber(value: UInt64.max).description(withLocale: nil), "18446744073709551615")
10621082

1083+
XCTAssertEqual(NSNumber(value: 1.2 as Float).description(withLocale: nil), "1.2")
1084+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Float).description(withLocale: nil), "1e+09")
1085+
XCTAssertEqual(NSNumber(value: -0.99 as Float).description(withLocale: nil), "-0.99")
1086+
XCTAssertEqual(NSNumber(value: Float(0)).description(withLocale: nil), "0.0")
1087+
XCTAssertEqual(NSNumber(value: Float.nan).description(withLocale: nil), "nan")
1088+
XCTAssertEqual(NSNumber(value: Float.leastNormalMagnitude).description(withLocale: nil), "1.1754944e-38")
1089+
XCTAssertEqual(NSNumber(value: Float.leastNonzeroMagnitude).description(withLocale: nil), "1e-45")
1090+
XCTAssertEqual(NSNumber(value: Float.greatestFiniteMagnitude).description(withLocale: nil), "3.4028235e+38")
1091+
XCTAssertEqual(NSNumber(value: Float.pi).description(withLocale: nil), "3.1415925")
1092+
1093+
XCTAssertEqual(NSNumber(value: 1.2 as Double).description(withLocale: nil), "1.2")
1094+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Double).description(withLocale: nil), "1000000000.0")
1095+
XCTAssertEqual(NSNumber(value: -0.99 as Double).description(withLocale: nil), "-0.99")
1096+
XCTAssertEqual(NSNumber(value: Double(0)).description(withLocale: nil), "0.0")
1097+
XCTAssertEqual(NSNumber(value: Double.nan).description(withLocale: nil), "nan")
1098+
XCTAssertEqual(NSNumber(value: Double.leastNormalMagnitude).description(withLocale: nil), "2.2250738585072014e-308")
1099+
XCTAssertEqual(NSNumber(value: Double.leastNonzeroMagnitude).description(withLocale: nil), "5e-324")
1100+
XCTAssertEqual(NSNumber(value: Double.greatestFiniteMagnitude).description(withLocale: nil), "1.7976931348623157e+308")
1101+
XCTAssertEqual(NSNumber(value: Double.pi).description(withLocale: nil), "3.141592653589793")
1102+
10631103
// en_GB Locale
10641104
XCTAssertEqual(NSNumber(value: 1000).description(withLocale: Locale(identifier: "en_GB")), "1,000")
10651105
XCTAssertEqual(NSNumber(value: 0.001).description(withLocale: Locale(identifier: "en_GB")), "0.001")
@@ -1085,6 +1125,26 @@ class TestNSNumber : XCTestCase {
10851125
// XCTAssertEqual(NSNumber(value: UInt64.max).description(withLocale: Locale(identifier: "en_GB")), "18,446,744,073,709,551,615")
10861126
XCTAssertEqual(NSNumber(value: UInt64.max).description(withLocale: Locale(identifier: "en_GB")), "18446744073709551615")
10871127

1128+
XCTAssertEqual(NSNumber(value: 1.2 as Float).description(withLocale: Locale(identifier: "en_GB")), "1.2")
1129+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Float).description(withLocale: Locale(identifier: "en_GB")), "1E+09")
1130+
XCTAssertEqual(NSNumber(value: -0.99 as Float).description(withLocale: Locale(identifier: "en_GB")), "-0.99")
1131+
XCTAssertEqual(NSNumber(value: Float(0)).description(withLocale: Locale(identifier: "en_GB")), "0")
1132+
XCTAssertEqual(NSNumber(value: Float.nan).description(withLocale: Locale(identifier: "en_GB")), "NaN")
1133+
XCTAssertEqual(NSNumber(value: Float.leastNormalMagnitude).description(withLocale: Locale(identifier: "en_GB")), "1.175494E-38")
1134+
XCTAssertEqual(NSNumber(value: Float.leastNonzeroMagnitude).description(withLocale: Locale(identifier: "en_GB")), "1.401298E-45")
1135+
XCTAssertEqual(NSNumber(value: Float.greatestFiniteMagnitude).description(withLocale: Locale(identifier: "en_GB")), "3.402823E+38")
1136+
XCTAssertEqual(NSNumber(value: Float.pi).description(withLocale: Locale(identifier: "en_GB")), "3.141593")
1137+
1138+
XCTAssertEqual(NSNumber(value: 1.2 as Double).description(withLocale: Locale(identifier: "en_GB")), "1.2")
1139+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Double).description(withLocale: Locale(identifier: "en_GB")), "1,000,000,000")
1140+
XCTAssertEqual(NSNumber(value: -0.99 as Double).description(withLocale: Locale(identifier: "en_GB")), "-0.99")
1141+
XCTAssertEqual(NSNumber(value: Double(0)).description(withLocale: Locale(identifier: "en_GB")), "0")
1142+
XCTAssertEqual(NSNumber(value: Double.nan).description(withLocale: Locale(identifier: "en_GB")), "NaN")
1143+
// Disable following three tests due to SR-9699 - ICU not built for CI testing for Foundation pull requests
1144+
//XCTAssertEqual(NSNumber(value: Double.leastNormalMagnitude).description(withLocale: Locale(identifier: "en_GB")), "2.225073858507201E-308")
1145+
//XCTAssertEqual(NSNumber(value: Double.leastNonzeroMagnitude).description(withLocale: Locale(identifier: "en_GB")), "5E-324")
1146+
//XCTAssertEqual(NSNumber(value: Double.greatestFiniteMagnitude).description(withLocale: Locale(identifier: "en_GB")), "1.797693134862316E+308")
1147+
10881148
// de_DE Locale
10891149
XCTAssertEqual(NSNumber(value: 1000).description(withLocale: Locale(identifier: "de_DE")), "1.000")
10901150
XCTAssertEqual(NSNumber(value: 0.001).description(withLocale: Locale(identifier: "de_DE")), "0,001")
@@ -1109,6 +1169,26 @@ class TestNSNumber : XCTestCase {
11091169
// This is the correct value but currently buggy and the locale is not used
11101170
//XCTAssertEqual(NSNumber(value: UInt64.max).description(withLocale: Locale(identifier: "de_DE")), "18.446.744.073.709.551.615")
11111171
XCTAssertEqual(NSNumber(value: UInt64.max).description(withLocale: Locale(identifier: "de_DE")), "18446744073709551615")
1172+
1173+
XCTAssertEqual(NSNumber(value: 1.2 as Float).description(withLocale: Locale(identifier: "de_DE")), "1,2")
1174+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Float).description(withLocale: Locale(identifier: "de_DE")), "1E+09")
1175+
XCTAssertEqual(NSNumber(value: -0.99 as Float).description(withLocale: Locale(identifier: "de_DE")), "-0,99")
1176+
XCTAssertEqual(NSNumber(value: Float.pi).description(withLocale: Locale(identifier: "de_DE")), "3,141593")
1177+
XCTAssertEqual(NSNumber(value: Float(0)).description(withLocale: Locale(identifier: "de_DE")), "0")
1178+
XCTAssertEqual(NSNumber(value: Float.nan).description(withLocale: Locale(identifier: "de_DE")), "NaN")
1179+
XCTAssertEqual(NSNumber(value: Float.leastNormalMagnitude).description(withLocale: Locale(identifier: "de_DE")), "1,175494E-38")
1180+
XCTAssertEqual(NSNumber(value: Float.leastNonzeroMagnitude).description(withLocale: Locale(identifier: "de_DE")), "1,401298E-45")
1181+
XCTAssertEqual(NSNumber(value: Float.greatestFiniteMagnitude).description(withLocale: Locale(identifier: "de_DE")), "3,402823E+38")
1182+
1183+
XCTAssertEqual(NSNumber(value: 1.2 as Double).description(withLocale: Locale(identifier: "de_DE")), "1,2")
1184+
XCTAssertEqual(NSNumber(value: 1000_000_000 as Double).description(withLocale: Locale(identifier: "de_DE")), "1.000.000.000")
1185+
XCTAssertEqual(NSNumber(value: -0.99 as Double).description(withLocale: Locale(identifier: "de_DE")), "-0,99")
1186+
XCTAssertEqual(NSNumber(value: Double(0)).description(withLocale: Locale(identifier: "de_DE")), "0")
1187+
XCTAssertEqual(NSNumber(value: Double.nan).description(withLocale: Locale(identifier: "de_DE")), "NaN")
1188+
// Disable following three tests due to SR-9699 - ICU not built for CI testing for Foundation pull requests
1189+
//XCTAssertEqual(NSNumber(value: Double.leastNormalMagnitude).description(withLocale: Locale(identifier: "de_DE")), "2,225073858507201E-308")
1190+
//XCTAssertEqual(NSNumber(value: Double.leastNonzeroMagnitude).description(withLocale: Locale(identifier: "de_DE")), "5E-324")
1191+
//XCTAssertEqual(NSNumber(value: Double.greatestFiniteMagnitude).description(withLocale: Locale(identifier: "de_DE")), "1,797693134862316E+308")
11121192
}
11131193

11141194
func test_objCType() {

0 commit comments

Comments
 (0)