From 302c2559312ab34049dd7f90ceefae9b750e9475 Mon Sep 17 00:00:00 2001 From: Shane Carr Date: Wed, 4 Oct 2017 22:29:21 +0000 Subject: [PATCH] ICU-13177 Fixing coverity issues in number formatting code. X-SVN-Rev: 40554 --- icu4c/source/i18n/number_compact.cpp | 7 ++++--- icu4c/source/i18n/number_decimalquantity.cpp | 1 + icu4c/source/i18n/number_longnames.cpp | 2 +- icu4c/source/i18n/number_modifiers.cpp | 3 ++- icu4c/source/i18n/number_patternmodifier.h | 12 ++++++------ icu4c/source/i18n/number_patternstring.cpp | 4 ++-- icu4c/source/i18n/number_patternstring.h | 4 ++-- .../core/src/com/ibm/icu/impl/number/MacroProps.java | 3 +++ .../src/com/ibm/icu/impl/number/MultiplierImpl.java | 2 +- .../src/com/ibm/icu/impl/number/SimpleModifier.java | 3 ++- .../test/format/IntlTestDecimalFormatSymbols.java | 2 +- 11 files changed, 25 insertions(+), 18 deletions(-) diff --git a/icu4c/source/i18n/number_compact.cpp b/icu4c/source/i18n/number_compact.cpp index 12fa956a394..8943ebbf194 100644 --- a/icu4c/source/i18n/number_compact.cpp +++ b/icu4c/source/i18n/number_compact.cpp @@ -216,7 +216,6 @@ CompactHandler::CompactHandler(CompactStyle compactStyle, const Locale &locale, UErrorCode &status) : rules(rules), parent(parent) { data.populate(locale, nsName, compactStyle, compactType, status); - if (U_FAILURE(status)) { return; } if (buildReference != nullptr) { // Safe code path precomputeAllModifiers(*buildReference, status); @@ -234,6 +233,8 @@ CompactHandler::~CompactHandler() { } void CompactHandler::precomputeAllModifiers(MutablePatternModifier &buildReference, UErrorCode &status) { + if (U_FAILURE(status)) { return; } + // Initial capacity of 12 for 0K, 00K, 000K, ...M, ...B, and ...T UVector allPatterns(12, status); if (U_FAILURE(status)) { return; } @@ -306,8 +307,8 @@ void CompactHandler::processQuantity(DecimalQuantity &quantity, MicroProps &micr // C++ Note: Use unsafePatternInfo for proper lifecycle. ParsedPatternInfo &patternInfo = const_cast(this)->unsafePatternInfo; PatternParser::parseToPatternInfo(UnicodeString(patternString), patternInfo, status); - dynamic_cast(const_cast(micros.modMiddle))->setPatternInfo( - &patternInfo); + static_cast(const_cast(micros.modMiddle)) + ->setPatternInfo(&patternInfo); numDigits = patternInfo.positive.integerTotal; } diff --git a/icu4c/source/i18n/number_decimalquantity.cpp b/icu4c/source/i18n/number_decimalquantity.cpp index 15e0bda090d..1582e6e27be 100644 --- a/icu4c/source/i18n/number_decimalquantity.cpp +++ b/icu4c/source/i18n/number_decimalquantity.cpp @@ -80,6 +80,7 @@ static double DOUBLE_MULTIPLIERS[] = { DecimalQuantity::DecimalQuantity() { setBcdToZero(); + flags = 0; } DecimalQuantity::~DecimalQuantity() { diff --git a/icu4c/source/i18n/number_longnames.cpp b/icu4c/source/i18n/number_longnames.cpp index 761cd2c4522..1ef7e5798a4 100644 --- a/icu4c/source/i18n/number_longnames.cpp +++ b/icu4c/source/i18n/number_longnames.cpp @@ -30,7 +30,7 @@ class PluralTableSink : public ResourceSink { } } - void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) override { + void put(const char *key, ResourceValue &value, UBool /*noFallback*/, UErrorCode &status) U_OVERRIDE { ResourceTable pluralsTable = value.getTable(status); if (U_FAILURE(status)) { return; } for (int i = 0; pluralsTable.getKeyAndValue(i, key, value); ++i) { diff --git a/icu4c/source/i18n/number_modifiers.cpp b/icu4c/source/i18n/number_modifiers.cpp index baea2d99408..26f0a86f2c9 100644 --- a/icu4c/source/i18n/number_modifiers.cpp +++ b/icu4c/source/i18n/number_modifiers.cpp @@ -87,7 +87,8 @@ SimpleModifier::SimpleModifier(const SimpleFormatter &simpleFormatter, Field fie } } -SimpleModifier::SimpleModifier() : fStrong(false), fPrefixLength(0), fSuffixLength(0) { +SimpleModifier::SimpleModifier() + : fField(UNUM_FIELD_COUNT), fStrong(false), fPrefixLength(0), fSuffixLength(0) { } int32_t SimpleModifier::apply(NumberStringBuilder &output, int leftIndex, int rightIndex, diff --git a/icu4c/source/i18n/number_patternmodifier.h b/icu4c/source/i18n/number_patternmodifier.h index a04be4e9f9a..05580d3de3f 100644 --- a/icu4c/source/i18n/number_patternmodifier.h +++ b/icu4c/source/i18n/number_patternmodifier.h @@ -189,28 +189,28 @@ class U_I18N_API MutablePatternModifier UnicodeString toUnicodeString() const U_OVERRIDE; private: - // Modifier details + // Modifier details (initialized in constructor) const bool fStrong; - // Pattern details + // Pattern details (initialized in setPatternInfo and setPatternAttributes) const AffixPatternProvider *patternInfo; UNumberSignDisplay signDisplay; bool perMilleReplacesPercent; - // Symbol details + // Symbol details (initialized in setSymbols) const DecimalFormatSymbols *symbols; UNumberUnitWidth unitWidth; char16_t currencyCode[4]; const PluralRules *rules; - // Number details + // Number details (initialized in setNumberProperties) bool isNegative; StandardPlural::Form plural; - // QuantityChain details + // QuantityChain details (initialized in addToChain) const MicroPropsGenerator *parent; - // Transient CharSequence fields + // Transient CharSequence fields (initialized in enterCharSequenceMode) bool inCharSequenceMode = false; int32_t fFlags; int32_t fLength; diff --git a/icu4c/source/i18n/number_patternstring.cpp b/icu4c/source/i18n/number_patternstring.cpp index 3a9e1c4c801..dd6707e4f28 100644 --- a/icu4c/source/i18n/number_patternstring.cpp +++ b/icu4c/source/i18n/number_patternstring.cpp @@ -23,7 +23,7 @@ PatternParser::parseToProperties(const UnicodeString& pattern, IgnoreRounding ig return properties; } -void PatternParser::parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties properties, +void PatternParser::parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties& properties, IgnoreRounding ignoreRounding, UErrorCode &status) { parseToExistingPropertiesImpl(pattern, properties, ignoreRounding, status); } @@ -447,7 +447,7 @@ PatternParser::parseToExistingPropertiesImpl(const UnicodeString& pattern, Decim } void PatternParser::patternInfoToProperties(DecimalFormatProperties &properties, - ParsedPatternInfo patternInfo, + ParsedPatternInfo& patternInfo, IgnoreRounding _ignoreRounding, UErrorCode &status) { // Translate from PatternParseResult to Properties. // Note that most data from "negative" is ignored per the specification of DecimalFormat. diff --git a/icu4c/source/i18n/number_patternstring.h b/icu4c/source/i18n/number_patternstring.h index b47de4f964d..5fbff027344 100644 --- a/icu4c/source/i18n/number_patternstring.h +++ b/icu4c/source/i18n/number_patternstring.h @@ -186,7 +186,7 @@ class U_I18N_API PatternParser { * @throws IllegalArgumentException * If there was a syntax error in the pattern string. */ - static void parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties properties, + static void parseToExistingProperties(const UnicodeString& pattern, DecimalFormatProperties& properties, IgnoreRounding ignoreRounding, UErrorCode &status); private: @@ -196,7 +196,7 @@ class U_I18N_API PatternParser { /** Finalizes the temporary data stored in the ParsedPatternInfo to the Properties. */ static void - patternInfoToProperties(DecimalFormatProperties &properties, ParsedPatternInfo patternInfo, + patternInfoToProperties(DecimalFormatProperties &properties, ParsedPatternInfo& patternInfo, IgnoreRounding _ignoreRounding, UErrorCode &status); }; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java index 55f5a8fdd65..711b4e2f0a1 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MacroProps.java @@ -74,6 +74,9 @@ public class MacroProps implements Cloneable { @Override public boolean equals(Object _other) { + if (_other == null) return false; + if (this == _other) return true; + if (!(_other instanceof MacroProps)) return false; MacroProps other = (MacroProps) _other; return Utility.equals(notation, other.notation) && Utility.equals(unit, other.unit) diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java index ca1b8ad59e1..0533ebf4e98 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/MultiplierImpl.java @@ -4,7 +4,7 @@ package com.ibm.icu.impl.number; import java.math.BigDecimal; -public class MultiplierImpl implements MicroPropsGenerator, Cloneable { +public class MultiplierImpl implements MicroPropsGenerator { final int magnitudeMultiplier; final BigDecimal bigDecimalMultiplier; final MicroPropsGenerator parent; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java index 6de0284e6f2..94b64be1ada 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/SimpleModifier.java @@ -22,7 +22,8 @@ public class SimpleModifier implements Modifier { /** Creates a modifier that uses the SimpleFormatter string formats. */ public SimpleModifier(String compiledPattern, Field field, boolean strong) { - this.compiledPattern = (compiledPattern == null) ? "\u0001\u0000" : compiledPattern; + assert compiledPattern != null; + this.compiledPattern = compiledPattern; this.field = field; this.strong = strong; diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java index fa060faf2dc..1f89eb7e69c 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/IntlTestDecimalFormatSymbols.java @@ -293,7 +293,7 @@ public class IntlTestDecimalFormatSymbols extends TestFmwk "\uD801\uDCA0", "\uD801\uDCA1", "\uD801\uDCA2", "\uD801\uDCA3", "\uD801\uDCA4", "\uD801\uDCA5", "\uD801\uDCA6", "\uD801\uDCA7", "\uD801\uDCA8", "\uD801\uDCA9" }; - final String[] differentDigitStrings = {"0", "b", "3", "d", "5", "f", "7", "h", "9", "j"}; + final String[] differentDigitStrings = {"0", "b", "3", "d", "5", "ff", "7", "h", "9", "j"}; DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.ENGLISH); -- 2.40.0