grep-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/6] grep: avoid some size_t casts


From: Paul Eggert
Subject: [PATCH 1/6] grep: avoid some size_t casts
Date: Tue, 24 Aug 2021 00:45:36 -0700

This helps move the code away from unsigned types.
* src/grep.c (buf_has_encoding_errors, contains_encoding_error):
* src/searchutils.c (mb_goback):
Compare to MB_LEN_MAX, not to (size_t) -2.  This is a bit safer
anyway, as grep relies on MB_LEN_MAX limits elsewhere.
* src/search.h (mb_clen): Compare to -2 before converting to size_t.
---
 src/grep.c        | 8 ++++----
 src/search.h      | 4 ++--
 src/searchutils.c | 8 ++++----
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/src/grep.c b/src/grep.c
index 271b6b9..ed102d3 100644
--- a/src/grep.c
+++ b/src/grep.c
@@ -760,7 +760,7 @@ buf_has_encoding_errors (char *buf, size_t size)
   for (char const *p = buf; (p = skip_easy_bytes (p)) < buf + size; p += clen)
     {
       clen = mbrlen (p, buf + size - p, &mbs);
-      if ((size_t) -2 <= clen)
+      if (MB_LEN_MAX < clen)
         return true;
     }
 
@@ -2226,12 +2226,12 @@ static bool
 contains_encoding_error (char const *pat, size_t patlen)
 {
   mbstate_t mbs = { 0 };
-  size_t i, charlen;
+  size_t charlen;
 
-  for (i = 0; i < patlen; i += charlen)
+  for (size_t i = 0; i < patlen; i += charlen)
     {
       charlen = mb_clen (pat + i, patlen - i, &mbs);
-      if ((size_t) -2 <= charlen)
+      if (MB_LEN_MAX < charlen)
         return true;
     }
   return false;
diff --git a/src/search.h b/src/search.h
index 4853583..6a5814a 100644
--- a/src/search.h
+++ b/src/search.h
@@ -78,8 +78,8 @@ extern void fgrep_to_grep_pattern (char **, size_t *);
 SEARCH_INLINE size_t
 mb_clen (char const *s, size_t n, mbstate_t *mbs)
 {
-  size_t len = localeinfo.sbclen[to_uchar (*s)];
-  return len == (size_t) -2 ? mbrlen (s, n, mbs) : len;
+  signed char len = localeinfo.sbclen[to_uchar (*s)];
+  return len == -2 ? mbrlen (s, n, mbs) : len;
 }
 
 extern char const *input_filename (void);
diff --git a/src/searchutils.c b/src/searchutils.c
index 8058511..b63990a 100644
--- a/src/searchutils.c
+++ b/src/searchutils.c
@@ -68,8 +68,8 @@ kwsinit (bool mb_trans)
 
    When returning zero, set *MB_START to CUR.  When returning a
    positive value, set *MB_START to the next boundary after CUR,
-   or to END if there is no such boundary, and set *MBCLEN to the
-   length of the preceding character.  */
+   or to END if there is no such boundary, and if MBCLEN is nonnull
+   set *MBCLEN to the length of the preceding character.  */
 ptrdiff_t
 mb_goback (char const **mb_start, size_t *mbclen, char const *cur,
            char const *end)
@@ -92,7 +92,7 @@ mb_goback (char const **mb_start, size_t *mbclen, char const 
*cur,
             {
               mbstate_t mbs = { 0 };
               clen = mb_clen (cur - i, end - (cur - i), &mbs);
-              if (i < clen && clen < (size_t) -2)
+              if (i < clen && clen <= MB_LEN_MAX)
                 {
                   p0 = cur - i;
                   p = p0 + clen;
@@ -107,7 +107,7 @@ mb_goback (char const **mb_start, size_t *mbclen, char 
const *cur,
         {
           clen = mb_clen (p, end - p, &mbs);
 
-          if ((size_t) -2 <= clen)
+          if (MB_LEN_MAX < clen)
             {
               /* An invalid sequence, or a truncated multibyte character.
                  Treat it as a single byte character.  */
-- 
2.31.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]