From: Paul Eggert Date: Tue, 31 May 2022 08:19:31 +0000 (-0700) Subject: Pacify GCC 12 -Wanalyzer-use-of-uninitialized-value X-Git-Tag: emacs-29.0.90~1910^2~319^2~10 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a1c19dfca4b1e0b84a958aee33c8212dc69cd2cb;p=emacs.git Pacify GCC 12 -Wanalyzer-use-of-uninitialized-value * lib-src/etags.c (readline_internal): Do not copy a pointer to freed storage, as that has undefined behavior even if the pointer is not dereferenced. (relative_filename): Avoid a backward scan by remembering where the last slash was. This is a bit faster, and pacifies a GCC false alarm. --- diff --git a/lib-src/etags.c b/lib-src/etags.c index ea99ed9f396..f76dda7936b 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -7248,8 +7248,8 @@ readline_internal (linebuffer *lbp, FILE *stream, char const *filename) { /* We're at the end of linebuffer: expand it. */ xrnew (buffer, lbp->size, 2); + p = buffer + lbp->size; lbp->size *= 2; - p += buffer - lbp->buffer; pend = buffer + lbp->size; lbp->buffer = buffer; } @@ -7670,21 +7670,21 @@ relative_filename (char *file, char *dir) { char *fp, *dp, *afn, *res; ptrdiff_t i; + char *dir_last_slash UNINIT; /* Find the common root of file and dir (with a trailing slash). */ afn = absolute_filename (file, cwd); fp = afn; dp = dir; while (*fp++ == *dp++) - continue; - fp--, dp--; /* back to the first differing char */ + if (dp[-1] == '/') + dir_last_slash = dp - 1; #ifdef DOS_NT - if (fp == afn && afn[0] != '/') /* cannot build a relative name */ - return afn; + if (fp - 1 == afn && afn[0] != '/') + return afn; /* Cannot build a relative name. */ #endif - do /* look at the equal chars until '/' */ - fp--, dp--; - while (*fp != '/'); + fp -= dp - dir_last_slash; + dp = dir_last_slash; /* Build a sequence of "../" strings for the resulting relative file name. */ i = 0;