]> granicus.if.org Git - icu/commitdiff
ICU-21432 Fix TestInternalMeasureUnitImpl() segfaulting with bad data
authorHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Tue, 23 Feb 2021 14:37:32 +0000 (15:37 +0100)
committerHugo van der Merwe <17109322+hugovdm@users.noreply.github.com>
Tue, 23 Feb 2021 16:32:55 +0000 (17:32 +0100)
icu4c/source/test/intltest/measfmttest.cpp

index e5dfcbb8d49fbb08efb4ff788a44eb7f75fb8644..900cc136514084d4736717e321d5eb49b649921e 100644 (file)
@@ -4580,7 +4580,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
     assertEquals("mu1 initial identifier", "", mu1.identifier.data());
     assertEquals("mu1 initial complexity", UMEASURE_UNIT_SINGLE, mu1.complexity);
     assertEquals("mu1 initial units length", 1, mu1.singleUnits.length());
-    assertEquals("mu1 initial units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
+    if (mu1.singleUnits.length() > 0) {
+        assertEquals("mu1 initial units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
+    }
 
     // Producing identifier via build(): the std::move() means mu1 gets modified
     // while it also gets assigned to tmp's internal fImpl.
@@ -4589,7 +4591,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
     assertEquals("mu1 post-move-build identifier", "meter", mu1.identifier.data());
     assertEquals("mu1 post-move-build complexity", UMEASURE_UNIT_SINGLE, mu1.complexity);
     assertEquals("mu1 post-move-build units length", 1, mu1.singleUnits.length());
-    assertEquals("mu1 post-move-build units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
+    if (mu1.singleUnits.length() > 0) {
+        assertEquals("mu1 post-move-build units[0]", "meter", mu1.singleUnits[0]->getSimpleUnitID());
+    }
     assertEquals("MeasureUnit tmp identifier", "meter", tmp.getIdentifier());
 
     // This temporary variable is used when forMeasureUnit's first parameter
@@ -4600,7 +4604,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
     assertEquals("tmpMemory identifier", "", tmpMemory.identifier.data());
     assertEquals("tmpMemory complexity", UMEASURE_UNIT_SINGLE, tmpMemory.complexity);
     assertEquals("tmpMemory units length", 1, tmpMemory.singleUnits.length());
-    assertEquals("tmpMemory units[0]", "meter", tmpMemory.singleUnits[0]->getSimpleUnitID());
+    if (mu1.singleUnits.length() > 0) {
+        assertEquals("tmpMemory units[0]", "meter", tmpMemory.singleUnits[0]->getSimpleUnitID());
+    }
     assertEquals("tmpImplRef identifier", "", tmpImplRef.identifier.data());
     assertEquals("tmpImplRef complexity", UMEASURE_UNIT_SINGLE, tmpImplRef.complexity);
 
@@ -4610,17 +4616,21 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
     assertEquals("mu1 = move(mu2): identifier", "", mu1.identifier.data());
     assertEquals("mu1 = move(mu2): complexity", UMEASURE_UNIT_COMPOUND, mu1.complexity);
     assertEquals("mu1 = move(mu2): units length", 2, mu1.singleUnits.length());
-    assertEquals("mu1 = move(mu2): units[0]", "newton", mu1.singleUnits[0]->getSimpleUnitID());
-    assertEquals("mu1 = move(mu2): units[1]", "meter", mu1.singleUnits[1]->getSimpleUnitID());
+    if (mu1.singleUnits.length() >= 2) {
+        assertEquals("mu1 = move(mu2): units[0]", "newton", mu1.singleUnits[0]->getSimpleUnitID());
+        assertEquals("mu1 = move(mu2): units[1]", "meter", mu1.singleUnits[1]->getSimpleUnitID());
+    }
 
     mu1 = MeasureUnitImpl::forIdentifier("hour-and-minute-and-second", status);
     status.assertSuccess();
     assertEquals("mu1 = HMS: identifier", "", mu1.identifier.data());
     assertEquals("mu1 = HMS: complexity", UMEASURE_UNIT_MIXED, mu1.complexity);
     assertEquals("mu1 = HMS: units length", 3, mu1.singleUnits.length());
-    assertEquals("mu1 = HMS: units[0]", "hour", mu1.singleUnits[0]->getSimpleUnitID());
-    assertEquals("mu1 = HMS: units[1]", "minute", mu1.singleUnits[1]->getSimpleUnitID());
-    assertEquals("mu1 = HMS: units[2]", "second", mu1.singleUnits[2]->getSimpleUnitID());
+    if (mu1.singleUnits.length() >= 3) {
+        assertEquals("mu1 = HMS: units[0]", "hour", mu1.singleUnits[0]->getSimpleUnitID());
+        assertEquals("mu1 = HMS: units[1]", "minute", mu1.singleUnits[1]->getSimpleUnitID());
+        assertEquals("mu1 = HMS: units[2]", "second", mu1.singleUnits[2]->getSimpleUnitID());
+    }
 
     MeasureUnitImpl m2 = MeasureUnitImpl::forIdentifier("", status);
     m2.appendSingleUnit(SingleUnitImpl::forMeasureUnit(MeasureUnit::getMeter(), status), status);
@@ -4628,7 +4638,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
     status.assertSuccess();
     assertEquals("append meter twice: complexity", UMEASURE_UNIT_SINGLE, m2.complexity);
     assertEquals("append meter twice: units length", 1, m2.singleUnits.length());
-    assertEquals("append meter twice: units[0]", "meter", m2.singleUnits[0]->getSimpleUnitID());
+    if (mu1.singleUnits.length() >= 1) {
+        assertEquals("append meter twice: units[0]", "meter", m2.singleUnits[0]->getSimpleUnitID());
+    }
     assertEquals("append meter twice: identifier", "square-meter",
                  std::move(m2).build(status).getIdentifier());
 
@@ -4638,8 +4650,12 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
     status.assertSuccess();
     assertEquals("append meter & centimeter: complexity", UMEASURE_UNIT_COMPOUND, mcm.complexity);
     assertEquals("append meter & centimeter: units length", 2, mcm.singleUnits.length());
-    assertEquals("append meter & centimeter: units[0]", "meter", mcm.singleUnits[0]->getSimpleUnitID());
-    assertEquals("append meter & centimeter: units[1]", "meter", mcm.singleUnits[1]->getSimpleUnitID());
+    if (mu1.singleUnits.length() >= 2) {
+        assertEquals("append meter & centimeter: units[0]", "meter",
+                     mcm.singleUnits[0]->getSimpleUnitID());
+        assertEquals("append meter & centimeter: units[1]", "meter",
+                     mcm.singleUnits[1]->getSimpleUnitID());
+    }
     assertEquals("append meter & centimeter: identifier", "centimeter-meter",
                  std::move(mcm).build(status).getIdentifier());
 
@@ -4647,7 +4663,9 @@ void MeasureFormatTest::TestInternalMeasureUnitImpl() {
     status.assertSuccess();
     assertEquals("meter-square-meter: complexity", UMEASURE_UNIT_SINGLE, m2m.complexity);
     assertEquals("meter-square-meter: units length", 1, m2m.singleUnits.length());
-    assertEquals("meter-square-meter: units[0]", "meter", m2m.singleUnits[0]->getSimpleUnitID());
+    if (mu1.singleUnits.length() >= 1) {
+        assertEquals("meter-square-meter: units[0]", "meter", m2m.singleUnits[0]->getSimpleUnitID());
+    }
     assertEquals("meter-square-meter: identifier", "cubic-meter",
                  std::move(m2m).build(status).getIdentifier());
 }