On Sat, 5 Oct 2024 12:07:00 +0530 Brahmajit Das <brahmajit.xyz@xxxxxxxxx> wrote: > show show_smap_vma_flags() has been using misspelled initializer in > mnemonics[] - it needed to initialize 2 element array of char and it > used NUL-padded 2 character string literals (i.e. 3-element > initializer). > > This has been spotted by gcc-15[*]; prior to that gcc quietly dropped > the 3rd eleemnt of initializers. To fix this we are increasing the size > of mnemonics[] (from mnemonics[BITS_PER_LONG][2] to > mnemonics[BITS_PER_LONG][3]) to accomodate the NUL-padded string > literals. > > This also helps us in simplyfying the logic for printing of the flags as > instead of printing each character from the mnemonics[], we can just > print the mnemonics[] using seq_printf. > > [*]: fs/proc/task_mmu.c:917:49: error: initializer-string for array of ‘char’ is too long [-Werror=unterminate d-string-initialization] > 917 | [0 ... (BITS_PER_LONG-1)] = "??", > | ^~~~ > fs/proc/task_mmu.c:917:49: error: initializer-string for array of ‘char’ is too long [-Werror=unterminate d-string-initialization] > fs/proc/task_mmu.c:917:49: error: initializer-string for array of ‘char’ is too long [-Werror=unterminate d-string-initialization] > fs/proc/task_mmu.c:917:49: error: initializer-string for array of ‘char’ is too long [-Werror=unterminate d-string-initialization] > fs/proc/task_mmu.c:917:49: error: initializer-string for array of ‘char’ is too long [-Werror=unterminate d-string-initialization] > fs/proc/task_mmu.c:917:49: error: initializer-string for array of ‘char’ is too long [-Werror=unterminate d-string-initialization] > Cc: david@xxxxxxxxxx, gorcunov@xxxxxxxxxx, linux-next@xxxxxxxxxxxxxxx, sfr@xxxxxxxxxxxxxxxx It is strange to cc only linux-next. It isn't really a development mailing list. Please include an appropriate development list and/or linux-kernel on patches. > --- a/fs/proc/task_mmu.c > +++ b/fs/proc/task_mmu.c > @@ -909,8 +909,15 @@ static void show_smap_vma_flags(struct seq_file *m, struct vm_area_struct *vma) > { > /* > * Don't forget to update Documentation/ on changes. > + * > + * The length of the second argument of mnemonics[] > + * needs to be 3 instead of previously set 2 > + * (i.e. from [BITS_PER_LONG][2] to [BITS_PER_LONG][3]) > + * to avoid spurious > + * -Werror=unterminated-string-initialization warning > + * with GCC 15 > */ > - static const char mnemonics[BITS_PER_LONG][2] = { > + static const char mnemonics[BITS_PER_LONG][3] = { > /* > * In case if we meet a flag we don't know about. > */ > @@ -987,11 +994,8 @@ static void show_smap_vma_flags(struct seq_file *m, struct vm_area_struct *vma) > for (i = 0; i < BITS_PER_LONG; i++) { > if (!mnemonics[i][0]) > continue; > - if (vma->vm_flags & (1UL << i)) { > - seq_putc(m, mnemonics[i][0]); > - seq_putc(m, mnemonics[i][1]); > - seq_putc(m, ' '); > - } > + if (vma->vm_flags & (1UL << i)) > + seq_printf(m, "%s ", mnemonics[i]); > } > seq_putc(m, '\n'); > } Patch looks good. I'll add this to the changelog: Stephen pointed out: : The C standard explicitly allows for a string initializer to be too long : due to the NUL byte at the end ... so this warning may be overzealous. but let's make the warning go away anwyay.