From ac0192d1de167e11f2d8a28e2781941be4f60877 Mon Sep 17 00:00:00 2001 From: Mike FABIAN Date: Mon, 19 Aug 2024 16:15:01 +0200 Subject: [PATCH 2/2] Fix coverity warnings icu-74.2 --- source/common/loclikelysubtags.cpp | 1 + source/common/ubidi.cpp | 1 + source/common/ubiditransform.cpp | 2 +- source/common/ucnv.cpp | 3 ++- source/common/ucnv2022.cpp | 2 ++ source/common/ucnv_u16.cpp | 2 ++ source/common/ucnv_u7.cpp | 1 + source/common/ucnvmbcs.cpp | 1 + source/common/ucnvscsu.cpp | 2 ++ source/common/umutablecptrie.cpp | 1 + source/common/unames.cpp | 1 + source/i18n/collationrootelements.cpp | 2 ++ source/i18n/dayperiodrules.cpp | 1 + source/i18n/double-conversion-bignum.cpp | 3 +++ source/i18n/measfmt.cpp | 1 + source/i18n/measunit.cpp | 3 +++ source/i18n/number_fluent.cpp | 1 + source/i18n/number_padding.cpp | 1 + source/i18n/number_rounding.cpp | 2 ++ source/i18n/number_skeletons.cpp | 1 + source/i18n/numrange_fluent.cpp | 1 + source/i18n/plurrule.cpp | 1 + source/i18n/rbt_pars.cpp | 1 + source/i18n/tzgnames.cpp | 1 + source/i18n/vtzone.cpp | 2 +- source/tools/gencnval/gencnval.c | 5 +++++ source/tools/genrb/wrtxml.cpp | 2 +- source/tools/makeconv/makeconv.cpp | 4 ++++ source/tools/toolutil/package.cpp | 1 + source/tools/toolutil/ucbuf.cpp | 2 +- 30 files changed, 47 insertions(+), 5 deletions(-) diff --git a/source/common/loclikelysubtags.cpp b/source/common/loclikelysubtags.cpp index c2a7011b509..7943b6d2489 100644 --- a/source/common/loclikelysubtags.cpp +++ b/source/common/loclikelysubtags.cpp @@ -736,6 +736,7 @@ int32_t XLikelySubtags::getLikelyIndex(const char *language, const char *script) int32_t value; // Small optimization: Array lookup for first language letter. int32_t c0; + /* coverity[overrun-local] */ if (0 <= (c0 = uprv_lowerOrdinal(language[0])) && c0 <= 25 && language[1] != 0 && // language.length() >= 2 (state = trieFirstLetterStates[c0]) != 0) { diff --git a/source/common/ubidi.cpp b/source/common/ubidi.cpp index fcf82fa97a8..18a179a15f7 100644 --- a/source/common/ubidi.cpp +++ b/source/common/ubidi.cpp @@ -1276,6 +1276,7 @@ resolveExplicitLevels(UBiDi *pBiDi, UErrorCode *pErrorCode) { } else /* make it WS so that it is handled by adjustWSLevels() */ dirProps[i]=WS; + /* coverity[overrun-local] */ embeddingLevel=(UBiDiLevel)stack[stackLast]&~ISOLATE; flags|=(DIRPROP_FLAG(ON)|DIRPROP_FLAG_LR(embeddingLevel)); previousLevel=embeddingLevel; diff --git a/source/common/ubiditransform.cpp b/source/common/ubiditransform.cpp index 01f5901a2c2..23634742b88 100644 --- a/source/common/ubiditransform.cpp +++ b/source/common/ubiditransform.cpp @@ -499,7 +499,7 @@ ubiditransform_transform(UBiDiTransform *pBiDiTransform, /* Checking for U_SUCCESS() within the loop to bail out on first failure. */ for (action = pBiDiTransform->pActiveScheme->actions; *action && U_SUCCESS(*pErrorCode); action++) { if ((*action)(pBiDiTransform, pErrorCode)) { - if (action + 1) { + if (action[1] != nullptr) { updateSrc(pBiDiTransform, pBiDiTransform->dest, *pBiDiTransform->pDestLength, *pBiDiTransform->pDestLength, pErrorCode); } diff --git a/source/common/ucnv.cpp b/source/common/ucnv.cpp index a7a07d65d61..87b4cd8ace5 100644 --- a/source/common/ucnv.cpp +++ b/source/common/ucnv.cpp @@ -105,7 +105,7 @@ ucnv_openU (const char16_t * name, *err = U_ILLEGAL_ARGUMENT_ERROR; return nullptr; } - return ucnv_open(u_austrcpy(asciiName, name), err); + return ucnv_open(u_austrncpy(asciiName, name, UCNV_MAX_CONVERTER_NAME_LENGTH), err); } /* Copy the string that is represented by the UConverterPlatform enum @@ -2240,6 +2240,7 @@ ucnv_convertEx(UConverter *targetCnv, UConverter *sourceCnv, } /* The pivot buffer is empty; reset it so we start at pivotStart. */ + /* coverity[escape_local_addr_alias] */ *pivotSource=*pivotTarget=pivotStart; /* diff --git a/source/common/ucnv2022.cpp b/source/common/ucnv2022.cpp index 5989c1b405a..7d5b450d78a 100644 --- a/source/common/ucnv2022.cpp +++ b/source/common/ucnv2022.cpp @@ -3108,6 +3108,7 @@ UConverter_fromUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterFromUnicodeArgs* args } else { /* GB2312_1 or ISO-IR-165 */ U_ASSERT(cs0myConverterArray[cs0], sourceChar, @@ -3392,6 +3393,7 @@ UConverter_toUnicode_ISO_2022_CN_OFFSETS_LOGIC(UConverterToUnicodeArgs *args, }else{ U_ASSERT(tempStatemyConverterArray[tempState]; tempBuf[0] = (char) (mySourceChar); tempBuf[1] = (char) trailByte; diff --git a/source/common/ucnv_u16.cpp b/source/common/ucnv_u16.cpp index c3bcfef50cb..70dfbe89884 100644 --- a/source/common/ucnv_u16.cpp +++ b/source/common/ucnv_u16.cpp @@ -234,6 +234,7 @@ _UTF16BEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, if(length>0) { /* output length bytes with overflow (length>targetCapacity>0) */ + /* coverity[uninit_use_in_call] */ ucnv_fromUWriteBytes(cnv, overflow, length, (char **)&target, pArgs->targetLimit, @@ -835,6 +836,7 @@ _UTF16LEFromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, if(length>0) { /* output length bytes with overflow (length>targetCapacity>0) */ + /* coverity[uninit_use_in_call] */ ucnv_fromUWriteBytes(cnv, overflow, length, &target, pArgs->targetLimit, diff --git a/source/common/ucnv_u7.cpp b/source/common/ucnv_u7.cpp index 398b528e832..6df77253b12 100644 --- a/source/common/ucnv_u7.cpp +++ b/source/common/ucnv_u7.cpp @@ -617,6 +617,7 @@ _UTF7FromUnicodeWithOffsets(UConverterFromUnicodeArgs *pArgs, base64Counter=1; break; case 1: + /* coverity[deref_overflow] */ *target++=toBase64[bits|(c>>14)]; if(target>8)&0x3f]; diff --git a/source/common/ucnvmbcs.cpp b/source/common/ucnvmbcs.cpp index d7606039800..9277ad25837 100644 --- a/source/common/ucnvmbcs.cpp +++ b/source/common/ucnvmbcs.cpp @@ -2839,6 +2839,7 @@ ucnv_MBCSToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, /* Back out bytes from the previous buffer: Need to replay them. */ cnv->preToULength=(int8_t)(bytesFromThisBuffer-backOutDistance); /* preToULength is negative! */ + /* coverity[overflow_sink] */ uprv_memcpy(cnv->preToU, bytes+i, -cnv->preToULength); source=(const uint8_t *)pArgs->source; } diff --git a/source/common/ucnvscsu.cpp b/source/common/ucnvscsu.cpp index 2138e289cad..30a1b69824b 100644 --- a/source/common/ucnvscsu.cpp +++ b/source/common/ucnvscsu.cpp @@ -402,6 +402,7 @@ _SCSUToUnicodeWithOffsets(UConverterToUnicodeArgs *pArgs, case quoteOne: if(b<0x80) { /* all static offsets are in the BMP */ + /* coverity[deref_overflow] */ *target++=(char16_t)(staticOffsets[quoteWindow]+b); if(offsets!=nullptr) { *offsets++=sourceIndex; @@ -642,6 +643,7 @@ _SCSUToUnicode(UConverterToUnicodeArgs *pArgs, *target++=(char16_t)b; } else { /* write from dynamic window */ + /* coverity[deref_overflow] */ uint32_t c=scsu->toUDynamicOffsets[dynamicWindow]+(b&0x7f); if(c<=0xffff) { *target++=(char16_t)c; diff --git a/source/common/umutablecptrie.cpp b/source/common/umutablecptrie.cpp index e58ab6f4897..502dfad5a50 100644 --- a/source/common/umutablecptrie.cpp +++ b/source/common/umutablecptrie.cpp @@ -534,6 +534,7 @@ void MutableCodePointTrie::setRange(UChar32 start, UChar32 end, uint32_t value, // Iterate over all-value blocks. while (start < limit) { int32_t i = start >> UCPTRIE_SHIFT_3; + /* coverity[overrun-local] */ if (flags[i] == ALL_SAME) { index[i] = value; } else /* MIXED */ { diff --git a/source/common/unames.cpp b/source/common/unames.cpp index 1b3192bf25e..c01c9d2db04 100644 --- a/source/common/unames.cpp +++ b/source/common/unames.cpp @@ -1561,6 +1561,7 @@ u_charFromName(UCharNameChoice nameChoice, /* try extended names first */ if (lower[0] == '<') { + /* coverity[deref_overflow] */ if (nameChoice == U_EXTENDED_CHAR_NAME && lower[--i] == '>') { // Parse a string like "" where HHHH is a hex code point. uint32_t limit = i; diff --git a/source/i18n/collationrootelements.cpp b/source/i18n/collationrootelements.cpp index 9b46d14144b..54fa479617a 100644 --- a/source/i18n/collationrootelements.cpp +++ b/source/i18n/collationrootelements.cpp @@ -127,6 +127,7 @@ CollationRootElements::getSecondaryBefore(uint32_t p, uint32_t s) const { } else { index = findPrimary(p) + 1; previousSec = Collation::BEFORE_WEIGHT16; + /* coverity[overflow_sink] */ sec = getFirstSecTerForPrimary(index) >> 16; } U_ASSERT(s >= sec); @@ -157,6 +158,7 @@ CollationRootElements::getTertiaryBefore(uint32_t p, uint32_t s, uint32_t t) con } else { index = findPrimary(p) + 1; previousTer = Collation::BEFORE_WEIGHT16; + /* coverity[overflow_sink] */ secTer = getFirstSecTerForPrimary(index); } uint32_t st = (s << 16) | t; diff --git a/source/i18n/dayperiodrules.cpp b/source/i18n/dayperiodrules.cpp index 294390cce2b..95befe8301c 100644 --- a/source/i18n/dayperiodrules.cpp +++ b/source/i18n/dayperiodrules.cpp @@ -218,6 +218,7 @@ struct DayPeriodRulesDataSink : public ResourceSink { } if (hour == 25) { hour = 0; } if (cutoffs[hour] & (1 << CUTOFF_TYPE_BEFORE)) { + /* coverity[overrun-call] */ rule.add(startHour, hour, period); break; } diff --git a/source/i18n/double-conversion-bignum.cpp b/source/i18n/double-conversion-bignum.cpp index d2b701a21d8..77bab875aab 100644 --- a/source/i18n/double-conversion-bignum.cpp +++ b/source/i18n/double-conversion-bignum.cpp @@ -390,6 +390,7 @@ void Bignum::Square() { // First shift the digits so we don't overwrite them. const int copy_offset = used_bigits_; for (int i = 0; i < used_bigits_; ++i) { + /* coverity[overrun-call] */ RawBigit(copy_offset + i) = RawBigit(i); } // We have two loops to avoid some 'if's in the loop. @@ -415,7 +416,9 @@ void Bignum::Square() { // Invariant: sum of both indices is again equal to i. // Inner loop runs 0 times on last iteration, emptying accumulator. while (bigit_index2 < used_bigits_) { + /* coverity[overrun-call] */ const Chunk chunk1 = RawBigit(copy_offset + bigit_index1); + /* coverity[overrun-call] */ const Chunk chunk2 = RawBigit(copy_offset + bigit_index2); accumulator += static_cast(chunk1) * chunk2; bigit_index1--; diff --git a/source/i18n/measfmt.cpp b/source/i18n/measfmt.cpp index da4e69b49b7..09be56fcf33 100644 --- a/source/i18n/measfmt.cpp +++ b/source/i18n/measfmt.cpp @@ -516,6 +516,7 @@ UnicodeString &MeasureFormat::formatMeasurePerUnit( .formatImpl(&result, status); } DecimalFormat::fieldPositionHelper(result, pos, appendTo.length(), status); + /* coverity[uninit_use_in_call] */ appendTo.append(result.toTempString(status)); return appendTo; } diff --git a/source/i18n/measunit.cpp b/source/i18n/measunit.cpp index abb21997705..bff3e6273af 100644 --- a/source/i18n/measunit.cpp +++ b/source/i18n/measunit.cpp @@ -2230,6 +2230,7 @@ const char *MeasureUnit::getSubtype() const { } const char *MeasureUnit::getIdentifier() const { + /* coverity[negative_returns] */ return fImpl ? fImpl->identifier.data() : gSubTypes[getOffset()]; } @@ -2340,6 +2341,7 @@ void MeasureUnit::initTime(const char *timeId) { int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "duration"); U_ASSERT(result != -1); fTypeId = result; + /* coverity[negative_returns] */ result = binarySearch(gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], timeId); U_ASSERT(result != -1); fSubTypeId = result - gOffsets[fTypeId]; @@ -2349,6 +2351,7 @@ void MeasureUnit::initCurrency(StringPiece isoCurrency) { int32_t result = binarySearch(gTypes, 0, UPRV_LENGTHOF(gTypes), "currency"); U_ASSERT(result != -1); fTypeId = result; + /* coverity[negative_returns] */ result = binarySearch( gSubTypes, gOffsets[fTypeId], gOffsets[fTypeId + 1], isoCurrency); if (result == -1) { diff --git a/source/i18n/number_fluent.cpp b/source/i18n/number_fluent.cpp index 45d6b06c6df..e6fe49f0dca 100644 --- a/source/i18n/number_fluent.cpp +++ b/source/i18n/number_fluent.cpp @@ -466,6 +466,7 @@ LocalizedNumberFormatter::LocalizedNumberFormatter(LocalizedNumberFormatter&& sr LocalizedNumberFormatter::LocalizedNumberFormatter(NFS&& src) noexcept : NFS(std::move(src)) { + // coverity[use_after_move] lnfMoveHelper(std::move(static_cast(src))); } diff --git a/source/i18n/number_padding.cpp b/source/i18n/number_padding.cpp index c320c3ffb6f..3aa996f932f 100644 --- a/source/i18n/number_padding.cpp +++ b/source/i18n/number_padding.cpp @@ -29,6 +29,7 @@ addPaddingHelper(UChar32 paddingCp, int32_t requiredPadding, FormattedStringBuil } Padder::Padder(UChar32 cp, int32_t width, UNumberFormatPadPosition position) : fWidth(width) { + fUnion.errorCode = U_ZERO_ERROR; /* avoid coverity warning: "fUnion uninitialized" */ // TODO(13034): Consider making this a string instead of code point. fUnion.padding.fCp = cp; fUnion.padding.fPosition = position; diff --git a/source/i18n/number_rounding.cpp b/source/i18n/number_rounding.cpp index e6bb509ffd7..d9fe7d74275 100644 --- a/source/i18n/number_rounding.cpp +++ b/source/i18n/number_rounding.cpp @@ -284,6 +284,7 @@ FractionPrecision Precision::constructFraction(int32_t minFrac, int32_t maxFrac) settings.fMinSig = -1; settings.fMaxSig = -1; PrecisionUnion union_; + /* coverity[uninit_use] */ union_.fracSig = settings; return {RND_FRACTION, union_}; } @@ -295,6 +296,7 @@ Precision Precision::constructSignificant(int32_t minSig, int32_t maxSig) { settings.fMinSig = static_cast(minSig); settings.fMaxSig = static_cast(maxSig); PrecisionUnion union_; + /* coverity[uninit_use] */ union_.fracSig = settings; return {RND_SIGNIFICANT, union_}; } diff --git a/source/i18n/number_skeletons.cpp b/source/i18n/number_skeletons.cpp index ef3befbffad..d790db5b92d 100644 --- a/source/i18n/number_skeletons.cpp +++ b/source/i18n/number_skeletons.cpp @@ -545,6 +545,7 @@ MacroProps skeleton::parseSkeleton( segment.resetLength(); if (U_FAILURE(status)) { errOffset = segment.getOffset(); + /* coverity[uninit_use_in_call] */ return macros; } diff --git a/source/i18n/numrange_fluent.cpp b/source/i18n/numrange_fluent.cpp index 0944f3024ff..bdf179170a3 100644 --- a/source/i18n/numrange_fluent.cpp +++ b/source/i18n/numrange_fluent.cpp @@ -239,6 +239,7 @@ LocalizedNumberRangeFormatter::LocalizedNumberRangeFormatter(LocalizedNumberRang LocalizedNumberRangeFormatter::LocalizedNumberRangeFormatter(NFS&& src) noexcept : NFS(std::move(src)) { // Steal the compiled formatter + // coverity[use_after_move] LNF&& _src = static_cast(src); auto* stolen = _src.fAtomicFormatter.exchange(nullptr); delete fAtomicFormatter.exchange(stolen); diff --git a/source/i18n/plurrule.cpp b/source/i18n/plurrule.cpp index 839d14147cc..cc842347875 100644 --- a/source/i18n/plurrule.cpp +++ b/source/i18n/plurrule.cpp @@ -343,6 +343,7 @@ PluralRules::select(const number::impl::UFormattedNumberRangeData* impl, UErrorC return ICU_Utility::makeBogusString(); } auto result = mStandardPluralRanges->resolve(form1, form2); + /* coverity[overrun-call] */ return UnicodeString(StandardPlural::getKeyword(result), -1, US_INV); } diff --git a/source/i18n/rbt_pars.cpp b/source/i18n/rbt_pars.cpp index c59a22faab2..1a49eaf12fb 100644 --- a/source/i18n/rbt_pars.cpp +++ b/source/i18n/rbt_pars.cpp @@ -1059,6 +1059,7 @@ void TransliteratorParser::parseRules(const UnicodeString& rule, setVariableRange(0xF000, 0xF8FF, status); } + /* coverity[overflow_sink] */ if (resemblesPragma(rule, pos, limit)) { int32_t ppp = parsePragma(rule, pos, limit, status); if (ppp < 0) { diff --git a/source/i18n/tzgnames.cpp b/source/i18n/tzgnames.cpp index d55b0fd2ae0..1e14003b22b 100644 --- a/source/i18n/tzgnames.cpp +++ b/source/i18n/tzgnames.cpp @@ -517,6 +517,7 @@ TZGNCore::getGenericLocationName(const UnicodeString& tzCanonicalID) { char16_t tzIDKey[ZID_KEY_MAX + 1]; int32_t tzIDKeyLen = tzCanonicalID.extract(tzIDKey, ZID_KEY_MAX + 1, status); U_ASSERT(status == U_ZERO_ERROR); // already checked length above + /* coverity[negative_returns] */ tzIDKey[tzIDKeyLen] = 0; const char16_t *locname = (const char16_t *)uhash_get(fLocationNamesMap, tzIDKey); diff --git a/source/i18n/vtzone.cpp b/source/i18n/vtzone.cpp index 25af556aa22..7b557f1dab8 100644 --- a/source/i18n/vtzone.cpp +++ b/source/i18n/vtzone.cpp @@ -119,7 +119,7 @@ static UnicodeString& appendAsciiDigits(int32_t number, uint8_t length, UnicodeS number *= -1; } - length = length > 10 ? 10 : length; + length = (uint8_t)((length > 10) ? 10 : length); if (length == 0) { // variable length i = 0; diff --git a/source/tools/gencnval/gencnval.c b/source/tools/gencnval/gencnval.c index 54b41fb57da..129cf1fc451 100644 --- a/source/tools/gencnval/gencnval.c +++ b/source/tools/gencnval/gencnval.c @@ -273,6 +273,11 @@ main(int argc, char* argv[]) { const char* sourcedir = options[SOURCEDIR].value; if (sourcedir != NULL && *sourcedir != 0) { + if (strlen(sourcedir) + strlen(path) + 1 >= 512) { + fprintf(stderr, + "Length of sourcedir + path is too long, must be <= 510.\n"); + exit(U_ILLEGAL_ARGUMENT_ERROR); + } char *end; uprv_strcpy(pathBuf, sourcedir); end = uprv_strchr(pathBuf, 0); diff --git a/source/tools/genrb/wrtxml.cpp b/source/tools/genrb/wrtxml.cpp index 16f67fabcaf..cd0bb19bff7 100644 --- a/source/tools/genrb/wrtxml.cpp +++ b/source/tools/genrb/wrtxml.cpp @@ -187,7 +187,7 @@ static void strnrepchr(char* src, int32_t srcLen, char s, char r){ */ static char* parseFilename(const char* id, char* /*lang*/) { int idLen = (int) uprv_strlen(id); - char* localeID = (char*) uprv_malloc(idLen); + char* localeID = (char*) uprv_malloc(idLen+1); int pos = 0; int canonCapacity = 0; char* canon = nullptr; diff --git a/source/tools/makeconv/makeconv.cpp b/source/tools/makeconv/makeconv.cpp index b14b4316f3b..e47033f7c59 100644 --- a/source/tools/makeconv/makeconv.cpp +++ b/source/tools/makeconv/makeconv.cpp @@ -377,6 +377,10 @@ int main(int argc, char* argv[]) data.staticData.name); } + if (strlen(cnvName) + 1 > UPRV_LENGTHOF(data.staticData.name)) { + fprintf(stderr, "converter name %s too long\n", cnvName); + return U_BUFFER_OVERFLOW_ERROR; + } uprv_strcpy((char*)data.staticData.name, cnvName); if(!uprv_isInvariantString((char*)data.staticData.name, -1)) { diff --git a/source/tools/toolutil/package.cpp b/source/tools/toolutil/package.cpp index 3098f5d57d4..3bd28e48ac1 100644 --- a/source/tools/toolutil/package.cpp +++ b/source/tools/toolutil/package.cpp @@ -865,6 +865,7 @@ Package::writePackage(const char *filename, char outType, const char *comment) { // write the items for(pItem=items, i=0; itype); + /* coverity[negative_returns] */ if(ds[type]!=nullptr) { // swap each item from its platform properties to the desired ones udata_swap( diff --git a/source/tools/toolutil/ucbuf.cpp b/source/tools/toolutil/ucbuf.cpp index 1eb54e260e6..1999433b003 100644 --- a/source/tools/toolutil/ucbuf.cpp +++ b/source/tools/toolutil/ucbuf.cpp @@ -257,7 +257,7 @@ ucbuf_fillucbuf( UCHARBUF* buf,UErrorCode* error){ /* for post-context */ start = pos+len; - stop = (int32_t)(((pos+CONTEXT_LEN)<= (sourceLimit-cbuf) )? (pos+(CONTEXT_LEN-1)) : (sourceLimit-cbuf)); + stop = (int32_t)(((pos+CONTEXT_LEN)<= (int32_t)(sourceLimit-cbuf) )? (pos+(CONTEXT_LEN-1)) : (int32_t)(sourceLimit-cbuf)); memcpy(postContext,source,stop-start); /* null terminate the buffer */ -- 2.46.2