summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xutil/lint/kconfig_lint55
-rw-r--r--util/lint/kconfig_lint_README22
2 files changed, 39 insertions, 38 deletions
diff --git a/util/lint/kconfig_lint b/util/lint/kconfig_lint
index 6cf05a4b63..4d0a755efb 100755
--- a/util/lint/kconfig_lint
+++ b/util/lint/kconfig_lint
@@ -199,35 +199,16 @@ sub check_for_ifdef {
my $symbol = $3;
if ( ( exists $symbols{$symbol} ) && ( $symbols{$symbol}{type} ne "string" ) ) {
- show_warning( "#ifdef 'CONFIG_$symbol' used at $file:$lineno."
+ show_error( "#ifdef 'CONFIG_$symbol' used at $file:$lineno."
. " Symbols of type '$symbols{$symbol}{type}' are always defined." );
}
- } elsif ( $line =~ /^([^:]+):(\d+):\s*#\s*if\s+!?\s*defined\s*\(?\s*CONFIG(?:_|\()(\w+)/ ) {
+ } elsif ( $line =~ /^([^:]+):(\d+):.+defined\s*\(?\s*CONFIG(?:_|\()(\w+)/ ) {
my $file = $1;
my $lineno = $2;
my $symbol = $3;
if ( ( exists $symbols{$symbol} ) && ( $symbols{$symbol}{type} ne "string" ) ) {
- show_warning( "#ifdef 'CONFIG_$symbol' used at $file:$lineno."
- . " Symbols of type '$symbols{$symbol}{type}' are always defined." );
- }
- }
- }
-
- # look for (#if) defined SYMBOL
- @ifdef_symbols = @collected_symbols;
- while ( my $line = shift @ifdef_symbols ) {
- if ( $line =~ /^([^:]+):(\d+):.+defined\s*\(\s*CONFIG(?:_|\()(\w+)/ ) {
- my $file = $1;
- my $lineno = $2;
- my $symbol = $3;
-
- #ignore '#if defined(symbol) && symbol' type statements
- next
- if ( $line =~ /^([^:]+):(\d+):.+defined\s*\(\s*CONFIG_$symbol.*(&&|\|\|)\s*!?\s*\(?\s*CONFIG_$symbol/ );
-
- if ( ( exists $symbols{$symbol} ) && ( $symbols{$symbol}{type} ne "string" ) ) {
- show_warning( "defined 'CONFIG_$symbol' used at $file:$lineno."
+ show_error( "defined(CONFIG_$symbol) used at $file:$lineno."
. " Symbols of type '$symbols{$symbol}{type}' are always defined." );
}
}
@@ -272,10 +253,10 @@ sub check_for_def {
my $symbol = $3;
if ( ( exists $symbols{$symbol} ) ) {
- show_warning("#define of symbol 'CONFIG_$symbol' used at $file:$lineno.");
+ show_error("#define of symbol 'CONFIG_$symbol' used at $file:$lineno.");
}
else {
- show_warning( "#define 'CONFIG_$symbol' used at $file:$lineno."
+ show_error( "#define 'CONFIG_$symbol' used at $file:$lineno."
. " Other #defines should not look like Kconfig symbols." );
}
}
@@ -383,6 +364,24 @@ sub check_is_enabled {
. " CONFIG($symbol) should be used for type 'bool'" );
}
}
+ } elsif ( $line =~ /^([^:]+):(\d+):(.+\bCONFIG_.+)/ ) {
+ my $file = $1;
+ my $lineno = $2;
+ $line = $3;
+ if ( $file =~ /.*\.(c|h|asl|ld)/ ) {
+ while ( $line =~ /(.*)\bCONFIG_(\w+)(.*)/ && $1 !~ /\/\/|\/\*/ ) {
+ my $symbol = $2;
+ $line = $1 . $3;
+ if ( exists $symbols{$symbol} ) {
+ if ( $symbols{$symbol}{type} eq "bool" ) {
+ show_warning( "Naked reference to CONFIG_$symbol used at $file:$lineno."
+ . " A 'bool' Kconfig should always be accessed through CONFIG($symbol)." );
+ }
+ } else {
+ show_warning( "Unknown config option CONFIG_$symbol used at $file:$lineno." );
+ }
+ }
+ }
}
}
}
@@ -437,7 +436,7 @@ sub check_defaults {
}
} elsif ($symbols{$sym}{type} eq "bool") {
if ($symbols{$sym}{$sym_num}{default}{$def_num}{default} =~ /[01YN]/) {
- show_warning("default value ($symbols{$sym}{$sym_num}{default}{$def_num}{default}) for bool symbol $sym uses value other than y/n at $filename:$line_no.");
+ show_error("default value ($symbols{$sym}{$sym_num}{default}{$def_num}{default}) for bool symbol $sym uses value other than y/n at $filename:$line_no.");
} else {
show_error("non bool default value ($symbols{$sym}{$sym_num}{default}{$def_num}{default}) used for bool symbol $sym at $filename:$line_no.");
}
@@ -447,7 +446,7 @@ sub check_defaults {
#if a default is already set, display an error
if ($default_set) {
- show_warning( "Default for '$sym' referenced at $filename:$line_no will never be set"
+ show_error( "Default for '$sym' referenced at $filename:$line_no will never be set"
. " - overridden by default set at $default_filename:$default_line_no" );
}
else {
@@ -1140,7 +1139,7 @@ sub handle_type {
( $type, $expression ) = handle_if_line( $type, $inside_config, $filename, $line_no );
if ( $type =~ /tristate/ ) {
- show_warning("$filename:$line_no - tristate types are not used.");
+ show_error("$filename:$line_no - tristate types are not used.");
}
if ($inside_config) {
@@ -1265,7 +1264,7 @@ sub load_kconfig_file {
#the directory should exist when using a glob
else {
- show_warning("Could not find dir '$dir_prefix'");
+ show_error("Could not find dir '$dir_prefix'");
}
}
diff --git a/util/lint/kconfig_lint_README b/util/lint/kconfig_lint_README
index d20a933340..832f862422 100644
--- a/util/lint/kconfig_lint_README
+++ b/util/lint/kconfig_lint_README
@@ -43,23 +43,20 @@ Notes:
- Show when the range set for a hex or int does not match a previous range
Warnings in Kconfig files:
-- Any 'default' expressions that can never be reached.
- Symbols that are defined but never used.
-- Directories specified in a 'source' keyword do not exist.
- A 'source' keyword loading a Kconfig file that has already been loaded.
- A 'source' keyword loading a Kconfig file that doesn't exist. Note that
globs are excluded from this check.
Warnings in coreboot source files:
-- #define of Kconfig symbol - Symbols should only be defined in Kconfig.
-- #define starting with 'CONFIG_' - these should be reserved for Kconfig
- symbols.
- 'IS_ENABLED()' block that could not be interpreted.
- Kconfig files that are not loaded by a 'source' keyword.
-- '#ifdef' or '#if defined' used on bool, int, or hex - these are always
- defined in coreboot's version of Kconfig.
+- IS_ENABLED() used on a Kconfig (deprecated in favor of CONFIG())
+- Naked use of boolean CONFIG_XXX Kconfig in C that's not wrapped in CONFIG()
Errors in Kconfig files:
+- Any 'default' expressions that can never be reached.
+- Directories specified in a 'source' keyword do not exist.
- Selects do not work on symbols created in a choice block.
- All symbols used in selects or expressions must be defined in a config
statement.
@@ -94,8 +91,13 @@ Errors in Kconfig that are also caught by Kconfig itself:
- Symbols with no defined type.
Errors in coreboot source files:
-- The IS_ENABLED macro is only valid for bool symbols.
-- The IS_ENABLED used on unknown CONFIG_ value, like an obsolete symbol.
-- The IS_ENABLED macro is used on a symbol without the CONFIG_ prefix.
+- #define of Kconfig symbol - Symbols should only be defined in Kconfig.
+- #define starting with 'CONFIG_' - these should be reserved for Kconfig
+ symbols.
+- '#ifdef' or '#if defined' used on bool, int, or hex - these are always
+ defined in coreboot's version of Kconfig.
+- The CONFIG() and IS_ENABLED() macros is only valid for bool symbols.
+- CONFIG() or IS_ENABLED() used on unknown Kconfig, like an obsolete symbol.
+- The IS_ENABLED() macro is used on a symbol without the CONFIG_ prefix.
TODO: check for choice entries at the top level