]> git.eshelyaron.com Git - emacs.git/commitdiff
Pacify GCC 12 -Wanalyzer-use-of-uninitialized-value
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 31 May 2022 08:19:31 +0000 (01:19 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Tue, 31 May 2022 08:26:47 +0000 (01:26 -0700)
* 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.

lib-src/etags.c

index ea99ed9f3967a2e4daf3017b1d476f4f804709f2..f76dda7936ba9d771ef1e60cb66ea59e209f55d7 100644 (file)
@@ -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;