]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/cintltst/usrchtst.c
ICU-66108.tar.gz
[apple/icu.git] / icuSources / test / cintltst / usrchtst.c
index c765f5849fd9b8251ccd95121468cf13597498a7..5459d9e9faac55109aba11230046e28e4d1b4896 100644 (file)
@@ -362,7 +362,7 @@ static UBool assertEqualWithUStringSearch(      UStringSearch *strsrch,
         matchlength = search.size[count];
         usearch_next(strsrch, &status);
         if (matchindex != usearch_getMatchedStart(strsrch) || 
-            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+            matchlength != usearch_getMatchedLength(strsrch)) {
             char *str = toCharString(usearch_getText(strsrch, &textlength));
             log_err("Text: %s\n", str);
             str = toCharString(usearch_getPattern(strsrch, &textlength));
@@ -375,7 +375,7 @@ static UBool assertEqualWithUStringSearch(      UStringSearch *strsrch,
         count ++;
         
         if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
-            (int32_t) matchlength || U_FAILURE(status) ||
+             matchlength || U_FAILURE(status) ||
             memcmp(matchtext, 
                    usearch_getText(strsrch, &textlength) + matchindex,
                    matchlength * sizeof(UChar)) != 0) {
@@ -404,7 +404,7 @@ static UBool assertEqualWithUStringSearch(      UStringSearch *strsrch,
         matchlength = search.size[count];
         usearch_previous(strsrch, &status);
         if (matchindex != usearch_getMatchedStart(strsrch) || 
-            matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+            matchlength != usearch_getMatchedLength(strsrch)) {
             char *str = toCharString(usearch_getText(strsrch, &textlength));
             log_err("Text: %s\n", str);
             str = toCharString(usearch_getPattern(strsrch, &textlength));
@@ -416,7 +416,7 @@ static UBool assertEqualWithUStringSearch(      UStringSearch *strsrch,
         }
         
         if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
-            (int32_t) matchlength || U_FAILURE(status) ||
+             matchlength || U_FAILURE(status) ||
             memcmp(matchtext, 
                    usearch_getText(strsrch, &textlength) + matchindex,
                    matchlength * sizeof(UChar)) != 0) {
@@ -1255,10 +1255,10 @@ static void TestGetSetOffset(void)
         ucol_setStrength(usearch_getCollator(strsrch), search.strength);
         usearch_reset(strsrch);
         while (U_SUCCESS(status) && matchindex >= 0) {
-            uint32_t matchlength = search.size[count];
+            int32_t matchlength = search.size[count];
             usearch_next(strsrch, &status);
             if (matchindex != usearch_getMatchedStart(strsrch) || 
-                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+                matchlength != usearch_getMatchedLength(strsrch)) {
                 char *str = toCharString(usearch_getText(strsrch, 
                                                          &textlength));
                 log_err("Text: %s\n", str);
@@ -1272,7 +1272,7 @@ static void TestGetSetOffset(void)
             usearch_setOffset(strsrch, matchindex + matchlength, &status);
             usearch_previous(strsrch, &status);
             if (matchindex != usearch_getMatchedStart(strsrch) || 
-                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+                matchlength != usearch_getMatchedLength(strsrch)) {
                 char *str = toCharString(usearch_getText(strsrch, 
                                                          &textlength));
                 log_err("Text: %s\n", str);
@@ -1459,23 +1459,23 @@ static void TestGetMatch(void)
         }
         status = U_ZERO_ERROR;
         if (usearch_getMatchedText(strsrch, NULL, 0, &status) != 
-            (int32_t)matchlength || U_SUCCESS(status)){
+            matchlength || U_SUCCESS(status)){
             log_err("Error pre-flighting match length\n");
         }
         status = U_ZERO_ERROR;
         if (usearch_getMatchedText(strsrch, matchtext, 0, &status) != 
-            (int32_t)matchlength || U_SUCCESS(status)){
+            matchlength || U_SUCCESS(status)){
             log_err("Error getting match text with buffer size 0\n");
         }
         status = U_ZERO_ERROR;
         if (usearch_getMatchedText(strsrch, matchtext, matchlength, &status) 
-            != (int32_t)matchlength || matchtext[matchlength - 1] == 0 ||
+            != matchlength || matchtext[matchlength - 1] == 0 ||
             U_FAILURE(status)){
             log_err("Error getting match text with exact size\n");
         }
         status = U_ZERO_ERROR;
         if (usearch_getMatchedText(strsrch, matchtext, 128, &status) !=
-            (int32_t) matchlength || U_FAILURE(status) ||
+            matchlength || U_FAILURE(status) ||
             memcmp(matchtext, 
                    usearch_getText(strsrch, &textlength) + matchindex,
                    matchlength * sizeof(UChar)) != 0 ||
@@ -2313,10 +2313,10 @@ static void TestGetSetOffsetCanonical(void)
         usearch_setText(strsrch, text, -1, &status);
         usearch_setPattern(strsrch, pattern, -1, &status);
         while (U_SUCCESS(status) && matchindex >= 0) {
-            uint32_t matchlength = search.size[count];
+            int32_t matchlength = search.size[count];
             usearch_next(strsrch, &status);
             if (matchindex != usearch_getMatchedStart(strsrch) || 
-                matchlength != (uint32_t)usearch_getMatchedLength(strsrch)) {
+                matchlength != usearch_getMatchedLength(strsrch)) {
                 char *str = toCharString(usearch_getText(strsrch, 
                                                          &textlength));
                 log_err("Text: %s\n", str);
@@ -2506,9 +2506,11 @@ exitTestForwardBackward :
     }
 }
 
-#define TEST_ASSERT(x) \
-   {if (U_FAILURE(x)) {log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__);\
-   }}
+#define TEST_ASSERT(x) UPRV_BLOCK_MACRO_BEGIN { \
+    if (U_FAILURE(x)) { \
+        log_err_status(x, "%s:%d: FAIL: test assertion failure \n", __FILE__, __LINE__); \
+    } \
+} UPRV_BLOCK_MACRO_END
 
 static void TestSearchForNull(void) {
     UCollator *coll;
@@ -3038,6 +3040,43 @@ exit:
    return;
 }
 
+static void TestUInt16Overflow(void) {
+    const int32_t uint16_overflow = UINT16_MAX + 1;
+    UChar* pattern = (UChar*)uprv_malloc(uint16_overflow * sizeof(UChar));
+    if (pattern == NULL)
+    {
+        log_err("Err: uprv_malloc returned NULL\n");
+        return;
+    }
+    u_memset(pattern, 'A', uint16_overflow);
+    UChar text[] = { 'B' };
+
+    UErrorCode errorCode = U_ZERO_ERROR;
+    UStringSearch* usearch = usearch_open(pattern, uint16_overflow, text, 1, "en-US", NULL, &errorCode);
+
+    if (U_SUCCESS(errorCode))
+    {
+        int32_t match = usearch_first(usearch, &errorCode);
+
+        if (U_SUCCESS(errorCode))
+        {
+            if (match != USEARCH_DONE)
+            {
+                log_err("Err: match was not expected, got %d\n", match);
+            }
+        }
+        else
+        {
+            log_err("usearch_first error %s\n", u_errorName(errorCode));
+        }
+        usearch_close(usearch);
+    }
+    else
+    {
+        log_err("usearch_open error %s\n", u_errorName(errorCode));
+    }
+    uprv_free(pattern);
+}
 
 static void TestPCEBuffer_100df(void) {
   UChar search[] =
@@ -3214,6 +3253,7 @@ void addSearchTest(TestNode** root)
     addTest(root, &TestPCEBuffer_2surr, "tscoll/usrchtst/TestPCEBuffer/2_dfff");
     addTest(root, &TestMatchFollowedByIgnorables, "tscoll/usrchtst/TestMatchFollowedByIgnorables");
     addTest(root, &TestIndicPrefixMatch, "tscoll/usrchtst/TestIndicPrefixMatch");
+    addTest(root, &TestUInt16Overflow, "tscoll/usrchtst/TestUInt16Overflow");
 }
 
 #endif /* #if !UCONFIG_NO_COLLATION */