From cb1d4f590315b66ac2a858e44570f198b71db12d Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Fri, 20 Dec 2019 14:28:01 -0800 Subject: [PATCH] ICU-20916 UBSan & ErrorProne fixes --- icu4c/source/common/lsr.cpp | 2 +- .../ibm/icu/impl/locale/LocaleDistance.java | 7 ++++++- .../ibm/icu/impl/locale/XLikelySubtags.java | 7 ++++++- .../src/com/ibm/icu/util/LocaleMatcher.java | 19 +++++++++---------- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/icu4c/source/common/lsr.cpp b/icu4c/source/common/lsr.cpp index a5e10ef1767..d4308ad0275 100644 --- a/icu4c/source/common/lsr.cpp +++ b/icu4c/source/common/lsr.cpp @@ -103,7 +103,7 @@ int32_t LSR::indexForRegion(const char *region) { LSR &LSR::setHashCode() { if (hashCode == 0) { - int32_t h = ustr_hashCharsN(language, static_cast(uprv_strlen(language))); + uint32_t h = ustr_hashCharsN(language, static_cast(uprv_strlen(language))); h = h * 37 + ustr_hashCharsN(script, static_cast(uprv_strlen(script))); h = h * 37 + regionIndex; hashCode = h * 37 + flags; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java index 028cd8a2bad..b5bd4dfe096 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/LocaleDistance.java @@ -173,7 +173,7 @@ public class LocaleDistance { @Override public boolean equals(Object other) { if (this == other) { return true; } - if (!getClass().equals(other.getClass())) { return false; } + if (other == null || !getClass().equals(other.getClass())) { return false; } Data od = (Data)other; return Arrays.equals(trie, od.trie) && Arrays.equals(regionToPartitionsIndex, od.regionToPartitionsIndex) && @@ -181,6 +181,11 @@ public class LocaleDistance { paradigmLSRs.equals(od.paradigmLSRs) && Arrays.equals(distances, od.distances); } + + @Override + public int hashCode() { // unused; silence ErrorProne + return 1; + } } // VisibleForTesting diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java index 1938170e74e..543aadef159 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/locale/XLikelySubtags.java @@ -97,7 +97,7 @@ public final class XLikelySubtags { @Override public boolean equals(Object other) { if (this == other) { return true; } - if (!getClass().equals(other.getClass())) { return false; } + if (other == null || !getClass().equals(other.getClass())) { return false; } Data od = (Data)other; return languageAliases.equals(od.languageAliases) && @@ -105,6 +105,11 @@ public final class XLikelySubtags { Arrays.equals(trie, od.trie) && Arrays.equals(lsrs, od.lsrs); } + + @Override + public int hashCode() { // unused; silence ErrorProne + return 1; + } } // VisibleForTesting diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java b/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java index a333355c4c0..f424679cbdb 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java @@ -15,7 +15,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Objects; import com.ibm.icu.impl.locale.LSR; import com.ibm.icu.impl.locale.LocaleDistance; @@ -522,19 +521,19 @@ public final class LocaleMatcher { public String toString() { StringBuilder s = new StringBuilder().append("{LocaleMatcher.Builder"); if (supportedLocales != null && !supportedLocales.isEmpty()) { - s.append(" supported={").append(supportedLocales.toString()).append('}'); + s.append(" supported={").append(supportedLocales).append('}'); } if (defaultLocale != null) { - s.append(" default=").append(defaultLocale.toString()); + s.append(" default=").append(defaultLocale); } if (favor != null) { - s.append(" distance=").append(favor.toString()); + s.append(" distance=").append(favor); } if (thresholdDistance >= 0) { s.append(String.format(" threshold=%d", thresholdDistance)); } if (demotion != null) { - s.append(" demotion=").append(demotion.toString()); + s.append(" demotion=").append(demotion); } return s.append('}').toString(); } @@ -1018,7 +1017,7 @@ public final class LocaleMatcher { double distance = LocaleDistance.getDistanceDouble(indexAndDistance); if (TRACE_MATCHER) { System.err.printf("LocaleMatcher distance(desired=%s, supported=%s)=%g\n", - Objects.toString(desired), Objects.toString(supported), distance); + String.valueOf(desired), String.valueOf(supported), distance); } return (100.0 - distance) / 100.0; } @@ -1050,15 +1049,15 @@ public final class LocaleMatcher { StringBuilder s = new StringBuilder().append("{LocaleMatcher"); // Supported languages in the order that we try to match them. if (supportedLSRs.length > 0) { - s.append(" supportedLSRs={").append(supportedLSRs[0].toString()); + s.append(" supportedLSRs={").append(supportedLSRs[0]); for (int i = 1; i < supportedLSRs.length; ++i) { - s.append(", ").append(supportedLSRs[i].toString()); + s.append(", ").append(supportedLSRs[i]); } s.append('}'); } - s.append(" default=").append(Objects.toString(defaultULocale)); + s.append(" default=").append(defaultULocale); if (favorSubtag != null) { - s.append(" favor=").append(favorSubtag.toString()); + s.append(" favor=").append(favorSubtag); } if (thresholdDistance >= 0) { s.append(String.format(" threshold=%d", thresholdDistance));