2016-08-28 09:51:28 +03:00
#!/usr/bin/env python3
2019-05-27 09:55:14 +03:00
# SPDX-License-Identifier: GPL-2.0-only
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2015-03-16 14:16:14 +03:00
""" Find Kconfig symbols that are referenced but not defined. """
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2017-01-18 15:08:19 +03:00
# (c) 2014-2017 Valentin Rothberg <valentinrothberg@gmail.com>
2014-11-08 22:56:35 +03:00
# (c) 2014 Stefan Hengelein <stefan.hengelein@fau.de>
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
#
2016-08-28 09:51:29 +03:00
import argparse
2015-11-26 16:17:15 +03:00
import difflib
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
import os
import re
2015-10-15 11:37:47 +03:00
import signal
2016-08-27 11:59:07 +03:00
import subprocess
2015-03-16 14:16:14 +03:00
import sys
2015-10-15 11:37:47 +03:00
from multiprocessing import Pool , cpu_count
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2014-11-08 22:56:35 +03:00
# regex expressions
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
OPERATORS = r " &| \ (| \ )| \ || \ ! "
2016-08-28 09:51:31 +03:00
SYMBOL = r " (?: \ w*[A-Z0-9] \ w*) { 2,} "
DEF = r " ^ \ s*(?:menu) { ,1}config \ s+( " + SYMBOL + r " ) \ s* "
EXPR = r " (?: " + OPERATORS + r " | \ s| " + SYMBOL + r " )+ "
2015-07-27 13:33:05 +03:00
DEFAULT = r " default \ s+.*?(?:if \ s.+) { ,1} "
2017-02-02 20:00:44 +03:00
STMT = r " ^ \ s*(?:if|select|imply|depends \ s+on|(?: " + DEFAULT + r " )) \ s+ " + EXPR
2016-08-28 09:51:31 +03:00
SOURCE_SYMBOL = r " (?: \ W| \ b)+[D] { ,1}CONFIG_( " + SYMBOL + r " ) "
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2014-11-08 22:56:35 +03:00
# regex objects
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
REGEX_FILE_KCONFIG = re . compile ( r " .*Kconfig[ \ . \ w+ \ -]*$ " )
2016-08-28 09:51:31 +03:00
REGEX_SYMBOL = re . compile ( r ' (?! \ B) ' + SYMBOL + r ' (?! \ B) ' )
REGEX_SOURCE_SYMBOL = re . compile ( SOURCE_SYMBOL )
2014-11-08 22:56:35 +03:00
REGEX_KCONFIG_DEF = re . compile ( DEF )
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
REGEX_KCONFIG_EXPR = re . compile ( EXPR )
REGEX_KCONFIG_STMT = re . compile ( STMT )
2016-08-28 09:51:31 +03:00
REGEX_FILTER_SYMBOLS = re . compile ( r " [A-Za-z0-9]$ " )
2015-07-27 13:33:05 +03:00
REGEX_NUMERIC = re . compile ( r " 0[xX][0-9a-fA-F]+|[0-9]+ " )
2015-10-15 11:37:47 +03:00
REGEX_QUOTES = re . compile ( " ( \" (.*?) \" ) " )
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2015-03-16 14:16:14 +03:00
def parse_options ( ) :
""" The user interface of this module. """
2016-08-28 09:51:29 +03:00
usage = " Run this tool to detect Kconfig symbols that are referenced but " \
" not defined in Kconfig. If no option is specified, " \
" checkkconfigsymbols defaults to check your current tree. " \
" Please note that specifying commits will ' git reset --hard \' " \
" your current tree! You may save uncommitted changes to avoid " \
" losing data. "
parser = argparse . ArgumentParser ( description = usage )
parser . add_argument ( ' -c ' , ' --commit ' , dest = ' commit ' , action = ' store ' ,
default = " " ,
help = " check if the specified commit (hash) introduces "
" undefined Kconfig symbols " )
parser . add_argument ( ' -d ' , ' --diff ' , dest = ' diff ' , action = ' store ' ,
default = " " ,
help = " diff undefined symbols between two commits "
" (e.g., -d commmit1..commit2) " )
parser . add_argument ( ' -f ' , ' --find ' , dest = ' find ' , action = ' store_true ' ,
default = False ,
help = " find and show commits that may cause symbols to be "
" missing (required to run with --diff) " )
parser . add_argument ( ' -i ' , ' --ignore ' , dest = ' ignore ' , action = ' store ' ,
default = " " ,
help = " ignore files matching this Python regex "
" (e.g., -i ' .*defconfig ' ) " )
parser . add_argument ( ' -s ' , ' --sim ' , dest = ' sim ' , action = ' store ' , default = " " ,
help = " print a list of max. 10 string-similar symbols " )
parser . add_argument ( ' --force ' , dest = ' force ' , action = ' store_true ' ,
default = False ,
help = " reset current Git tree even when it ' s dirty " )
parser . add_argument ( ' --no-color ' , dest = ' color ' , action = ' store_false ' ,
default = True ,
help = " don ' t print colored output (default when not "
" outputting to a terminal) " )
args = parser . parse_args ( )
if args . commit and args . diff :
2015-03-16 14:16:14 +03:00
sys . exit ( " Please specify only one option at once. " )
2016-10-27 15:34:57 +03:00
if args . diff and not re . match ( r " ^[ \ w \ - \ . \ ^]+ \ . \ .[ \ w \ - \ . \ ^]+$ " , args . diff ) :
2015-03-16 14:16:14 +03:00
sys . exit ( " Please specify valid input in the following format: "
2016-03-31 10:24:29 +03:00
" \' commit1..commit2 \' " )
2015-03-16 14:16:14 +03:00
2016-08-28 09:51:29 +03:00
if args . commit or args . diff :
if not args . force and tree_is_dirty ( ) :
2015-03-16 14:16:14 +03:00
sys . exit ( " The current Git tree is dirty (see ' git status ' ). "
" Running this script may \n delete important data since it "
" calls ' git reset --hard ' for some performance \n reasons. "
" Please run this script in a clean Git tree or pass "
" ' --force ' if you \n want to ignore this warning and "
" continue. " )
2016-08-28 09:51:29 +03:00
if args . commit :
2021-09-01 17:52:12 +03:00
if args . commit . startswith ( ' HEAD ' ) :
sys . exit ( " The --commit option can ' t use the HEAD ref " )
2016-08-28 09:51:29 +03:00
args . find = False
2015-06-01 17:00:19 +03:00
2016-08-28 09:51:29 +03:00
if args . ignore :
2015-04-29 17:58:27 +03:00
try :
2016-08-28 09:51:29 +03:00
re . match ( args . ignore , " this/is/just/a/test.c " )
2015-04-29 17:58:27 +03:00
except :
sys . exit ( " Please specify a valid Python regex. " )
2016-08-28 09:51:29 +03:00
return args
2015-03-16 14:16:14 +03:00
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
def main ( ) :
""" Main function of this module. """
2016-08-28 09:51:29 +03:00
args = parse_options ( )
2015-03-16 14:16:14 +03:00
2016-08-28 09:51:30 +03:00
global COLOR
COLOR = args . color and sys . stdout . isatty ( )
2016-07-05 10:47:37 +03:00
2016-08-28 09:51:29 +03:00
if args . sim and not args . commit and not args . diff :
sims = find_sims ( args . sim , args . ignore )
2015-11-26 16:17:15 +03:00
if sims :
2016-08-28 09:51:28 +03:00
print ( " %s : %s " % ( yel ( " Similar symbols " ) , ' , ' . join ( sims ) ) )
2015-11-26 16:17:15 +03:00
else :
2016-08-28 09:51:28 +03:00
print ( " %s : no similar symbols found " % yel ( " Similar symbols " ) )
2015-11-26 16:17:15 +03:00
sys . exit ( 0 )
# dictionary of (un)defined symbols
defined = { }
undefined = { }
2016-08-28 09:51:29 +03:00
if args . commit or args . diff :
2015-03-16 14:16:14 +03:00
head = get_head ( )
# get commit range
commit_a = None
commit_b = None
2016-08-28 09:51:29 +03:00
if args . commit :
commit_a = args . commit + " ~ "
commit_b = args . commit
elif args . diff :
split = args . diff . split ( " .. " )
2015-03-16 14:16:14 +03:00
commit_a = split [ 0 ]
commit_b = split [ 1 ]
undefined_a = { }
undefined_b = { }
# get undefined items before the commit
2016-08-28 09:51:32 +03:00
reset ( commit_a )
2016-08-28 09:51:29 +03:00
undefined_a , _ = check_symbols ( args . ignore )
2015-03-16 14:16:14 +03:00
# get undefined items for the commit
2016-08-28 09:51:32 +03:00
reset ( commit_b )
2016-08-28 09:51:29 +03:00
undefined_b , defined = check_symbols ( args . ignore )
2015-03-16 14:16:14 +03:00
# report cases that are present for the commit but not before
2016-08-28 09:51:31 +03:00
for symbol in sorted ( undefined_b ) :
# symbol has not been undefined before
if symbol not in undefined_a :
files = sorted ( undefined_b . get ( symbol ) )
undefined [ symbol ] = files
# check if there are new files that reference the undefined symbol
2015-03-16 14:16:14 +03:00
else :
2016-08-28 09:51:31 +03:00
files = sorted ( undefined_b . get ( symbol ) -
undefined_a . get ( symbol ) )
2015-03-16 14:16:14 +03:00
if files :
2016-08-28 09:51:31 +03:00
undefined [ symbol ] = files
2015-03-16 14:16:14 +03:00
# reset to head
2016-08-28 09:51:32 +03:00
reset ( head )
2015-03-16 14:16:14 +03:00
# default to check the entire tree
else :
2016-08-28 09:51:29 +03:00
undefined , defined = check_symbols ( args . ignore )
2015-11-26 16:17:15 +03:00
# now print the output
2016-08-28 09:51:31 +03:00
for symbol in sorted ( undefined ) :
print ( red ( symbol ) )
2015-11-26 16:17:15 +03:00
2016-08-28 09:51:31 +03:00
files = sorted ( undefined . get ( symbol ) )
2016-08-28 09:51:28 +03:00
print ( " %s : %s " % ( yel ( " Referencing files " ) , " , " . join ( files ) ) )
2015-11-26 16:17:15 +03:00
2016-08-28 09:51:31 +03:00
sims = find_sims ( symbol , args . ignore , defined )
2015-11-26 16:17:15 +03:00
sims_out = yel ( " Similar symbols " )
if sims :
2016-08-28 09:51:28 +03:00
print ( " %s : %s " % ( sims_out , ' , ' . join ( sims ) ) )
2015-11-26 16:17:15 +03:00
else :
2016-08-28 09:51:28 +03:00
print ( " %s : %s " % ( sims_out , " no similar symbols found " ) )
2015-11-26 16:17:15 +03:00
2016-08-28 09:51:29 +03:00
if args . find :
2016-08-28 09:51:28 +03:00
print ( " %s : " % yel ( " Commits changing symbol " ) )
2016-08-28 09:51:31 +03:00
commits = find_commits ( symbol , args . diff )
2015-11-26 16:17:15 +03:00
if commits :
for commit in commits :
commit = commit . split ( " " , 1 )
2016-08-28 09:51:28 +03:00
print ( " \t - %s ( \" %s \" ) " % ( yel ( commit [ 0 ] ) , commit [ 1 ] ) )
2015-11-26 16:17:15 +03:00
else :
2016-08-28 09:51:28 +03:00
print ( " \t - no commit found " )
2016-08-28 09:51:30 +03:00
print ( ) # new line
2015-06-01 17:00:20 +03:00
2016-08-28 09:51:32 +03:00
def reset ( commit ) :
""" Reset current git tree to %c ommit. """
execute ( [ " git " , " reset " , " --hard " , commit ] )
2015-06-01 17:00:20 +03:00
def yel ( string ) :
"""
Color % string yellow .
"""
2016-08-28 09:51:30 +03:00
return " \033 [33m %s \033 [0m " % string if COLOR else string
2015-06-01 17:00:20 +03:00
def red ( string ) :
"""
Color % string red .
"""
2016-08-28 09:51:30 +03:00
return " \033 [31m %s \033 [0m " % string if COLOR else string
2015-03-16 14:16:14 +03:00
def execute ( cmd ) :
""" Execute %c md and return stdout. Exit in case of error. """
2016-08-27 11:59:07 +03:00
try :
2016-08-28 09:51:32 +03:00
stdout = subprocess . check_output ( cmd , stderr = subprocess . STDOUT , shell = False )
2016-08-28 09:51:28 +03:00
stdout = stdout . decode ( errors = ' replace ' )
2016-08-27 11:59:07 +03:00
except subprocess . CalledProcessError as fail :
2016-08-28 09:51:32 +03:00
exit ( fail )
2015-03-16 14:16:14 +03:00
return stdout
2015-06-01 17:00:19 +03:00
def find_commits ( symbol , diff ) :
""" Find commits changing %s ymbol in the given range of %d iff. """
2016-08-28 09:51:32 +03:00
commits = execute ( [ " git " , " log " , " --pretty=oneline " ,
" --abbrev-commit " , " -G " ,
symbol , diff ] )
2015-11-26 16:17:15 +03:00
return [ x for x in commits . split ( " \n " ) if x ]
2015-06-01 17:00:19 +03:00
2015-03-16 14:16:14 +03:00
def tree_is_dirty ( ) :
""" Return true if the current working tree is dirty (i.e., if any file has
been added , deleted , modified , renamed or copied but not committed ) . """
2016-08-28 09:51:32 +03:00
stdout = execute ( [ " git " , " status " , " --porcelain " ] )
2015-03-16 14:16:14 +03:00
for line in stdout :
if re . findall ( r " [URMADC] {1} " , line [ : 2 ] ) :
return True
return False
def get_head ( ) :
""" Return commit hash of current HEAD. """
2016-08-28 09:51:32 +03:00
stdout = execute ( [ " git " , " rev-parse " , " HEAD " ] )
2015-03-16 14:16:14 +03:00
return stdout . strip ( ' \n ' )
2015-10-15 11:37:47 +03:00
def partition ( lst , size ) :
""" Partition list @lst into eveni-sized lists of size @size. """
2016-08-28 09:51:28 +03:00
return [ lst [ i : : size ] for i in range ( size ) ]
2015-10-15 11:37:47 +03:00
def init_worker ( ) :
""" Set signal handler to ignore SIGINT. """
signal . signal ( signal . SIGINT , signal . SIG_IGN )
2016-08-28 09:51:30 +03:00
def find_sims ( symbol , ignore , defined = [ ] ) :
2015-11-26 16:17:15 +03:00
""" Return a list of max. ten Kconfig symbols that are string-similar to
@symbol . """
if defined :
2017-01-18 15:08:19 +03:00
return difflib . get_close_matches ( symbol , set ( defined ) , 10 )
2015-11-26 16:17:15 +03:00
pool = Pool ( cpu_count ( ) , init_worker )
kfiles = [ ]
for gitfile in get_files ( ) :
if REGEX_FILE_KCONFIG . match ( gitfile ) :
kfiles . append ( gitfile )
arglist = [ ]
for part in partition ( kfiles , cpu_count ( ) ) :
arglist . append ( ( part , ignore ) )
for res in pool . map ( parse_kconfig_files , arglist ) :
defined . extend ( res [ 0 ] )
2017-01-18 15:08:19 +03:00
return difflib . get_close_matches ( symbol , set ( defined ) , 10 )
2015-11-26 16:17:15 +03:00
def get_files ( ) :
""" Return a list of all files in the current git directory. """
# use 'git ls-files' to get the worklist
2016-08-28 09:51:32 +03:00
stdout = execute ( [ " git " , " ls-files " ] )
2015-11-26 16:17:15 +03:00
if len ( stdout ) > 0 and stdout [ - 1 ] == " \n " :
stdout = stdout [ : - 1 ]
files = [ ]
for gitfile in stdout . rsplit ( " \n " ) :
if " .git " in gitfile or " ChangeLog " in gitfile or \
" .log " in gitfile or os . path . isdir ( gitfile ) or \
gitfile . startswith ( " tools/ " ) :
continue
files . append ( gitfile )
return files
2015-04-29 17:58:27 +03:00
def check_symbols ( ignore ) :
2015-03-16 14:16:14 +03:00
""" Find undefined Kconfig symbols and return a dict with the symbol as key
2015-04-29 17:58:27 +03:00
and a list of referencing files as value . Files matching % ignore are not
checked for undefined symbols . """
2015-10-15 11:37:47 +03:00
pool = Pool ( cpu_count ( ) , init_worker )
try :
return check_symbols_helper ( pool , ignore )
except KeyboardInterrupt :
pool . terminate ( )
pool . join ( )
sys . exit ( 1 )
def check_symbols_helper ( pool , ignore ) :
""" Helper method for check_symbols(). Used to catch keyboard interrupts in
check_symbols ( ) in order to properly terminate running worker processes . """
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
source_files = [ ]
kconfig_files = [ ]
2016-08-28 09:51:31 +03:00
defined_symbols = [ ]
referenced_symbols = dict ( ) # {file: [symbols]}
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2015-11-26 16:17:15 +03:00
for gitfile in get_files ( ) :
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
if REGEX_FILE_KCONFIG . match ( gitfile ) :
kconfig_files . append ( gitfile )
else :
2021-08-22 22:22:01 +03:00
if ignore and re . match ( ignore , gitfile ) :
2015-10-15 11:37:47 +03:00
continue
# add source files that do not match the ignore pattern
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
source_files . append ( gitfile )
2015-10-15 11:37:47 +03:00
# parse source files
arglist = partition ( source_files , cpu_count ( ) )
for res in pool . map ( parse_source_files , arglist ) :
2016-08-28 09:51:31 +03:00
referenced_symbols . update ( res )
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2015-10-15 11:37:47 +03:00
# parse kconfig files
arglist = [ ]
for part in partition ( kconfig_files , cpu_count ( ) ) :
arglist . append ( ( part , ignore ) )
for res in pool . map ( parse_kconfig_files , arglist ) :
2016-08-28 09:51:31 +03:00
defined_symbols . extend ( res [ 0 ] )
referenced_symbols . update ( res [ 1 ] )
defined_symbols = set ( defined_symbols )
2015-10-15 11:37:47 +03:00
2016-08-28 09:51:31 +03:00
# inverse mapping of referenced_symbols to dict(symbol: [files])
2015-10-15 11:37:47 +03:00
inv_map = dict ( )
2016-08-28 09:51:31 +03:00
for _file , symbols in referenced_symbols . items ( ) :
for symbol in symbols :
inv_map [ symbol ] = inv_map . get ( symbol , set ( ) )
inv_map [ symbol ] . add ( _file )
referenced_symbols = inv_map
undefined = { } # {symbol: [files]}
for symbol in sorted ( referenced_symbols ) :
2014-11-08 22:56:35 +03:00
# filter some false positives
2016-08-28 09:51:31 +03:00
if symbol == " FOO " or symbol == " BAR " or \
symbol == " FOO_BAR " or symbol == " XXX " :
2014-11-08 22:56:35 +03:00
continue
2016-08-28 09:51:31 +03:00
if symbol not in defined_symbols :
if symbol . endswith ( " _MODULE " ) :
2014-11-08 22:56:35 +03:00
# avoid false positives for kernel modules
2016-08-28 09:51:31 +03:00
if symbol [ : - len ( " _MODULE " ) ] in defined_symbols :
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
continue
2016-08-28 09:51:31 +03:00
undefined [ symbol ] = referenced_symbols . get ( symbol )
return undefined , defined_symbols
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2015-10-15 11:37:47 +03:00
def parse_source_files ( source_files ) :
""" Parse each source file in @source_files and return dictionary with source
files as keys and lists of references Kconfig symbols as values . """
2016-08-28 09:51:31 +03:00
referenced_symbols = dict ( )
2015-10-15 11:37:47 +03:00
for sfile in source_files :
2016-08-28 09:51:31 +03:00
referenced_symbols [ sfile ] = parse_source_file ( sfile )
return referenced_symbols
2015-10-15 11:37:47 +03:00
def parse_source_file ( sfile ) :
2016-08-28 09:51:31 +03:00
""" Parse @sfile and return a list of referenced Kconfig symbols. """
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
lines = [ ]
2015-10-15 11:37:47 +03:00
references = [ ]
if not os . path . exists ( sfile ) :
return references
2016-08-28 09:51:28 +03:00
with open ( sfile , " r " , encoding = ' utf-8 ' , errors = ' replace ' ) as stream :
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
lines = stream . readlines ( )
for line in lines :
2016-08-28 09:51:30 +03:00
if " CONFIG_ " not in line :
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
continue
2016-08-28 09:51:31 +03:00
symbols = REGEX_SOURCE_SYMBOL . findall ( line )
for symbol in symbols :
if not REGEX_FILTER_SYMBOLS . search ( symbol ) :
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
continue
2016-08-28 09:51:31 +03:00
references . append ( symbol )
2015-10-15 11:37:47 +03:00
return references
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2016-08-28 09:51:31 +03:00
def get_symbols_in_line ( line ) :
""" Return mentioned Kconfig symbols in @line. """
return REGEX_SYMBOL . findall ( line )
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2015-10-15 11:37:47 +03:00
def parse_kconfig_files ( args ) :
""" Parse kconfig files and return tuple of defined and references Kconfig
symbols . Note , @args is a tuple of a list of files and the @ignore
pattern . """
kconfig_files = args [ 0 ]
ignore = args [ 1 ]
2016-08-28 09:51:31 +03:00
defined_symbols = [ ]
referenced_symbols = dict ( )
2015-10-15 11:37:47 +03:00
for kfile in kconfig_files :
defined , references = parse_kconfig_file ( kfile )
2016-08-28 09:51:31 +03:00
defined_symbols . extend ( defined )
2015-10-15 11:37:47 +03:00
if ignore and re . match ( ignore , kfile ) :
# do not collect references for files that match the ignore pattern
continue
2016-08-28 09:51:31 +03:00
referenced_symbols [ kfile ] = references
return ( defined_symbols , referenced_symbols )
2015-10-15 11:37:47 +03:00
def parse_kconfig_file ( kfile ) :
2016-08-28 09:51:31 +03:00
""" Parse @kfile and update symbol definitions and references. """
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
lines = [ ]
2015-10-15 11:37:47 +03:00
defined = [ ]
references = [ ]
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
2015-10-15 11:37:47 +03:00
if not os . path . exists ( kfile ) :
return defined , references
2016-08-28 09:51:28 +03:00
with open ( kfile , " r " , encoding = ' utf-8 ' , errors = ' replace ' ) as stream :
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
lines = stream . readlines ( )
for i in range ( len ( lines ) ) :
line = lines [ i ]
line = line . strip ( ' \n ' )
2014-11-08 22:56:35 +03:00
line = line . split ( " # " ) [ 0 ] # ignore comments
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
if REGEX_KCONFIG_DEF . match ( line ) :
2016-08-28 09:51:31 +03:00
symbol_def = REGEX_KCONFIG_DEF . findall ( line )
defined . append ( symbol_def [ 0 ] )
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
elif REGEX_KCONFIG_STMT . match ( line ) :
2015-10-15 11:37:47 +03:00
line = REGEX_QUOTES . sub ( " " , line )
2016-08-28 09:51:31 +03:00
symbols = get_symbols_in_line ( line )
2014-11-08 22:56:35 +03:00
# multi-line statements
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
while line . endswith ( " \\ " ) :
i + = 1
line = lines [ i ]
line = line . strip ( ' \n ' )
2016-08-28 09:51:31 +03:00
symbols . extend ( get_symbols_in_line ( line ) )
for symbol in set ( symbols ) :
if REGEX_NUMERIC . match ( symbol ) :
2015-07-27 13:33:05 +03:00
# ignore numeric values
continue
2016-08-28 09:51:31 +03:00
references . append ( symbol )
2015-10-15 11:37:47 +03:00
return defined , references
checkkconfigsymbols.sh: reimplementation in python
The scripts/checkkconfigsymbols.sh script searches Kconfig features
in the source code that are not defined in Kconfig. Such identifiers
always evaluate to false and are the source of various kinds of bugs.
However, the shell script is slow and it does not detect such broken
references in Kbuild and Kconfig files (e.g., ``depends on UNDEFINED´´).
Furthermore, it generates false positives. The script is also hard to
read and understand, and is thereby difficult to maintain.
This patch replaces the shell script with an implementation in Python,
which:
(a) detects the same bugs, but does not report previous false positives
(b) additionally detects broken references in Kconfig and all
non-Kconfig files, such as Kbuild, .[cSh], .txt, .sh, defconfig, etc.
(c) is up to 75 times faster than the shell script
(d) only checks files under version control
The new script reduces the runtime on my machine (i7-2620M, 8GB RAM, SSD)
from 3m47s to 0m3s, and reports 938 broken references in Linux v3.17-rc1;
419 additional reports of which 16 are located in Kconfig files,
287 in defconfigs, 63 in ./Documentation, 1 in Kbuild.
Moreover, we intentionally include references in comments, which have been
ignored until now. Such comments may be leftovers of features that have
been removed or renamed in Kconfig (e.g., ``#endif /* CONFIG_MPC52xx */´´).
These references can be misleading and should be removed or replaced.
Note that the output format changed from (file list <tab> feature) to
(feature <tab> file list) as it simplifies the detection of the Kconfig
feature for long file lists.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
Signed-off-by: Stefan Hengelein <stefan.hengelein@fau.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-09-27 18:30:45 +04:00
if __name__ == " __main__ " :
main ( )