From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mout-p-102.mailbox.org (mout-p-102.mailbox.org [80.241.56.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E680437C92B for ; Tue, 23 Jun 2026 19:12:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=80.241.56.152 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782241948; cv=none; b=NliCgi//X6QusPr46v1ms2Ghy0z8YreeGhXWPZL4nZLLhcZgR38l8HKGwiaYq9wAB50yJLw1qOD8nvir0MVRC9E3Sleveae+xXV898AATCW4fK3ABXH6HK6wcmwwD6B7RNKZs7yFaZO+ONA43xlAAoU8vYI8w1MRuZzivoATbj0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782241948; c=relaxed/simple; bh=Z4mFCET5XsRScMnoBRVHElRrV0S+CMXMB+79qUmBh6o=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=ZGBrqP5BV69jNnfDAVdZXX2VtAF7M+T0UHY+RtJfGzsSXkX7EGciVof5bG5cBV8/wEpxLBzbvFIPTBG7TDRl89fLUrZTCGm9u8anAWR9N4E5mExu5hI0a0mZU+YX7rWMf9kRGsk5agqQNs2Dko/A6SW49nKJh0e2dWFXYpLCmRk= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org; spf=pass smtp.mailfrom=mailbox.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=DLVuvF6u; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b=vrbLEYrW; arc=none smtp.client-ip=80.241.56.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=mailbox.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mailbox.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="DLVuvF6u"; dkim=pass (2048-bit key) header.d=mailbox.org header.i=@mailbox.org header.b="vrbLEYrW" Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-102.mailbox.org (Postfix) with ESMTPS id 4glF7P5mhGz9vLn; Tue, 23 Jun 2026 21:12:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1782241937; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=/EoWAduzca262WSZzcETxp/XaYDVCB0SeqeQrxM3Bjg=; b=DLVuvF6uqbD5sV2mZQ4RPIfRutNMGT7cFZllO3uOqbpixu8adoOc+ZUFhL8Z95QEMOzg2X kMdHGyg7qKIsnKwksb2uzY+y9B4Em9AzIOiDwEAEfX2ukGdg1Ii36j58T8lmLpaDKQne3p KwEiYSZumpV3qzDBVi9K6dFXMt4y5K3va80K7/Lp4KQZO/OMwvggv904Lvp5UWHhsNdNAl tM1zB8kvi8xwImURrNfk+jHJIyKT6E2P+oiC9zEHrZbNwBzAgoOODHwCqiOx3t+6itwie2 EYYJfqadmHKKXK67Dy2V1uNVLIwgrwGZoKaZr4eNSFN2Xkm2LR9aECuzH9EE7w== Authentication-Results: outgoing_mbo_mout; dkim=pass header.d=mailbox.org header.s=mail20150812 header.b=vrbLEYrW; spf=pass (outgoing_mbo_mout: domain of manuelebner@mailbox.org designates 2001:67c:2050:b231:465::102 as permitted sender) smtp.mailfrom=manuelebner@mailbox.org From: Manuel Ebner DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailbox.org; s=mail20150812; t=1782241936; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=/EoWAduzca262WSZzcETxp/XaYDVCB0SeqeQrxM3Bjg=; b=vrbLEYrW9BmTwtP7k4a2k4uQHzL8oCy3qWHngDrLIJg3zbdyZ32H4/jFc0zgd7U4CwCDkG e19AldvKNCRygQErpKHQuAOgMJRDZSYCIdwg8FgVSlLBNAo7QUr2I+K/+yO89rxh5p8M6H 1kRLIrXVFYzAxqqRaAOEvB6cpJzMA2RXbEKKyBz01IVXuGA7Y7LmVtq7aoROUOz7jEsxf8 HiSocAzj4BV1gIPGzsfX2rpwNlF4t1myE37akZY25dwiizix4OPErYkGWPVVy+JKWy4SnE 3NxZI6Hq3XZMbnSisYh5IvKwJdyOpiB4uSf4pIZ5LeVwzKeJpPva9h3pYzfMVw== To: Andy Whitcroft , Joe Perches , Dwaipayan Ray , Lukas Bulwahn , linux-kernel@vger.kernel.org (open list) Cc: Manuel Ebner Subject: [RFC] checkpatch: Introduce a check for the nesting of brackets Date: Tue, 23 Jun 2026 21:09:39 +0200 Message-ID: <20260623190937.47435-3-manuelebner@mailbox.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-MBO-RS-META: 3gn86txq61jbt414yx9ykn1dikb7hu7g X-MBO-RS-ID: d8d3be16c95019f6b14 X-Rspamd-Queue-Id: 4glF7P5mhGz9vLn I have a local script that checks files for the right nesting of brackets. With the help of the script I managed to do a couple patches [1]. Unfortunately there are (still) a lot of false positives [2]. I do not filter false positives (yet). To simplify testing the new check is enabled and warns(WARN()). The final version would be disabled by default and would trigger CHK(). Would this addition, if cleaned up, get into checkpatch.pl? Thanks Manuel [1] Examples https://lore.kernel.org/all/?q=f%3Amanuelebner%40mailbox.org+AND+d%3A2026-06-11+AND+%28s%3A%22bracket%22+OR+s%3A%22brackets%22+%09OR+s%3A%22cleanup%22+OR+s%3A%22sysfs-firmware-dmi%22 [2] Smileys: ;-) :), :-( :(, Enums: 1) 2), i) ii), a) b), Arrows: ->, <- Intervall: (0, 100], [0, 100) Code snippets in Docs: Unclosed '{' or '(' Scissors: 8<--- cut here --- --- scripts/checkpatch.pl | 52 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 0492d6afc9a1..4e8d72825b70 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -75,6 +75,17 @@ my $git_command ='export LANGUAGE=en_US.UTF-8; git'; my $tabsize = 8; my ${CONFIG_} = "CONFIG_"; +my %brackets = ( + ')' => '(', + '}' => '{', + ']' => '[', +); +my @stack_brackets; +my $line_num = 0; +my $has_error = 0; +my $last_open; +my %open_brackets = reverse %brackets; + my %maybe_linker_symbol; # for externs in c exceptions, when seen in *vmlinux.lds.h sub help { @@ -3252,6 +3263,37 @@ sub process { $needs_fixes_tag = $1; } +# Check brackets for matching pairs + while ($line =~ /([\(\)\{\}\[\]])/g) { + my $char = $1; + # If it's an opening bracket, push onto stack + if (grep { $_ eq $char } values %brackets) { + push @stack_brackets, { char => $char, line => $line_num }; + } + # If it's a closing bracket, validate + elsif (exists $brackets{$char}) { + my $expected = $brackets{$char}; + if (!@stack_brackets) { + WARN("OPENING_BRACKET_MISSING", + "Missing opening bracket\n" . + "Found closing '$char' without an opening '$expected'\n" . + $herecurr); + $has_error = 1; + last; + } + $last_open = pop @stack_brackets; + if ($last_open->{char} ne $expected) { + WARN("MISMATCH_OF_BRACKETS", + "Mismatched brackets error\n" . + "Expected '$open_brackets{$last_open->{char}}' but found '$char' on" . "\n" . + $herecurr); + $has_error = 1; + last; + } + } + } + $line_num++; + # Check Fixes: styles is correct if (!$in_header_lines && $line =~ /^\s*(fixes:?)\s*(?:commit\s*)?([0-9a-f]{5,40})(?:\s*($balanced_parens))?/i) { @@ -7806,6 +7848,16 @@ sub process { } } +# Check if there are any unclosed brackets remaining + if (!$has_error && @stack_brackets) { + foreach my $unclosed (reverse @stack_brackets) { + print "\n"; + WARN("CLOSING_BRACKET_MISSING", + "closing bracket missing\n" . + "Unclosed '$unclosed->{char}' started on line '$unclosed->{line}'\n"); + } + } + # If we have no input at all, then there is nothing to report on # so just keep quiet. if ($#rawlines == -1) { -- 2.54.0