public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Charalampos Mitrodimas <charmitro@posteo.net>
To: Alban Kurti <kurti@invicto.ai>
Cc: "Andy Whitcroft" <apw@canonical.com>,
	"Joe Perches" <joe@perches.com>,
	"Dwaipayan Ray" <dwaipayanray1@gmail.com>,
	"Lukas Bulwahn" <lukas.bulwahn@gmail.com>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v4] checkpatch: add warning for pr_* and dev_* macros without a trailing newline
Date: Fri, 07 Feb 2025 19:53:31 +0000	[thread overview]
Message-ID: <m2wme1pm4k.fsf@posteo.net> (raw)
In-Reply-To: <20250207-checkpatch-newline2-v4-1-26d8e80d0059@invicto.ai> (Alban Kurti's message of "Fri, 07 Feb 2025 18:39:06 +0000 (UTC)")

Alban Kurti <kurti@invicto.ai> writes:

> Add a new check in scripts/checkpatch.pl to detect usage of pr_(level)
> and dev_(level) macros (for both C and Rust) when the string literal
> does not end with '\n'. Missing trailing newlines can lead to incomplete
> log lines that do not appear properly in dmesg or in console output.
> To show an example of this working after applying the patch we can run
> the script on the commit that likely motivated this need/issue:
>   ./scripts/checkpatch.pl --strict -g "f431c5c581fa1"
>
> Also, the patch is able to handle correctly if there is a printing call
> without a newline which then has a newline printed via pr_cont for
> both Rust and C alike. If there is no newline printed and the patch
> ends or there is another pr_* call before a newline with pr_cont is
> printed it will show a warning. Not implemented for dev_cont because it
> is not clear to me if that is used at all.
>
> One false warning that will be generated due to this change is in case
> we have a patch that modifies a `pr_* call without a newline` which has a
> pr_cont with a newline following it. In this case there will be a
> warning but because the patch does not include the following pr_cont it
> will warn there is nothing creating a newline. I have modified the
> warning to be softer due to this known problem.
>
> I have tested with comments, whitespace, differen orders of pr_* calls
> and pr_cont and the only case that I suspect to be a problem is the one
> outlined above.

This is now a more significant change, I belive we should document it
this under Documentation/dev-tools/checkpatch.rst. Where you can also
provide examples/use-cases.

>
> Suggested-by: Miguel Ojeda <ojeda@kernel.org>
> Closes: https://github.com/Rust-for-Linux/linux/issues/1140
> Signed-off-by: Alban Kurti <kurti@invicto.ai>
> ---
> Changes since v3:
> - Just reordered the checkpatch.pl code original addition as it did not work properly
> - Link to v3: https://lore.kernel.org/all/20250207-checkpatch-newline-v3-1-20d8774f16ea@invicto.ai/
> ---
>  scripts/checkpatch.pl | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 96 insertions(+)
>
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
> index 9eed3683ad76caffbbb2418e5dbea7551d374406..0e7684d2f0cf30575640d7c4da9e51a13d91463b 100755
> --- a/scripts/checkpatch.pl
> +++ b/scripts/checkpatch.pl
> @@ -77,6 +77,8 @@ my ${CONFIG_} = "CONFIG_";
>  
>  my %maybe_linker_symbol; # for externs in c exceptions, when seen in *vmlinux.lds.h
>  
> +my $pending_log = undef;
> +
>  sub help {
>  	my ($exitcode) = @_;
>  
> @@ -3888,6 +3890,91 @@ sub process {
>  			}
>  		}
>  
> +# check for pr_* and dev_* logs without a newline for C and Rust files to avoid missing log messages
> +  my $pr_cont_pattern = qr{
> +      \b
> +      pr_cont!?
> +      \s*
> +      \(
> +      \s*
> +      "([^"]*)"
> +      [^)]*
> +      \)
> +  }x;
> +  my $log_macro_pattern = qr{
> +      \b
> +      (
> +          pr_(?:emerg|alert|crit|err|warn|notice|info|debug)
> +        | dev_(?:emerg|alert|crit|err|warn|notice|info|dbg)
> +      )
> +      (!?)
> +      \s*
> +      \(
> +      \s*
> +      "([^"]*)"
> +  }x;
> +
> +  if ($realfile =~ /\.(?:c|h|rs)$/) {
> +      if ($rawline =~ /^\+/) {
> +          my $cleanline = $rawline;
> +          $cleanline =~ s/^[+\s]+//;
> +          $cleanline =~ s/\r?$//;
> +          $cleanline =~ s{/\*.*?\*/}{}g;
> +          $cleanline =~ s{//.*}{}g;
> +
> +          if ($pending_log) {
> +              if ($cleanline =~ /$pr_cont_pattern/) {
> +                  my $cont_string_arg = $1;
> +                  if ($cont_string_arg =~ /\\n$/) {
> +                      $pending_log = undef;
> +                  }
> +              } elsif ($cleanline =~ /$log_macro_pattern/) {
> +                  WARN($pending_log->{lang} . "_LOG_NO_NEWLINE",
> +                       "Possible usage of $pending_log->{macro_call} without a trailing newline.\n" .
> +                       $pending_log->{herecurr});
> +
> +                  $pending_log = undef;
> +
> +                  my $macro_call  = $1;
> +                  my $maybe_excl  = $2;
> +                  my $string_arg  = $3;
> +                  $string_arg =~ s/\s+$//;
> +
> +                  if ($realfile =~ /\.rs$/ && $maybe_excl ne '!') {
> +                      return;
> +                  }
> +
> +                  if ($string_arg !~ /\\n$/ && $string_arg !~ /\n$/) {
> +                      $pending_log = {
> +                          macro_call => $macro_call,
> +                          herecurr => $herecurr,
> +                          lang => ($realfile =~ /\.rs$/) ? "Rust" : "C",
> +                      };
> +                  }
> +              }
> +          } else {
> +              if ($cleanline =~ /$log_macro_pattern/) {
> +                  my $macro_call = $1;
> +                  my $maybe_excl = $2;
> +                  my $string_arg = $3;
> +                  $string_arg =~ s/\s+$//;
> +
> +                  if ($realfile =~ /\.rs$/ && $maybe_excl ne '!') {
> +                      return;
> +                  }
> +
> +                  if ($string_arg !~ /\\n$/ && $string_arg !~ /\n$/) {
> +                      $pending_log = {
> +                          macro_call => $macro_call,
> +                          herecurr   => $herecurr,
> +                          lang       => ($realfile =~ /\.rs$/) ? "Rust" : "C",
> +                      };
> +                  }
> +              }
> +          }
> +      }
> +  }
> +
>  # check for .L prefix local symbols in .S files
>  		if ($realfile =~ /\.S$/ &&
>  		    $line =~ /^\+\s*(?:[A-Z]+_)?SYM_[A-Z]+_(?:START|END)(?:_[A-Z_]+)?\s*\(\s*\.L/) {
> @@ -7678,6 +7765,15 @@ sub process {
>  		}
>  	}
>  
> +# pending log means a pr_* without an ending newline has not
> +# been followed by a pr_cont call with a newline at the end
> +  if ($pending_log) {
> +    WARN($pending_log->{lang} . "_LOG_NO_NEWLINE",
> +      "Usage of $pending_log->{macro_call} without a trailing newline.\n" .
> +      $pending_log->{herecurr});
> +    $pending_log = undef;
> +  }
> +
>  	# If we have no input at all, then there is nothing to report on
>  	# so just keep quiet.
>  	if ($#rawlines == -1) {
>
> ---
> base-commit: ceff0757f5dafb5be5205988171809c877b1d3e3
> change-id: 20250207-checkpatch-newline2-f60275e30eb6
>
> Best regards,

      reply	other threads:[~2025-02-07 19:53 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-07 18:39 [PATCH v4] checkpatch: add warning for pr_* and dev_* macros without a trailing newline Alban Kurti
2025-02-07 19:53 ` Charalampos Mitrodimas [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2wme1pm4k.fsf@posteo.net \
    --to=charmitro@posteo.net \
    --cc=a.hindborg@kernel.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=apw@canonical.com \
    --cc=benno.lossin@proton.me \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=dwaipayanray1@gmail.com \
    --cc=gary@garyguo.net \
    --cc=joe@perches.com \
    --cc=kurti@invicto.ai \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lukas.bulwahn@gmail.com \
    --cc=ojeda@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=tmgross@umich.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox