Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild

Pull misc non-critical kbuild changes from Michal Marek:

 - Fix for make TAGS

 - Fix for make rpm

 - Some new coccinelle semantic patches

* 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  scripts/coccinelle: find constant additions that could be bit ors
  coccicheck: Allow to show the executed command line
  coccicheck: Allow the user to give a V= (verbose) argument
  scripts/coccinelle/misc/memcpy-assign.cocci: Replace memcpy with struct assignment
  kbuild: clear KBUILD_SRC when calling 'make' in RPM spec
  scripts/coccinelle/misc/semicolon.cocci: Add unneeded semicolon test
  scripts/tags.sh: Fix regex syntax for etags
This commit is contained in:
Linus Torvalds 2013-02-27 12:27:18 -08:00
commit ad60a93330
7 changed files with 302 additions and 34 deletions

View File

@ -87,6 +87,10 @@ As any static code analyzer, Coccinelle produces false
positives. Thus, reports must be carefully checked, and patches positives. Thus, reports must be carefully checked, and patches
reviewed. reviewed.
To enable verbose messages set the V= variable, for example:
make coccicheck MODE=report V=1
Using Coccinelle with a single semantic patch Using Coccinelle with a single semantic patch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -2,6 +2,15 @@
SPATCH="`which ${SPATCH:=spatch}`" SPATCH="`which ${SPATCH:=spatch}`"
# The verbosity may be set by the environmental parameter V=
# as for example with 'make V=1 coccicheck'
if [ -n "$V" -a "$V" != "0" ]; then
VERBOSE=1
else
VERBOSE=0
fi
if [ "$C" = "1" -o "$C" = "2" ]; then if [ "$C" = "1" -o "$C" = "2" ]; then
ONLINE=1 ONLINE=1
@ -46,6 +55,14 @@ if [ "$ONLINE" = "0" ] ; then
echo '' echo ''
fi fi
run_cmd() {
if [ $VERBOSE -ne 0 ] ; then
echo "Running: $@"
fi
eval $@
}
coccinelle () { coccinelle () {
COCCI="$1" COCCI="$1"
@ -55,7 +72,7 @@ coccinelle () {
# #
# $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null # $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null
if [ "$ONLINE" = "0" ] ; then if [ $VERBOSE -ne 0 ] ; then
FILE=`echo $COCCI | sed "s|$srctree/||"` FILE=`echo $COCCI | sed "s|$srctree/||"`
@ -91,15 +108,21 @@ coccinelle () {
fi fi
if [ "$MODE" = "chain" ] ; then if [ "$MODE" = "chain" ] ; then
$SPATCH -D patch $FLAGS -sp_file $COCCI $OPT $OPTIONS || \ run_cmd $SPATCH -D patch \
$SPATCH -D report $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || \ $FLAGS -sp_file $COCCI $OPT $OPTIONS || \
$SPATCH -D context $FLAGS -sp_file $COCCI $OPT $OPTIONS || \ run_cmd $SPATCH -D report \
$SPATCH -D org $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || exit 1 $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || \
run_cmd $SPATCH -D context \
$FLAGS -sp_file $COCCI $OPT $OPTIONS || \
run_cmd $SPATCH -D org \
$FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || exit 1
elif [ "$MODE" = "rep+ctxt" ] ; then elif [ "$MODE" = "rep+ctxt" ] ; then
$SPATCH -D report $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff && \ run_cmd $SPATCH -D report \
$SPATCH -D context $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1 $FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff && \
run_cmd $SPATCH -D context \
$FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
else else
$SPATCH -D $MODE $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1 run_cmd $SPATCH -D $MODE $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
fi fi
} }

View File

@ -0,0 +1,103 @@
//
// Replace memcpy with struct assignment.
//
// Confidence: High
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: --no-includes --include-headers
virtual patch
virtual report
virtual context
virtual org
@r1 depends on !patch@
identifier struct_name;
struct struct_name to;
struct struct_name from;
struct struct_name *top;
struct struct_name *fromp;
position p;
@@
memcpy@p(\(&(to)\|top\), \(&(from)\|fromp\), \(sizeof(to)\|sizeof(from)\|sizeof(struct struct_name)\|sizeof(*top)\|sizeof(*fromp)\))
@script:python depends on report@
p << r1.p;
@@
coccilib.report.print_report(p[0],"Replace memcpy with struct assignment")
@depends on context@
position r1.p;
@@
*memcpy@p(...);
@script:python depends on org@
p << r1.p;
@@
cocci.print_main("Replace memcpy with struct assignment",p)
@depends on patch@
identifier struct_name;
struct struct_name to;
struct struct_name from;
@@
(
-memcpy(&(to), &(from), sizeof(to));
+to = from;
|
-memcpy(&(to), &(from), sizeof(from));
+to = from;
|
-memcpy(&(to), &(from), sizeof(struct struct_name));
+to = from;
)
@depends on patch@
identifier struct_name;
struct struct_name to;
struct struct_name *from;
@@
(
-memcpy(&(to), from, sizeof(to));
+to = *from;
|
-memcpy(&(to), from, sizeof(*from));
+to = *from;
|
-memcpy(&(to), from, sizeof(struct struct_name));
+to = *from;
)
@depends on patch@
identifier struct_name;
struct struct_name *to;
struct struct_name from;
@@
(
-memcpy(to, &(from), sizeof(*to));
+ *to = from;
|
-memcpy(to, &(from), sizeof(from));
+ *to = from;
|
-memcpy(to, &(from), sizeof(struct struct_name));
+ *to = from;
)
@depends on patch@
identifier struct_name;
struct struct_name *to;
struct struct_name *from;
@@
(
-memcpy(to, from, sizeof(*to));
+ *to = *from;
|
-memcpy(to, from, sizeof(*from));
+ *to = *from;
|
-memcpy(to, from, sizeof(struct struct_name));
+ *to = *from;
)

View File

@ -0,0 +1,55 @@
/// Check for constants that are added but are used elsewhere as bitmasks
/// The results should be checked manually to ensure that the nonzero
/// bits in the two constants are actually disjoint.
///
// Confidence: Moderate
// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6. GPLv2.
// Copyright: (C) 2013 Gilles Muller, INRIA/LIP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers
virtual org
virtual report
virtual context
@r@
constant c;
identifier i;
expression e;
@@
(
e | c@i
|
e & c@i
|
e |= c@i
|
e &= c@i
)
@s@
constant r.c,c1;
identifier i1;
position p;
@@
(
c1 + c - 1
|
*c1@i1 +@p c
)
@script:python depends on org@
p << s.p;
@@
cocci.print_main("sum of probable bitmasks, consider |",p)
@script:python depends on report@
p << s.p;
@@
msg = "WARNING: sum of probable bitmasks, consider |"
coccilib.report.print_report(p[0],msg)

View File

@ -0,0 +1,83 @@
///
/// Removes unneeded semicolon.
///
// Confidence: Moderate
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments: Some false positives on empty default cases in switch statements.
// Options: --no-includes --include-headers
virtual patch
virtual report
virtual context
virtual org
@r_default@
position p;
@@
switch (...)
{
default: ...;@p
}
@r_case@
position p;
@@
(
switch (...)
{
case ...:;@p
}
|
switch (...)
{
case ...:...
case ...:;@p
}
|
switch (...)
{
case ...:...
case ...:
case ...:;@p
}
)
@r1@
statement S;
position p1;
position p != {r_default.p, r_case.p};
identifier label;
@@
(
label:;
|
S@p1;@p
)
@script:python@
p << r1.p;
p1 << r1.p1;
@@
if p[0].line != p1[0].line_end:
cocci.include_match(False)
@depends on patch@
position r1.p;
@@
-;@p
@script:python depends on report@
p << r1.p;
@@
coccilib.report.print_report(p[0],"Unneeded semicolon")
@depends on context@
position r1.p;
@@
*;@p
@script:python depends on org@
p << r1.p;
@@
cocci.print_main("Unneeded semicolon",p)

View File

@ -95,7 +95,7 @@ echo 'cp $KBUILD_IMAGE $RPM_BUILD_ROOT'"/boot/vmlinuz-$KERNELRELEASE"
echo "%endif" echo "%endif"
echo "%endif" echo "%endif"
echo 'make %{?_smp_mflags} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr headers_install' echo 'make %{?_smp_mflags} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr KBUILD_SRC= headers_install'
echo 'cp System.map $RPM_BUILD_ROOT'"/boot/System.map-$KERNELRELEASE" echo 'cp System.map $RPM_BUILD_ROOT'"/boot/System.map-$KERNELRELEASE"
echo 'cp .config $RPM_BUILD_ROOT'"/boot/config-$KERNELRELEASE" echo 'cp .config $RPM_BUILD_ROOT'"/boot/config-$KERNELRELEASE"

View File

@ -217,34 +217,34 @@ exuberant()
emacs() emacs()
{ {
all_target_sources | xargs $1 -a \ all_target_sources | xargs $1 -a \
--regex='/^(ENTRY|_GLOBAL)(\([^)]*\)).*/\2/' \ --regex='/^\(ENTRY\|_GLOBAL\)(\([^)]*\)).*/\2/' \
--regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/' \ --regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/' \
--regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/' \ --regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/' \
--regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1/' \ --regex='/^DEFINE_EVENT([^,)]*, *\([^,)]*\).*/trace_\1/' \
--regex='/PAGEFLAG\(([^,)]*).*/Page\1/' \ --regex='/PAGEFLAG(\([^,)]*\).*/Page\1/' \
--regex='/PAGEFLAG\(([^,)]*).*/SetPage\1/' \ --regex='/PAGEFLAG(\([^,)]*\).*/SetPage\1/' \
--regex='/PAGEFLAG\(([^,)]*).*/ClearPage\1/' \ --regex='/PAGEFLAG(\([^,)]*\).*/ClearPage\1/' \
--regex='/TESTSETFLAG\(([^,)]*).*/TestSetPage\1/' \ --regex='/TESTSETFLAG(\([^,)]*\).*/TestSetPage\1/' \
--regex='/TESTPAGEFLAG\(([^,)]*).*/Page\1/' \ --regex='/TESTPAGEFLAG(\([^,)]*\).*/Page\1/' \
--regex='/SETPAGEFLAG\(([^,)]*).*/SetPage\1/' \ --regex='/SETPAGEFLAG(\([^,)]*\).*/SetPage\1/' \
--regex='/__SETPAGEFLAG\(([^,)]*).*/__SetPage\1/' \ --regex='/__SETPAGEFLAG(\([^,)]*\).*/__SetPage\1/' \
--regex='/TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/' \ --regex='/TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/' \
--regex='/__TESTCLEARFLAG\(([^,)]*).*/TestClearPage\1/' \ --regex='/__TESTCLEARFLAG(\([^,)]*\).*/TestClearPage\1/' \
--regex='/CLEARPAGEFLAG\(([^,)]*).*/ClearPage\1/' \ --regex='/CLEARPAGEFLAG(\([^,)]*\).*/ClearPage\1/' \
--regex='/__CLEARPAGEFLAG\(([^,)]*).*/__ClearPage\1/' \ --regex='/__CLEARPAGEFLAG(\([^,)]*\).*/__ClearPage\1/' \
--regex='/__PAGEFLAG\(([^,)]*).*/__SetPage\1/' \ --regex='/__PAGEFLAG(\([^,)]*\).*/__SetPage\1/' \
--regex='/__PAGEFLAG\(([^,)]*).*/__ClearPage\1/' \ --regex='/__PAGEFLAG(\([^,)]*\).*/__ClearPage\1/' \
--regex='/PAGEFLAG_FALSE\(([^,)]*).*/Page\1/' \ --regex='/PAGEFLAG_FALSE(\([^,)]*\).*/Page\1/' \
--regex='/TESTSCFLAG\(([^,)]*).*/TestSetPage\1/' \ --regex='/TESTSCFLAG(\([^,)]*\).*/TestSetPage\1/' \
--regex='/TESTSCFLAG\(([^,)]*).*/TestClearPage\1/' \ --regex='/TESTSCFLAG(\([^,)]*\).*/TestClearPage\1/' \
--regex='/SETPAGEFLAG_NOOP\(([^,)]*).*/SetPage\1/' \ --regex='/SETPAGEFLAG_NOOP(\([^,)]*\).*/SetPage\1/' \
--regex='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/' \ --regex='/CLEARPAGEFLAG_NOOP(\([^,)]*\).*/ClearPage\1/' \
--regex='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/' \ --regex='/__CLEARPAGEFLAG_NOOP(\([^,)]*\).*/__ClearPage\1/' \
--regex='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \ --regex='/TESTCLEARFLAG_FALSE(\([^,)]*\).*/TestClearPage\1/' \
--regex='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \ --regex='/__TESTCLEARFLAG_FALSE(\([^,)]*\).*/__TestClearPage\1/' \
--regex='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/' \ --regex='/_PE(\([^,)]*\).*/PEVENT_ERRNO__\1/' \
--regex='/PCI_OP_READ\(([a-z]*[a-z]).*[1-4]\)/pci_bus_read_config_\1/' \ --regex='/PCI_OP_READ(\([a-z]*[a-z]\).*[1-4])/pci_bus_read_config_\1/' \
--regex='/PCI_OP_WRITE\(([a-z]*[a-z]).*[1-4]\)/pci_bus_write_config_\1/' --regex='/PCI_OP_WRITE(\([a-z]*[a-z]\).*[1-4])/pci_bus_write_config_\1/'
all_kconfigs | xargs $1 -a \ all_kconfigs | xargs $1 -a \
--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/' --regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'