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,
prev parent 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.