[PATCH v2] string: Suppress -Wmaybe-unitialized for wordcopy [BZ #19444]
Carlos O'Donell
carlos@redhat.com
Wed Jan 11 22:34:40 GMT 2023
On 1/11/23 16:27, Adhemerval Zanella wrote:
> When compiling with GCC 6+ the sparc build warns that some variables
> might be used uninitialized. However it does not seem the fact, since
> the variables are really initialized (and also other targets that use the
> same code, like powerpc, do not warn about it).
>
> So suppress the warning for now.
LGTM.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
>
> Changes from v1:
> * Update patch description and the explanation for the suppresion.
>
> ---
> string/wordcopy.c | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/string/wordcopy.c b/string/wordcopy.c
> index ae5ccd793c..a8a40c9f01 100644
> --- a/string/wordcopy.c
> +++ b/string/wordcopy.c
> @@ -19,7 +19,19 @@
> /* BE VERY CAREFUL IF YOU CHANGE THIS CODE...! */
>
> #include <stddef.h>
> +#include <libc-diag.h>
> +/* Compiling with -O1 might warn that 'a2' and 'a3' may be used
> + uninitialized. There are only two ways to arrive at labels 'do4', 'do3'
> + or 'do1', all of which use 'a2' or 'a3' in the MERGE macro: either from
> + the earlier switch case statement or via a loop iteration. In all cases
> + the switch statement or previous loop sets both 'a2' and 'a3'.
> +
> + Since the usage is within the MERGE macro we disable the
> + warning in the definition, but only in this file. */
> +DIAG_PUSH_NEEDS_COMMENT;
> +DIAG_IGNORE_NEEDS_COMMENT (6, "-Wmaybe-uninitialized");
> #include <memcopy.h>
> +DIAG_POP_NEEDS_COMMENT;
OK.
>
> /* _wordcopy_fwd_aligned -- Copy block beginning at SRCP to
> block beginning at DSTP with LEN `op_t' words (not LEN bytes!).
> @@ -94,7 +106,15 @@ WORDCOPY_FWD_ALIGNED (long int dstp, long int srcp, size_t len)
> {
> do8:
> a0 = ((op_t *) srcp)[0];
> + /* Compiling with -O1 may warn that 'a1' may be used uninitialized.
> + There are only two ways to arrive at label 'do8' and they are via a
> + do-while loop iteration or directly via the earlier switch 'case 1:'
> + case. The switch case always sets 'a1' and all previous loop
> + iterations will also have set 'a1' before the use. */
> + DIAG_PUSH_NEEDS_COMMENT;
> + DIAG_IGNORE_NEEDS_COMMENT (6, "-Wmaybe-uninitialized");
> ((op_t *) dstp)[0] = a1;
> + DIAG_POP_NEEDS_COMMENT;
> do7:
> a1 = ((op_t *) srcp)[1];
> ((op_t *) dstp)[1] = a0;
> @@ -291,7 +311,11 @@ WORDCOPY_BWD_ALIGNED (long int dstp, long int srcp, size_t len)
> {
> do8:
> a0 = ((op_t *) srcp)[7];
> + /* Check the comment on WORDCOPY_FWD_ALIGNED. */
> + DIAG_PUSH_NEEDS_COMMENT;
> + DIAG_IGNORE_NEEDS_COMMENT (6, "-Wmaybe-uninitialized");
> ((op_t *) dstp)[7] = a1;
> + DIAG_POP_NEEDS_COMMENT;
> do7:
> a1 = ((op_t *) srcp)[6];
> ((op_t *) dstp)[6] = a0;
--
Cheers,
Carlos.
More information about the Libc-alpha
mailing list