Re: drop overzealous ERROR: do not initialise statics to 0 or NULL from checkpatch.pl

From: John Kacur
Date: Wed Aug 13 2008 - 07:50:46 EST


On Wed, Aug 13, 2008 at 12:39 PM, John Kacur <jkacur@xxxxxxxxx> wrote:
> Could we drop this somewhat overzealous "ERROR: do not initialise
> statics to 0 or NULL" from checkpatch.pl?
>
> Reasoning:
> 1. This is not part of Documentation/CodingStyle
> 2. K&R 2nd.ed do it (pg 83, static int bufp = 0;) The purpose is to
> remove access to the bufp from external routines, and to avoid name
> conflict)
> 3. It can be a good form of documentation.
> 4. It creates a lot of needless code churn to change this kind of
> thing for no good reason.
> 5. It doesn't even change the object size (thus kernel size) to do so.
> Demo with user space code.
>
> jkacur@linux-ipxk:~/try> cat foo.c
> #include <stdio.h>
> #include <stdlib.h>
>
> static int a[1000];
>
> /* Function Prototype */
> void foo(void);
> int main(void)
> {
> exit(0);
> }
>
> void foo(void)
> {
> static int b[1000];
> static int c;
> }
> jkacur@linux-ipxk:~/try> gcc foo.c
> jkacur@linux-ipxk:~/try> size a.out
> text data bss dec hex filename
> 1203 520 8064 9787 263b a.out
> jkacur@linux-ipxk:~/try> ls -l a.out
> -rwxr-xr-x 1 jkacur users 11237 2008-08-13 12:26 a.out
>
> Now initialize all the statics to 0 and there will be no difference in
> the object size
> jkacur@linux-ipxk:~/try> cat foo.c
> #include <stdio.h>
> #include <stdlib.h>
>
> static int a[1000] = {0};
>
> /* Function Prototype */
> void foo(void);
> int main(void)
> {
> exit(0);
> }
>
> void foo(void)
> {
> static int b[1000] = {0};
> static int c = 0;
> }
> jkacur@linux-ipxk:~/try> gcc foo.c
> jkacur@linux-ipxk:~/try> size a.out
> text data bss dec hex filename
> 1203 520 8064 9787 263b a.out
> <----------------------- No difference with the initialization to 0!!!
> jkacur@linux-ipxk:~/try> ls -l a.out
> -rwxr-xr-x 1 jkacur users 11237 2008-08-13 12:26 a.out
> <----------------------- No difference with the initialization to 0!!!
>
>
> Now if we initialize it to a value other than 0 or NULL, then the bss
> is decreased at the expense of the data section, which does indeed
> increase the object size, however checkpatch.pl doesn't complain about
> this. (it is valid to do this)
> jkacur@linux-ipxk:~/try> cat foo.c
> #include <stdio.h>
> #include <stdlib.h>
>
> static int a[1000] = {1};
>
> /* Function Prototype */
> void foo(void);
> int main(void)
> {
> exit(0);
> }
>
> void foo(void)
> {
> static int b[1000] = {1};
> static int c = 1;
> }
> jkacur@linux-ipxk:~/try> gcc foo.c
> jkacur@linux-ipxk:~/try> size a.out
> text data bss dec hex filename
> 1203 8568 16 9787 263b a.out
> jkacur@linux-ipxk:~/try> ls -l a.out
> -rwxr-xr-x 1 jkacur users 19301 2008-08-13 12:27 a.out
>

My apologies for not ccing the maintainers of checkpatch the first
time. Attached is a patch to remove the check in case anybody agrees
with me. :)
The patch is against a recently updated git tree.
Subject: Remove unnecessary error about initialising statics to 0 or NULL

Signed-off-by: John Kacur <jkacur at gmail dot com>

Index: linux-2.6/scripts/checkpatch.pl
===================================================================
--- linux-2.6.orig/scripts/checkpatch.pl
+++ linux-2.6/scripts/checkpatch.pl
@@ -1341,11 +1341,6 @@ sub process {
ERROR("do not initialise externals to 0 or NULL\n" .
$herecurr);
}
-# check for static initialisers.
- if ($line =~ /\s*static\s.*=\s*(0|NULL|false)\s*;/) {
- ERROR("do not initialise statics to 0 or NULL\n" .
- $herecurr);
- }

# check for new typedefs, only function parameters and sparse annotations
# make sense.