For completeness, patch 4 are the (already preapproved) fixups to GCC to let it compile with the -Wstringop-truncation option. I will commit this patch shortly.
Martin
PR c/81117 - Improve buffer overflow checking in strncpy gcc/ada/ChangeLog: PR c/81117 * adadecode.c (__gnat_decode): Replace pointless strncpy with memcpy. * argv.c (__gnat_fill_arg): Same. gcc/c-family/ChangeLog: PR c/81117 * c-common.c (resort_sorted_fields): Replace pointless strncpy with memcpy. gcc/fortran/ChangeLog: PR c/81117 * decl.c (build_sym): Replace pointless strncpy with strcpy. gcc/objc/ChangeLog: PR c/81117 * objc-encoding.c (encode_type): Replace pointless strncpy with memcpy. diff --git a/gcc/ada/adadecode.c b/gcc/ada/adadecode.c index 8c9c7ab..0cbef81 100644 --- a/gcc/ada/adadecode.c +++ b/gcc/ada/adadecode.c @@ -330,7 +330,7 @@ __gnat_decode (const char *coded_name, char *ada_name, int verbose) } /* Write symbol in the space. */ - strncpy (optoken, trans_table[k][1], oplen); + memcpy (optoken, trans_table[k][1], oplen); } else k++; diff --git a/gcc/ada/argv.c b/gcc/ada/argv.c index 430404e..aee0f88 100644 --- a/gcc/ada/argv.c +++ b/gcc/ada/argv.c @@ -92,7 +92,7 @@ void __gnat_fill_arg (char *a, int i) { if (gnat_argv != NULL) - strncpy (a, gnat_argv[i], strlen(gnat_argv[i])); + memcpy (a, gnat_argv[i], strlen (gnat_argv[i])); } int @@ -118,7 +118,7 @@ void __gnat_fill_env (char *a, int i) { if (gnat_envp != NULL) - strncpy (a, gnat_envp[i], strlen (gnat_envp[i])); + memcpy (a, gnat_envp[i], strlen (gnat_envp[i])); } #ifdef __cplusplus diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index feb0904..8c18caf 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -5942,10 +5942,10 @@ resort_sorted_fields (void *obj, static char * catenate_strings (const char *lhs, const char *rhs_start, int rhs_size) { - const int lhs_size = strlen (lhs); + const size_t lhs_size = strlen (lhs); char *result = XNEWVEC (char, lhs_size + rhs_size); - strncpy (result, lhs, lhs_size); - strncpy (result + lhs_size, rhs_start, rhs_size); + memcpy (result, lhs, lhs_size); + memcpy (result + lhs_size, rhs_start, rhs_size); return result; } diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 54ee5d3..82971e8 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1417,11 +1417,9 @@ build_sym (const char *name, gfc_charlen *cl, bool cl_deferred, { char u_name[GFC_MAX_SYMBOL_LEN + 1]; gfc_symtree *st; - int nlen; - nlen = strlen(name); - gcc_assert (nlen <= GFC_MAX_SYMBOL_LEN); - strncpy (u_name, name, nlen + 1); + gcc_assert (strlen(name) <= GFC_MAX_SYMBOL_LEN); + strcpy (u_name, name); u_name[0] = upper; st = gfc_find_symtree (gfc_current_ns->sym_root, u_name); diff --git a/gcc/objc/objc-encoding.c b/gcc/objc/objc-encoding.c index 2a2dfa5..e5d4f38 100644 --- a/gcc/objc/objc-encoding.c +++ b/gcc/objc/objc-encoding.c @@ -734,7 +734,7 @@ encode_type (tree type, int curtype, int format) /* Rewrite "in const" from "nr" to "rn". */ if (curtype >= 1 && !strncmp (enc - 1, "nr", 2)) - strncpy (enc - 1, "rn", 2); + memcpy (enc - 1, "rn", 2); } } }