A few not incorrect but not strictly intended (according to
the function's original purpose) uses of strncpy trigger the
new -Wstringop-truncation warning because they temporarily
leave the copied string without a terminating nul.

The attached patch replaces these uses with memcpy to avoid
the warning and make it clear (to both the reader and GCC)
that the string being constructed is, in fact, not nul
terminated until the last call to strcpy.

Tested by cross-compiling for x86_64-darwin.  For reference,
with the attached patch applied the following is the list of
outstanding warnings in the build.

Diagnostic                        Count   Unique    Files
-Wsign-compare                        4        3        3
-Wimplicit-fallthrough=               4        1        1

-Wimplicit-fallthrough Instances:
  gengtype-lex.c:380

-Wsign-compare Instances:
  arlex.c:1352
  gengtype-lex.c:1367
  syslex.c:1226

Martin
gcc/ChangeLog:

	PR c/81117
	* config/darwin-c.c (framework_construct_pathname): Replace strncpy
	with memcpy.
	(find_subframework_file): Same.

diff --git a/gcc/config/darwin-c.c b/gcc/config/darwin-c.c
index 91f08a0..bfb35b9 100644
--- a/gcc/config/darwin-c.c
+++ b/gcc/config/darwin-c.c
@@ -284,13 +284,13 @@ framework_construct_pathname (const char *fname, cpp_dir *dir)
 
   frname = XNEWVEC (char, strlen (fname) + dir->len + 2
 		    + strlen(".framework/") + strlen("PrivateHeaders"));
-  strncpy (&frname[0], dir->name, dir->len);
+  memcpy (&frname[0], dir->name, dir->len);
   frname_len = dir->len;
   if (frname_len && frname[frname_len-1] != '/')
     frname[frname_len++] = '/';
-  strncpy (&frname[frname_len], fname, fname_len);
+  memcpy (&frname[frname_len], fname, fname_len);
   frname_len += fname_len;
-  strncpy (&frname[frname_len], ".framework/", strlen (".framework/"));
+  memcpy (&frname[frname_len], ".framework/", strlen (".framework/"));
   frname_len += strlen (".framework/");
 
   if (fast_dir == 0)
@@ -316,7 +316,7 @@ framework_construct_pathname (const char *fname, cpp_dir *dir)
   /* Append framework_header_dirs and header file name */
   for (i = 0; framework_header_dirs[i].dirName; i++)
     {
-      strncpy (&frname[frname_len],
+      memcpy (&frname[frname_len],
 	       framework_header_dirs[i].dirName,
 	       framework_header_dirs[i].dirNameLen);
       strcpy (&frname[frname_len + framework_header_dirs[i].dirNameLen],
@@ -378,23 +378,23 @@ find_subframework_file (const char *fname, const char *pname)
 
   sfrname_len = bufptr - pname;
 
-  strncpy (&sfrname[0], pname, sfrname_len);
+  memcpy (&sfrname[0], pname, sfrname_len);
 
-  strncpy (&sfrname[sfrname_len], "Frameworks/", strlen ("Frameworks/"));
+  memcpy (&sfrname[sfrname_len], "Frameworks/", strlen ("Frameworks/"));
   sfrname_len += strlen("Frameworks/");
 
-  strncpy (&sfrname[sfrname_len], fname, fname_len);
+  memcpy (&sfrname[sfrname_len], fname, fname_len);
   sfrname_len += fname_len;
 
-  strncpy (&sfrname[sfrname_len], ".framework/", strlen (".framework/"));
+  memcpy (&sfrname[sfrname_len], ".framework/", strlen (".framework/"));
   sfrname_len += strlen (".framework/");
 
   /* Append framework_header_dirs and header file name */
   for (i = 0; framework_header_dirs[i].dirName; i++)
     {
-      strncpy (&sfrname[sfrname_len],
-	       framework_header_dirs[i].dirName,
-	       framework_header_dirs[i].dirNameLen);
+      memcpy (&sfrname[sfrname_len],
+	      framework_header_dirs[i].dirName,
+	      framework_header_dirs[i].dirNameLen);
       strcpy (&sfrname[sfrname_len + framework_header_dirs[i].dirNameLen],
 	      &fname[fname_len]);
 

Reply via email to