On Tue, Aug 19, 2025 at 12:56:48PM +0100, Peter Maydell wrote:
> Newer versions of Perl (5.41.x and up) emit a warning for code in
> kernel-doc:
>  Possible precedence problem between ! and pattern match (m//) at 
> /scripts/kernel-doc line 1597.
> 
> This is because the code does:
>             if (!$param =~ /\w\.\.\.$/) {
> 
> In Perl, the !  operator has higher precedence than the =~
> pattern-match binding, so the effect of this condition is to first
> logically-negate the string $param into a true-or-false value and
> then try to pattern match it against the regex, which in this case
> will always fail.  This is almost certainly not what the author
> intended.
> 
> In the new Python version of kernel-doc in the Linux kernel,
> the equivalent code is written:
> 
>             if KernRe(r'\w\.\.\.$').search(param):
>                 # For named variable parameters of the form `x...`,
>                 # remove the dots
>                 param = param[:-3]
>             else:
>                 # Handles unnamed variable parameters
>                 param = "..."
> 
> which is a more sensible way of writing the behaviour you would
> get if you put in brackets to make the regex match first and
> then negate the result.
> 
> Take this as the intended behaviour, and update the Perl to match.
> 
> For QEMU, this produces no change in output, presumably because we
> never used the "unnamed variable parameters" syntax.
> 
> Cc: qemu-sta...@nongnu.org
> Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
> ---
> This obviously will clash with the "import the python script"
> patchseries, but I figured it was worth providing the minimal
> fix for the benefit of stable backports.
> 
> The kernel's copy of kernel-doc.pl still has this bug.
> ---
>  scripts/kernel-doc | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/scripts/kernel-doc b/scripts/kernel-doc
> index fec83f53eda..117ec8fcd1f 100755
> --- a/scripts/kernel-doc
> +++ b/scripts/kernel-doc
> @@ -1594,13 +1594,12 @@ sub push_parameter($$$$$) {
>  
>       if ($type eq "" && $param =~ /\.\.\.$/)
>       {
> -         if (!$param =~ /\w\.\.\.$/) {

I think it would be possible to change this only line to
collapse the ! and =~ into the !~ operator:

    if ($param !~ /\w\.\.\.$/) {


> -           # handles unnamed variable parameters
> -           $param = "...";
> -         }
> -         elsif ($param =~ /\w\.\.\.$/) {
> +         if ($param =~ /\w\.\.\.$/) {
>             # for named variable parameters of the form `x...`, remove the 
> dots
>             $param =~ s/\.\.\.$//;
> +         } else {
> +           # handles unnamed variable parameters
> +           $param = "...";
>           }
>           if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq 
> "") {
>               $parameterdescs{$param} = "variable arguments";
> -- 
> 2.43.0
> 
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Reply via email to