* [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script @ 2020-08-11 21:01 Denis Efremov 2020-08-29 19:36 ` Julia Lawall ` (2 more replies) 0 siblings, 3 replies; 16+ messages in thread From: Denis Efremov @ 2020-08-11 21:01 UTC (permalink / raw) To: Julia Lawall; +Cc: Kees Cook, Gustavo A . R . Silva, cocci, linux-kernel Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") removed uninitialized_var() and deprecated it. The purpose of this script is to prevent new occurrences of open-coded variants of uninitialized_var(). Cc: Kees Cook <keescook@chromium.org> Cc: Gustavo A. R. Silva <gustavoars@kernel.org> Signed-off-by: Denis Efremov <efremov@linux.com> --- List of warnings: ./lib/glob.c:48:31-39: WARNING: this kind of initialization is deprecated ./tools/testing/selftests/vm/userfaultfd.c:349:15-22: WARNING: this kind of initialization is deprecated ./drivers/block/drbd/drbd_vli.h:330:5-9: WARNING: this kind of initialization is deprecated ./drivers/char/hw_random/intel-rng.c:333:15-18: WARNING: this kind of initialization is deprecated ./drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c:316:7-10: WARNING: this kind of initialization is deprecated ./arch/x86/include/asm/paravirt_types.h:455:15-20: WARNING: this kind of initialization is deprecated ./arch/x86/include/asm/paravirt_types.h:455:30-35: WARNING: this kind of initialization is deprecated ./arch/x86/include/asm/paravirt_types.h:455:45-50: WARNING: this kind of initialization is deprecated ./arch/x86/include/asm/paravirt_types.h:475:15-20: WARNING: this kind of initialization is deprecated ./arch/x86/include/asm/paravirt_types.h:475:30-35: WARNING: this kind of initialization is deprecated ./arch/x86/include/asm/paravirt_types.h:476:2-7: WARNING: this kind of initialization isdeprecated ./arch/x86/include/asm/paravirt_types.h:476:17-22: WARNING: this kind of initialization is deprecated ./arch/x86/include/asm/paravirt_types.h:476:32-37: WARNING: this kind of initialization is deprecated .../coccinelle/misc/uninitialized_var.cocci | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 scripts/coccinelle/misc/uninitialized_var.cocci diff --git a/scripts/coccinelle/misc/uninitialized_var.cocci b/scripts/coccinelle/misc/uninitialized_var.cocci new file mode 100644 index 000000000000..e4787bc6ab9c --- /dev/null +++ b/scripts/coccinelle/misc/uninitialized_var.cocci @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// uninitialized_var() and its open-coded variations are +/// deprecated. For details, see: +/// Documentation/process/deprecated.rst +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// + +virtual context +virtual report +virtual org + +@r@ +identifier var; +type T; +position p; +@@ + +( +* T var@p = var; +| +* T var@p = *(&(var)); +//| +// TODO: Actually, I'm not sure about this pattern. +// Looks like it's used in wireless drivers to determine +// whether data belongs to the driver or not. +// Here are all matches: +// https://elixir.bootlin.com/linux/latest/source/net/mac802154/util.c#L14 +// https://elixir.bootlin.com/linux/latest/source/drivers/staging/wlan-ng/cfg80211.c#L48 +// https://elixir.bootlin.com/linux/latest/source/drivers/net/wireless/intersil/orinoco/cfg.c#L21 +// https://elixir.bootlin.com/linux/latest/source/net/mac80211/util.c#L37 +// https://elixir.bootlin.com/linux/latest/source/drivers/net/wireless/rndis_wlan.c#L544 +// * T *var@p = &var; +) + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], + "WARNING: this kind of initialization is deprecated") + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], + "WARNING: this kind of initialization is deprecated") -- 2.26.2 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script 2020-08-11 21:01 [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script Denis Efremov @ 2020-08-29 19:36 ` Julia Lawall 2020-08-29 19:38 ` Joe Perches 2020-09-01 7:15 ` [Cocci] [PATCH v2] " Denis Efremov 2020-09-01 9:48 ` [Cocci] [PATCH v3] " Denis Efremov 2 siblings, 1 reply; 16+ messages in thread From: Julia Lawall @ 2020-08-29 19:36 UTC (permalink / raw) To: Denis Efremov; +Cc: Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On Wed, 12 Aug 2020, Denis Efremov wrote: > Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and > commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") > removed uninitialized_var() and deprecated it. > > The purpose of this script is to prevent new occurrences of open-coded > variants of uninitialized_var(). > > Cc: Kees Cook <keescook@chromium.org> > Cc: Gustavo A. R. Silva <gustavoars@kernel.org> > Signed-off-by: Denis Efremov <efremov@linux.com> Applied, without the commented out part. I only got three warnings, though. Perhaps the others have been fixed? lib/glob.c:48:31-39: WARNING: this kind of initialization is deprecated drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c:316:7-10: WARNING: this kind of initialization is deprecated tools/testing/selftests/vm/userfaultfd.c:349:15-22: WARNING: this kind of initialization is deprecated julia > --- > List of warnings: > ./lib/glob.c:48:31-39: WARNING: this kind of initialization is deprecated > ./tools/testing/selftests/vm/userfaultfd.c:349:15-22: WARNING: this kind of initialization is deprecated > ./drivers/block/drbd/drbd_vli.h:330:5-9: WARNING: this kind of initialization is deprecated > ./drivers/char/hw_random/intel-rng.c:333:15-18: WARNING: this kind of initialization is deprecated > ./drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv50.c:316:7-10: WARNING: this kind of initialization is deprecated > ./arch/x86/include/asm/paravirt_types.h:455:15-20: WARNING: this kind of initialization is deprecated > ./arch/x86/include/asm/paravirt_types.h:455:30-35: WARNING: this kind of initialization is deprecated > ./arch/x86/include/asm/paravirt_types.h:455:45-50: WARNING: this kind of initialization is deprecated > ./arch/x86/include/asm/paravirt_types.h:475:15-20: WARNING: this kind of initialization is deprecated > ./arch/x86/include/asm/paravirt_types.h:475:30-35: WARNING: this kind of initialization is deprecated > ./arch/x86/include/asm/paravirt_types.h:476:2-7: WARNING: this kind of initialization isdeprecated > ./arch/x86/include/asm/paravirt_types.h:476:17-22: WARNING: this kind of initialization is deprecated > ./arch/x86/include/asm/paravirt_types.h:476:32-37: WARNING: this kind of initialization is deprecated > > .../coccinelle/misc/uninitialized_var.cocci | 51 +++++++++++++++++++ > 1 file changed, 51 insertions(+) > create mode 100644 scripts/coccinelle/misc/uninitialized_var.cocci > > diff --git a/scripts/coccinelle/misc/uninitialized_var.cocci b/scripts/coccinelle/misc/uninitialized_var.cocci > new file mode 100644 > index 000000000000..e4787bc6ab9c > --- /dev/null > +++ b/scripts/coccinelle/misc/uninitialized_var.cocci > @@ -0,0 +1,51 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/// > +/// uninitialized_var() and its open-coded variations are > +/// deprecated. For details, see: > +/// Documentation/process/deprecated.rst > +/// > +// Confidence: High > +// Copyright: (C) 2020 Denis Efremov ISPRAS > +// Options: --no-includes --include-headers > +// > + > +virtual context > +virtual report > +virtual org > + > +@r@ > +identifier var; > +type T; > +position p; > +@@ > + > +( > +* T var@p = var; > +| > +* T var@p = *(&(var)); > +//| > +// TODO: Actually, I'm not sure about this pattern. > +// Looks like it's used in wireless drivers to determine > +// whether data belongs to the driver or not. > +// Here are all matches: > +// https://elixir.bootlin.com/linux/latest/source/net/mac802154/util.c#L14 > +// https://elixir.bootlin.com/linux/latest/source/drivers/staging/wlan-ng/cfg80211.c#L48 > +// https://elixir.bootlin.com/linux/latest/source/drivers/net/wireless/intersil/orinoco/cfg.c#L21 > +// https://elixir.bootlin.com/linux/latest/source/net/mac80211/util.c#L37 > +// https://elixir.bootlin.com/linux/latest/source/drivers/net/wireless/rndis_wlan.c#L544 > +// * T *var@p = &var; > +) > + > +@script:python depends on report@ > +p << r.p; > +@@ > + > +coccilib.report.print_report(p[0], > + "WARNING: this kind of initialization is deprecated") > + > +@script:python depends on org@ > +p << r.p; > +@@ > + > +coccilib.org.print_todo(p[0], > + "WARNING: this kind of initialization is deprecated") > -- > 2.26.2 > > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script 2020-08-29 19:36 ` Julia Lawall @ 2020-08-29 19:38 ` Joe Perches 2020-08-29 19:48 ` Julia Lawall 0 siblings, 1 reply; 16+ messages in thread From: Joe Perches @ 2020-08-29 19:38 UTC (permalink / raw) To: Julia Lawall, Denis Efremov Cc: Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On Sat, 2020-08-29 at 21:36 +0200, Julia Lawall wrote: > > On Wed, 12 Aug 2020, Denis Efremov wrote: > > > Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and > > commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") > > removed uninitialized_var() and deprecated it. > > > > The purpose of this script is to prevent new occurrences of open-coded > > variants of uninitialized_var(). > > Cc: Kees Cook <keescook@chromium.org> > > Cc: Gustavo A. R. Silva <gustavoars@kernel.org> > > Signed-off-by: Denis Efremov <efremov@linux.com> > > Applied, without the commented out part. > > I only got three warnings, though. Perhaps the others have been fixed? uninitialized_var does not exist in -next _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script 2020-08-29 19:38 ` Joe Perches @ 2020-08-29 19:48 ` Julia Lawall 2020-08-29 20:13 ` Denis Efremov 0 siblings, 1 reply; 16+ messages in thread From: Julia Lawall @ 2020-08-29 19:48 UTC (permalink / raw) To: Joe Perches; +Cc: Kees Cook, Gustavo A . R . Silva, cocci, linux-kernel On Sat, 29 Aug 2020, Joe Perches wrote: > On Sat, 2020-08-29 at 21:36 +0200, Julia Lawall wrote: > > > > On Wed, 12 Aug 2020, Denis Efremov wrote: > > > > > Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and > > > commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") > > > removed uninitialized_var() and deprecated it. > > > > > > The purpose of this script is to prevent new occurrences of open-coded > > > variants of uninitialized_var(). > > > > Cc: Kees Cook <keescook@chromium.org> > > > Cc: Gustavo A. R. Silva <gustavoars@kernel.org> > > > Signed-off-by: Denis Efremov <efremov@linux.com> > > > > Applied, without the commented out part. > > > > I only got three warnings, though. Perhaps the others have been fixed? > > uninitialized_var does not exist in -next OK, if it seems better, I can remove it. Out of the threee reported, one was a completely unnecessary initialization. julia _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script 2020-08-29 19:48 ` Julia Lawall @ 2020-08-29 20:13 ` Denis Efremov 2020-08-29 20:26 ` Julia Lawall 0 siblings, 1 reply; 16+ messages in thread From: Denis Efremov @ 2020-08-29 20:13 UTC (permalink / raw) To: Julia Lawall, Joe Perches Cc: Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On 8/29/20 10:48 PM, Julia Lawall wrote: > > > On Sat, 29 Aug 2020, Joe Perches wrote: > >> On Sat, 2020-08-29 at 21:36 +0200, Julia Lawall wrote: >>> >>> On Wed, 12 Aug 2020, Denis Efremov wrote: >>> >>>> Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and >>>> commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") >>>> removed uninitialized_var() and deprecated it. >>>> >>>> The purpose of this script is to prevent new occurrences of open-coded >>>> variants of uninitialized_var(). >> >>>> Cc: Kees Cook <keescook@chromium.org> >>>> Cc: Gustavo A. R. Silva <gustavoars@kernel.org> >>>> Signed-off-by: Denis Efremov <efremov@linux.com> >>> >>> Applied, without the commented out part. >>> >>> I only got three warnings, though. Perhaps the others have been fixed? >> >> uninitialized_var does not exist in -next Yes, and this rule checks for not introducing these initializations once again. i.e, checks for: int a = a; int a = *(&a); > > OK, if it seems better, I can remove it. Out of the threee reported, one > was a completely unnecessary initialization. > I would like send v2 with better description and link to the documentation because it's now available online: https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var Thanks, Denis _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script 2020-08-29 20:13 ` Denis Efremov @ 2020-08-29 20:26 ` Julia Lawall 0 siblings, 0 replies; 16+ messages in thread From: Julia Lawall @ 2020-08-29 20:26 UTC (permalink / raw) To: Denis Efremov Cc: Kees Cook, Gustavo A . R . Silva, linux-kernel, Joe Perches, cocci On Sat, 29 Aug 2020, Denis Efremov wrote: > > > On 8/29/20 10:48 PM, Julia Lawall wrote: > > > > > > On Sat, 29 Aug 2020, Joe Perches wrote: > > > >> On Sat, 2020-08-29 at 21:36 +0200, Julia Lawall wrote: > >>> > >>> On Wed, 12 Aug 2020, Denis Efremov wrote: > >>> > >>>> Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and > >>>> commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") > >>>> removed uninitialized_var() and deprecated it. > >>>> > >>>> The purpose of this script is to prevent new occurrences of open-coded > >>>> variants of uninitialized_var(). > >> > >>>> Cc: Kees Cook <keescook@chromium.org> > >>>> Cc: Gustavo A. R. Silva <gustavoars@kernel.org> > >>>> Signed-off-by: Denis Efremov <efremov@linux.com> > >>> > >>> Applied, without the commented out part. > >>> > >>> I only got three warnings, though. Perhaps the others have been fixed? > >> > >> uninitialized_var does not exist in -next > > Yes, and this rule checks for not introducing these initializations once again. > > i.e, checks for: > > int a = a; > > int a = *(&a); > > > > > OK, if it seems better, I can remove it. Out of the threee reported, one > > was a completely unnecessary initialization. > > > > I would like send v2 with better description and link to the documentation because it's > now available online: > https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var OK, thanks. julia _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* [Cocci] [PATCH v2] coccinelle: misc: add uninitialized_var.cocci script 2020-08-11 21:01 [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script Denis Efremov 2020-08-29 19:36 ` Julia Lawall @ 2020-09-01 7:15 ` Denis Efremov 2020-09-01 9:06 ` Julia Lawall 2020-09-01 9:48 ` [Cocci] [PATCH v3] " Denis Efremov 2 siblings, 1 reply; 16+ messages in thread From: Denis Efremov @ 2020-09-01 7:15 UTC (permalink / raw) To: julia.lawall; +Cc: Kees Cook, Gustavo A . R . Silva, cocci, linux-kernel Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") removed uninitialized_var() and deprecated it. The purpose of this script is to prevent new occurrences of open-coded variants of uninitialized_var(). Cc: Kees Cook <keescook@chromium.org> Cc: Gustavo A. R. Silva <gustavoars@kernel.org> Signed-off-by: Denis Efremov <efremov@linux.com> --- Changes in v2: - Documentation cited in the script's description - kernel.org link added to the diagnostics messages - "T *var = &var;" pattern removed - "var =@p var", "var =@p *(&(var))" patterns added .../coccinelle/misc/uninitialized_var.cocci | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 scripts/coccinelle/misc/uninitialized_var.cocci diff --git a/scripts/coccinelle/misc/uninitialized_var.cocci b/scripts/coccinelle/misc/uninitialized_var.cocci new file mode 100644 index 000000000000..8fa845cefe11 --- /dev/null +++ b/scripts/coccinelle/misc/uninitialized_var.cocci @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Please, don't reintroduce uninitialized_var(). +/// From Documentation/process/deprecated.rst: +/// For any compiler warnings about uninitialized variables, just add +/// an initializer. Using warning-silencing tricks is dangerous as it +/// papers over real bugs (or can in the future), and suppresses unrelated +/// compiler warnings (e.g. "unused variable"). If the compiler thinks it +/// is uninitialized, either simply initialize the variable or make compiler +/// changes. Keep in mind that in most cases, if an initialization is +/// obviously redundant, the compiler's dead-store elimination pass will make +/// sure there are no needless variable writes. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// + +virtual context +virtual report +virtual org + +@r@ +identifier var; +type T; +position p; +@@ + +( +* T var =@p var; +| +* T var =@p *(&(var)); +| +* var =@p var +| +* var =@p *(&(var)) +) + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") -- 2.26.2 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [Cocci] [PATCH v2] coccinelle: misc: add uninitialized_var.cocci script 2020-09-01 7:15 ` [Cocci] [PATCH v2] " Denis Efremov @ 2020-09-01 9:06 ` Julia Lawall 0 siblings, 0 replies; 16+ messages in thread From: Julia Lawall @ 2020-09-01 9:06 UTC (permalink / raw) To: Denis Efremov; +Cc: Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On Tue, 1 Sep 2020, Denis Efremov wrote: > Commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") and > commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") > removed uninitialized_var() and deprecated it. I'm not really sure to understand the above. How can something that has already been removed be deprecated, since it doesn't exist any more? Maybe the commits should be mentioned in the opposite order? Personally, I would find the sentence a lot easier to read without the commit subject lines in parentheses in the middle of it. It inspires me to just ignore the paragraph completely. I wonder if it could be allowed to just mention the commit ids in the sentence and then put the ids followed by the subject line afterwards? julia > > The purpose of this script is to prevent new occurrences of open-coded > variants of uninitialized_var(). > > Cc: Kees Cook <keescook@chromium.org> > Cc: Gustavo A. R. Silva <gustavoars@kernel.org> > Signed-off-by: Denis Efremov <efremov@linux.com> > --- > Changes in v2: > - Documentation cited in the script's description > - kernel.org link added to the diagnostics messages > - "T *var = &var;" pattern removed > - "var =@p var", "var =@p *(&(var))" patterns added > > .../coccinelle/misc/uninitialized_var.cocci | 51 +++++++++++++++++++ > 1 file changed, 51 insertions(+) > create mode 100644 scripts/coccinelle/misc/uninitialized_var.cocci > > diff --git a/scripts/coccinelle/misc/uninitialized_var.cocci b/scripts/coccinelle/misc/uninitialized_var.cocci > new file mode 100644 > index 000000000000..8fa845cefe11 > --- /dev/null > +++ b/scripts/coccinelle/misc/uninitialized_var.cocci > @@ -0,0 +1,51 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/// > +/// Please, don't reintroduce uninitialized_var(). > +/// From Documentation/process/deprecated.rst: > +/// For any compiler warnings about uninitialized variables, just add > +/// an initializer. Using warning-silencing tricks is dangerous as it > +/// papers over real bugs (or can in the future), and suppresses unrelated > +/// compiler warnings (e.g. "unused variable"). If the compiler thinks it > +/// is uninitialized, either simply initialize the variable or make compiler > +/// changes. Keep in mind that in most cases, if an initialization is > +/// obviously redundant, the compiler's dead-store elimination pass will make > +/// sure there are no needless variable writes. > +/// > +// Confidence: High > +// Copyright: (C) 2020 Denis Efremov ISPRAS > +// Options: --no-includes --include-headers > +// > + > +virtual context > +virtual report > +virtual org > + > +@r@ > +identifier var; > +type T; > +position p; > +@@ > + > +( > +* T var =@p var; > +| > +* T var =@p *(&(var)); > +| > +* var =@p var > +| > +* var =@p *(&(var)) > +) > + > +@script:python depends on report@ > +p << r.p; > +@@ > + > +coccilib.report.print_report(p[0], > + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") > + > +@script:python depends on org@ > +p << r.p; > +@@ > + > +coccilib.org.print_todo(p[0], > + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") > -- > 2.26.2 > > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* [Cocci] [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script 2020-08-11 21:01 [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script Denis Efremov 2020-08-29 19:36 ` Julia Lawall 2020-09-01 7:15 ` [Cocci] [PATCH v2] " Denis Efremov @ 2020-09-01 9:48 ` Denis Efremov 2020-09-01 10:08 ` Julia Lawall ` (3 more replies) 2 siblings, 4 replies; 16+ messages in thread From: Denis Efremov @ 2020-09-01 9:48 UTC (permalink / raw) To: julia.lawall; +Cc: Kees Cook, Gustavo A . R . Silva, cocci, linux-kernel uninitialized_var() macro was removed from the sources [1] and other warning-silencing tricks were deprecated [2]. The purpose of this cocci script is to prevent new occurrences of uninitialized_var() open-coded variants. [1] commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") [2] commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") Cc: Kees Cook <keescook@chromium.org> Cc: Gustavo A. R. Silva <gustavoars@kernel.org> Signed-off-by: Denis Efremov <efremov@linux.com> --- Changes in v2: - Documentation cited in the script's description - kernel.org link added to the diagnostics messages - "T *var = &var;" pattern removed - "var =@p var", "var =@p *(&(var))" patterns added Changes in v3: - commit's description changed .../coccinelle/misc/uninitialized_var.cocci | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 scripts/coccinelle/misc/uninitialized_var.cocci diff --git a/scripts/coccinelle/misc/uninitialized_var.cocci b/scripts/coccinelle/misc/uninitialized_var.cocci new file mode 100644 index 000000000000..8fa845cefe11 --- /dev/null +++ b/scripts/coccinelle/misc/uninitialized_var.cocci @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// +/// Please, don't reintroduce uninitialized_var(). +/// From Documentation/process/deprecated.rst: +/// For any compiler warnings about uninitialized variables, just add +/// an initializer. Using warning-silencing tricks is dangerous as it +/// papers over real bugs (or can in the future), and suppresses unrelated +/// compiler warnings (e.g. "unused variable"). If the compiler thinks it +/// is uninitialized, either simply initialize the variable or make compiler +/// changes. Keep in mind that in most cases, if an initialization is +/// obviously redundant, the compiler's dead-store elimination pass will make +/// sure there are no needless variable writes. +/// +// Confidence: High +// Copyright: (C) 2020 Denis Efremov ISPRAS +// Options: --no-includes --include-headers +// + +virtual context +virtual report +virtual org + +@r@ +identifier var; +type T; +position p; +@@ + +( +* T var =@p var; +| +* T var =@p *(&(var)); +| +* var =@p var +| +* var =@p *(&(var)) +) + +@script:python depends on report@ +p << r.p; +@@ + +coccilib.report.print_report(p[0], + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") + +@script:python depends on org@ +p << r.p; +@@ + +coccilib.org.print_todo(p[0], + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") -- 2.26.2 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [Cocci] [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script 2020-09-01 9:48 ` [Cocci] [PATCH v3] " Denis Efremov @ 2020-09-01 10:08 ` Julia Lawall 2020-09-01 14:37 ` [Cocci] checkpatch? (was: Re: [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script) Joe Perches ` (2 subsequent siblings) 3 siblings, 0 replies; 16+ messages in thread From: Julia Lawall @ 2020-09-01 10:08 UTC (permalink / raw) To: Denis Efremov; +Cc: Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On Tue, 1 Sep 2020, Denis Efremov wrote: > uninitialized_var() macro was removed from the sources [1] and > other warning-silencing tricks were deprecated [2]. The purpose of this > cocci script is to prevent new occurrences of uninitialized_var() > open-coded variants. > > [1] commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") > [2] commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") Thanks! I find that much more understandable. julia > > Cc: Kees Cook <keescook@chromium.org> > Cc: Gustavo A. R. Silva <gustavoars@kernel.org> > Signed-off-by: Denis Efremov <efremov@linux.com> > --- > Changes in v2: > - Documentation cited in the script's description > - kernel.org link added to the diagnostics messages > - "T *var = &var;" pattern removed > - "var =@p var", "var =@p *(&(var))" patterns added > Changes in v3: > - commit's description changed > > .../coccinelle/misc/uninitialized_var.cocci | 51 +++++++++++++++++++ > 1 file changed, 51 insertions(+) > create mode 100644 scripts/coccinelle/misc/uninitialized_var.cocci > > diff --git a/scripts/coccinelle/misc/uninitialized_var.cocci b/scripts/coccinelle/misc/uninitialized_var.cocci > new file mode 100644 > index 000000000000..8fa845cefe11 > --- /dev/null > +++ b/scripts/coccinelle/misc/uninitialized_var.cocci > @@ -0,0 +1,51 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/// > +/// Please, don't reintroduce uninitialized_var(). > +/// From Documentation/process/deprecated.rst: > +/// For any compiler warnings about uninitialized variables, just add > +/// an initializer. Using warning-silencing tricks is dangerous as it > +/// papers over real bugs (or can in the future), and suppresses unrelated > +/// compiler warnings (e.g. "unused variable"). If the compiler thinks it > +/// is uninitialized, either simply initialize the variable or make compiler > +/// changes. Keep in mind that in most cases, if an initialization is > +/// obviously redundant, the compiler's dead-store elimination pass will make > +/// sure there are no needless variable writes. > +/// > +// Confidence: High > +// Copyright: (C) 2020 Denis Efremov ISPRAS > +// Options: --no-includes --include-headers > +// > + > +virtual context > +virtual report > +virtual org > + > +@r@ > +identifier var; > +type T; > +position p; > +@@ > + > +( > +* T var =@p var; > +| > +* T var =@p *(&(var)); > +| > +* var =@p var > +| > +* var =@p *(&(var)) > +) > + > +@script:python depends on report@ > +p << r.p; > +@@ > + > +coccilib.report.print_report(p[0], > + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") > + > +@script:python depends on org@ > +p << r.p; > +@@ > + > +coccilib.org.print_todo(p[0], > + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") > -- > 2.26.2 > > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* [Cocci] checkpatch? (was: Re: [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script) 2020-09-01 9:48 ` [Cocci] [PATCH v3] " Denis Efremov 2020-09-01 10:08 ` Julia Lawall @ 2020-09-01 14:37 ` Joe Perches 2020-09-02 5:17 ` Denis Efremov 2020-09-05 17:18 ` [Cocci] [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script Julia Lawall 2020-09-05 17:58 ` [Cocci] [PATCH] checkpatch: Warn on self-assignments Joe Perches 3 siblings, 1 reply; 16+ messages in thread From: Joe Perches @ 2020-09-01 14:37 UTC (permalink / raw) To: Denis Efremov, julia.lawall Cc: Andrew Morton, Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On Tue, 2020-09-01 at 12:48 +0300, Denis Efremov wrote: > uninitialized_var() macro was removed from the sources [1] and > other warning-silencing tricks were deprecated [2]. The purpose of this > cocci script is to prevent new occurrences of uninitialized_var() > open-coded variants. > +( > +* T var =@p var; > +| > +* T var =@p *(&(var)); > +| > +* var =@p var > +| > +* var =@p *(&(var)) > +) Adding a checkpatch test might be a good thing too. --- scripts/checkpatch.pl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 149518d2a6a7..300b2659aab3 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -3901,6 +3901,17 @@ sub process { #ignore lines not being added next if ($line =~ /^[^\+]/); +# check for self assigments used to avoid compiler warnings +# e.g.: int foo = foo, *bar = NULL; +# struct foo bar = *(&(bar)); + if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) { + my $var = $1; + if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) { + WARN("SELF_ASSIGNMENT", + "Do not use self-assignments to avoid compiler warnings\n" . $herecurr); + } + } + # check for dereferences that span multiple lines if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ && $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) { _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [Cocci] checkpatch? (was: Re: [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script) 2020-09-01 14:37 ` [Cocci] checkpatch? (was: Re: [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script) Joe Perches @ 2020-09-02 5:17 ` Denis Efremov 0 siblings, 0 replies; 16+ messages in thread From: Denis Efremov @ 2020-09-02 5:17 UTC (permalink / raw) To: Joe Perches, julia.lawall Cc: Andrew Morton, Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On 9/1/20 5:37 PM, Joe Perches wrote: > On Tue, 2020-09-01 at 12:48 +0300, Denis Efremov wrote: >> uninitialized_var() macro was removed from the sources [1] and >> other warning-silencing tricks were deprecated [2]. The purpose of this >> cocci script is to prevent new occurrences of uninitialized_var() >> open-coded variants. > >> +( >> +* T var =@p var; >> +| >> +* T var =@p *(&(var)); >> +| >> +* var =@p var >> +| >> +* var =@p *(&(var)) >> +) > > Adding a checkpatch test might be a good thing too. > > --- > scripts/checkpatch.pl | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl > index 149518d2a6a7..300b2659aab3 100755 > --- a/scripts/checkpatch.pl > +++ b/scripts/checkpatch.pl > @@ -3901,6 +3901,17 @@ sub process { > #ignore lines not being added > next if ($line =~ /^[^\+]/); > > +# check for self assigments used to avoid compiler warnings > +# e.g.: int foo = foo, *bar = NULL; > +# struct foo bar = *(&(bar)); > + if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) { > + my $var = $1; > + if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) { > + WARN("SELF_ASSIGNMENT", > + "Do not use self-assignments to avoid compiler warnings\n" . $herecurr); > + } > + } > + > # check for dereferences that span multiple lines > if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ && > $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) { Looks good. I also faced this kind of assignments after declarations. https://lkml.org/lkml/2020/8/31/85 I'm not sure if they are used to suppress compiler warnings, through. Denis _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Cocci] [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script 2020-09-01 9:48 ` [Cocci] [PATCH v3] " Denis Efremov 2020-09-01 10:08 ` Julia Lawall 2020-09-01 14:37 ` [Cocci] checkpatch? (was: Re: [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script) Joe Perches @ 2020-09-05 17:18 ` Julia Lawall 2020-09-05 17:58 ` [Cocci] [PATCH] checkpatch: Warn on self-assignments Joe Perches 3 siblings, 0 replies; 16+ messages in thread From: Julia Lawall @ 2020-09-05 17:18 UTC (permalink / raw) To: Denis Efremov; +Cc: Gustavo A . R . Silva, cocci, Kees Cook, linux-kernel On Tue, 1 Sep 2020, Denis Efremov wrote: > uninitialized_var() macro was removed from the sources [1] and > other warning-silencing tricks were deprecated [2]. The purpose of this > cocci script is to prevent new occurrences of uninitialized_var() > open-coded variants. > > [1] commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") > [2] commit 4b19bec97c88 ("docs: deprecated.rst: Add uninitialized_var()") > > Cc: Kees Cook <keescook@chromium.org> > Cc: Gustavo A. R. Silva <gustavoars@kernel.org> > Signed-off-by: Denis Efremov <efremov@linux.com> Applied. julia > --- > Changes in v2: > - Documentation cited in the script's description > - kernel.org link added to the diagnostics messages > - "T *var = &var;" pattern removed > - "var =@p var", "var =@p *(&(var))" patterns added > Changes in v3: > - commit's description changed > > .../coccinelle/misc/uninitialized_var.cocci | 51 +++++++++++++++++++ > 1 file changed, 51 insertions(+) > create mode 100644 scripts/coccinelle/misc/uninitialized_var.cocci > > diff --git a/scripts/coccinelle/misc/uninitialized_var.cocci b/scripts/coccinelle/misc/uninitialized_var.cocci > new file mode 100644 > index 000000000000..8fa845cefe11 > --- /dev/null > +++ b/scripts/coccinelle/misc/uninitialized_var.cocci > @@ -0,0 +1,51 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/// > +/// Please, don't reintroduce uninitialized_var(). > +/// From Documentation/process/deprecated.rst: > +/// For any compiler warnings about uninitialized variables, just add > +/// an initializer. Using warning-silencing tricks is dangerous as it > +/// papers over real bugs (or can in the future), and suppresses unrelated > +/// compiler warnings (e.g. "unused variable"). If the compiler thinks it > +/// is uninitialized, either simply initialize the variable or make compiler > +/// changes. Keep in mind that in most cases, if an initialization is > +/// obviously redundant, the compiler's dead-store elimination pass will make > +/// sure there are no needless variable writes. > +/// > +// Confidence: High > +// Copyright: (C) 2020 Denis Efremov ISPRAS > +// Options: --no-includes --include-headers > +// > + > +virtual context > +virtual report > +virtual org > + > +@r@ > +identifier var; > +type T; > +position p; > +@@ > + > +( > +* T var =@p var; > +| > +* T var =@p *(&(var)); > +| > +* var =@p var > +| > +* var =@p *(&(var)) > +) > + > +@script:python depends on report@ > +p << r.p; > +@@ > + > +coccilib.report.print_report(p[0], > + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") > + > +@script:python depends on org@ > +p << r.p; > +@@ > + > +coccilib.org.print_todo(p[0], > + "WARNING this kind of initialization is deprecated (https://www.kernel.org/doc/html/latest/process/deprecated.html#uninitialized-var)") > -- > 2.26.2 > > _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* [Cocci] [PATCH] checkpatch: Warn on self-assignments 2020-09-01 9:48 ` [Cocci] [PATCH v3] " Denis Efremov ` (2 preceding siblings ...) 2020-09-05 17:18 ` [Cocci] [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script Julia Lawall @ 2020-09-05 17:58 ` Joe Perches 2020-09-10 19:51 ` Kees Cook 3 siblings, 1 reply; 16+ messages in thread From: Joe Perches @ 2020-09-05 17:58 UTC (permalink / raw) To: Andrew Morton; +Cc: Kees Cook, Gustavo A . R . Silva, linux-kernel, cocci The uninitialized_var() macro was removed recently via commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") as it's not a particularly useful warning and its use can "paper over real bugs". Add a checkpatch test to warn on self-assignments as a means to avoid compiler warnings and as a back-door mechanism to reproduce the old uninitialized_var macro behavior. Signed-off-by: Joe Perches <joe@perches.com> --- scripts/checkpatch.pl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 149518d2a6a7..300b2659aab3 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -3901,6 +3901,17 @@ sub process { #ignore lines not being added next if ($line =~ /^[^\+]/); +# check for self assigments used to avoid compiler warnings +# e.g.: int foo = foo, *bar = NULL; +# struct foo bar = *(&(bar)); + if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) { + my $var = $1; + if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) { + WARN("SELF_ASSIGNMENT", + "Do not use self-assignments to avoid compiler warnings\n" . $herecurr); + } + } + # check for dereferences that span multiple lines if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ && $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) { _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [Cocci] [PATCH] checkpatch: Warn on self-assignments 2020-09-05 17:58 ` [Cocci] [PATCH] checkpatch: Warn on self-assignments Joe Perches @ 2020-09-10 19:51 ` Kees Cook 2020-09-10 21:35 ` Joe Perches 0 siblings, 1 reply; 16+ messages in thread From: Kees Cook @ 2020-09-10 19:51 UTC (permalink / raw) To: Joe Perches; +Cc: Gustavo A . R . Silva, linux-kernel, Andrew Morton, cocci On Sat, Sep 05, 2020 at 10:58:29AM -0700, Joe Perches wrote: > The uninitialized_var() macro was removed recently via > commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") > as it's not a particularly useful warning and its use can > "paper over real bugs". > > Add a checkpatch test to warn on self-assignments as a means > to avoid compiler warnings and as a back-door mechanism to > reproduce the old uninitialized_var macro behavior. > > Signed-off-by: Joe Perches <joe@perches.com> I like it! :) Can you add a section to code style and include a link in the checkpatch warning to it? (Feel free to just reuse the text removed from deprecated.rst) -- Kees Cook _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [Cocci] [PATCH] checkpatch: Warn on self-assignments 2020-09-10 19:51 ` Kees Cook @ 2020-09-10 21:35 ` Joe Perches 0 siblings, 0 replies; 16+ messages in thread From: Joe Perches @ 2020-09-10 21:35 UTC (permalink / raw) To: Kees Cook; +Cc: Gustavo A . R . Silva, linux-kernel, Andrew Morton, cocci On Thu, 2020-09-10 at 12:51 -0700, Kees Cook wrote: > On Sat, Sep 05, 2020 at 10:58:29AM -0700, Joe Perches wrote: > > The uninitialized_var() macro was removed recently via > > commit 63a0895d960a ("compiler: Remove uninitialized_var() macro") > > as it's not a particularly useful warning and its use can > > "paper over real bugs". > > > > Add a checkpatch test to warn on self-assignments as a means > > to avoid compiler warnings and as a back-door mechanism to > > reproduce the old uninitialized_var macro behavior. > > > > Signed-off-by: Joe Perches <joe@perches.com> > > I like it! :) > > Can you add a section to code style and include a link in the checkpatch > warning to it? (Feel free to just reuse the text removed from > deprecated.rst) Hi Kees. I believe coding style is already a bit bloated and more rules and content really won't add much for new developers. You're welcome to try to add whatever you want to it though. cheers, Joe _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2020-09-11 12:53 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-08-11 21:01 [Cocci] [RFC PATCH] coccinelle: misc: add uninitialized_var.cocci script Denis Efremov 2020-08-29 19:36 ` Julia Lawall 2020-08-29 19:38 ` Joe Perches 2020-08-29 19:48 ` Julia Lawall 2020-08-29 20:13 ` Denis Efremov 2020-08-29 20:26 ` Julia Lawall 2020-09-01 7:15 ` [Cocci] [PATCH v2] " Denis Efremov 2020-09-01 9:06 ` Julia Lawall 2020-09-01 9:48 ` [Cocci] [PATCH v3] " Denis Efremov 2020-09-01 10:08 ` Julia Lawall 2020-09-01 14:37 ` [Cocci] checkpatch? (was: Re: [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script) Joe Perches 2020-09-02 5:17 ` Denis Efremov 2020-09-05 17:18 ` [Cocci] [PATCH v3] coccinelle: misc: add uninitialized_var.cocci script Julia Lawall 2020-09-05 17:58 ` [Cocci] [PATCH] checkpatch: Warn on self-assignments Joe Perches 2020-09-10 19:51 ` Kees Cook 2020-09-10 21:35 ` Joe Perches
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).