mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 08:26:59 +00:00
Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6
* 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: scripts/dtc: Fix a resource leak Documentation: fix ubuntu distro name MAINTAINERS: Update kbuild git URLs Add support for the C variable in the coccicheck script Add scripts/coccinelle/deref_null.cocci Add scripts/coccinelle/err_cast.cocci Add scripts/coccinelle/resource_size.cocci Add scripts/coccinelle/alloc/kzalloc-simple.cocci Add scripts/coccinelle/alloc/drop_kmalloc_cast.cocci Add Documentation/coccinelle.txt Add a target to use the Coccinelle checker scripts: decodecode: remove bashisms Makefile: clarify a comment checkkconfigsymbols.sh: Kconfig symbols sometimes have lowercase letters scripts: add nconf into gitignore file
This commit is contained in:
commit
f43100ae39
14 changed files with 960 additions and 12 deletions
258
Documentation/coccinelle.txt
Normal file
258
Documentation/coccinelle.txt
Normal file
|
@ -0,0 +1,258 @@
|
||||||
|
Copyright 2010 Nicolas Palix <npalix@diku.dk>
|
||||||
|
Copyright 2010 Julia Lawall <julia@diku.dk>
|
||||||
|
Copyright 2010 Gilles Muller <Gilles.Muller@lip6.fr>
|
||||||
|
|
||||||
|
|
||||||
|
Getting Coccinelle
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The semantic patches included in the kernel use the 'virtual rule'
|
||||||
|
feature which was introduced in Coccinelle version 0.1.11.
|
||||||
|
|
||||||
|
Coccinelle (>=0.2.0) is available through the package manager
|
||||||
|
of many distributions, e.g. :
|
||||||
|
|
||||||
|
- Debian (>=squeeze)
|
||||||
|
- Fedora (>=13)
|
||||||
|
- Ubuntu (>=10.04 Lucid Lynx)
|
||||||
|
- OpenSUSE
|
||||||
|
- Arch Linux
|
||||||
|
- NetBSD
|
||||||
|
- FreeBSD
|
||||||
|
|
||||||
|
|
||||||
|
You can get the latest version released from the Coccinelle homepage at
|
||||||
|
http://coccinelle.lip6.fr/
|
||||||
|
|
||||||
|
Once you have it, run the following command:
|
||||||
|
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
|
||||||
|
as a regular user, and install it with
|
||||||
|
|
||||||
|
sudo make install
|
||||||
|
|
||||||
|
|
||||||
|
Using Coccinelle on the Linux kernel
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
A Coccinelle-specific target is defined in the top level
|
||||||
|
Makefile. This target is named 'coccicheck' and calls the 'coccicheck'
|
||||||
|
front-end in the 'scripts' directory.
|
||||||
|
|
||||||
|
Four modes are defined: report, patch, context, and org. The mode to
|
||||||
|
use is specified by setting the MODE variable with 'MODE=<mode>'.
|
||||||
|
|
||||||
|
'report' generates a list in the following format:
|
||||||
|
file:line:column-column: message
|
||||||
|
|
||||||
|
'patch' proposes a fix, when possible.
|
||||||
|
|
||||||
|
'context' highlights lines of interest and their context in a
|
||||||
|
diff-like style.Lines of interest are indicated with '-'.
|
||||||
|
|
||||||
|
'org' generates a report in the Org mode format of Emacs.
|
||||||
|
|
||||||
|
Note that not all semantic patches implement all modes.
|
||||||
|
|
||||||
|
To make a report for every semantic patch, run the following command:
|
||||||
|
|
||||||
|
make coccicheck MODE=report
|
||||||
|
|
||||||
|
NB: The 'report' mode is the default one.
|
||||||
|
|
||||||
|
To produce patches, run:
|
||||||
|
|
||||||
|
make coccicheck MODE=patch
|
||||||
|
|
||||||
|
|
||||||
|
The coccicheck target applies every semantic patch available in the
|
||||||
|
subdirectories of 'scripts/coccinelle' to the entire Linux kernel.
|
||||||
|
|
||||||
|
For each semantic patch, a changelog message is proposed. It gives a
|
||||||
|
description of the problem being checked by the semantic patch, and
|
||||||
|
includes a reference to Coccinelle.
|
||||||
|
|
||||||
|
As any static code analyzer, Coccinelle produces false
|
||||||
|
positives. Thus, reports must be carefully checked, and patches
|
||||||
|
reviewed.
|
||||||
|
|
||||||
|
|
||||||
|
Using Coccinelle with a single semantic patch
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The optional make variable COCCI can be used to check a single
|
||||||
|
semantic patch. In that case, the variable must be initialized with
|
||||||
|
the name of the semantic patch to apply.
|
||||||
|
|
||||||
|
For instance:
|
||||||
|
|
||||||
|
make coccicheck COCCI=<my_SP.cocci> MODE=patch
|
||||||
|
or
|
||||||
|
make coccicheck COCCI=<my_SP.cocci> MODE=report
|
||||||
|
|
||||||
|
|
||||||
|
Proposing new semantic patches
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
New semantic patches can be proposed and submitted by kernel
|
||||||
|
developers. For sake of clarity, they should be organized in the
|
||||||
|
subdirectories of 'scripts/coccinelle/'.
|
||||||
|
|
||||||
|
|
||||||
|
Detailed description of the 'report' mode
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
'report' generates a list in the following format:
|
||||||
|
file:line:column-column: message
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Running
|
||||||
|
|
||||||
|
make coccicheck MODE=report COCCI=scripts/coccinelle/err_cast.cocci
|
||||||
|
|
||||||
|
will execute the following part of the SmPL script.
|
||||||
|
|
||||||
|
<smpl>
|
||||||
|
@r depends on !context && !patch && (org || report)@
|
||||||
|
expression x;
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
ERR_PTR@p(PTR_ERR(x))
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << r.p;
|
||||||
|
x << r.x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERR_CAST can be used with %s" % (x)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
||||||
|
</smpl>
|
||||||
|
|
||||||
|
This SmPL excerpt generates entries on the standard output, as
|
||||||
|
illustrated below:
|
||||||
|
|
||||||
|
/home/user/linux/crypto/ctr.c:188:9-16: ERR_CAST can be used with alg
|
||||||
|
/home/user/linux/crypto/authenc.c:619:9-16: ERR_CAST can be used with auth
|
||||||
|
/home/user/linux/crypto/xts.c:227:9-16: ERR_CAST can be used with alg
|
||||||
|
|
||||||
|
|
||||||
|
Detailed description of the 'patch' mode
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
When the 'patch' mode is available, it proposes a fix for each problem
|
||||||
|
identified.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Running
|
||||||
|
make coccicheck MODE=patch COCCI=scripts/coccinelle/err_cast.cocci
|
||||||
|
|
||||||
|
will execute the following part of the SmPL script.
|
||||||
|
|
||||||
|
<smpl>
|
||||||
|
@ depends on !context && patch && !org && !report @
|
||||||
|
expression x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
- ERR_PTR(PTR_ERR(x))
|
||||||
|
+ ERR_CAST(x)
|
||||||
|
</smpl>
|
||||||
|
|
||||||
|
This SmPL excerpt generates patch hunks on the standard output, as
|
||||||
|
illustrated below:
|
||||||
|
|
||||||
|
diff -u -p a/crypto/ctr.c b/crypto/ctr.c
|
||||||
|
--- a/crypto/ctr.c 2010-05-26 10:49:38.000000000 +0200
|
||||||
|
+++ b/crypto/ctr.c 2010-06-03 23:44:49.000000000 +0200
|
||||||
|
@@ -185,7 +185,7 @@ static struct crypto_instance *crypto_ct
|
||||||
|
alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
|
||||||
|
CRYPTO_ALG_TYPE_MASK);
|
||||||
|
if (IS_ERR(alg))
|
||||||
|
- return ERR_PTR(PTR_ERR(alg));
|
||||||
|
+ return ERR_CAST(alg);
|
||||||
|
|
||||||
|
/* Block size must be >= 4 bytes. */
|
||||||
|
err = -EINVAL;
|
||||||
|
|
||||||
|
Detailed description of the 'context' mode
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
'context' highlights lines of interest and their context
|
||||||
|
in a diff-like style.
|
||||||
|
|
||||||
|
NOTE: The diff-like output generated is NOT an applicable patch. The
|
||||||
|
intent of the 'context' mode is to highlight the important lines
|
||||||
|
(annotated with minus, '-') and gives some surrounding context
|
||||||
|
lines around. This output can be used with the diff mode of
|
||||||
|
Emacs to review the code.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Running
|
||||||
|
make coccicheck MODE=context COCCI=scripts/coccinelle/err_cast.cocci
|
||||||
|
|
||||||
|
will execute the following part of the SmPL script.
|
||||||
|
|
||||||
|
<smpl>
|
||||||
|
@ depends on context && !patch && !org && !report@
|
||||||
|
expression x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
* ERR_PTR(PTR_ERR(x))
|
||||||
|
</smpl>
|
||||||
|
|
||||||
|
This SmPL excerpt generates diff hunks on the standard output, as
|
||||||
|
illustrated below:
|
||||||
|
|
||||||
|
diff -u -p /home/user/linux/crypto/ctr.c /tmp/nothing
|
||||||
|
--- /home/user/linux/crypto/ctr.c 2010-05-26 10:49:38.000000000 +0200
|
||||||
|
+++ /tmp/nothing
|
||||||
|
@@ -185,7 +185,6 @@ static struct crypto_instance *crypto_ct
|
||||||
|
alg = crypto_attr_alg(tb[1], CRYPTO_ALG_TYPE_CIPHER,
|
||||||
|
CRYPTO_ALG_TYPE_MASK);
|
||||||
|
if (IS_ERR(alg))
|
||||||
|
- return ERR_PTR(PTR_ERR(alg));
|
||||||
|
|
||||||
|
/* Block size must be >= 4 bytes. */
|
||||||
|
err = -EINVAL;
|
||||||
|
|
||||||
|
Detailed description of the 'org' mode
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
'org' generates a report in the Org mode format of Emacs.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
Running
|
||||||
|
make coccicheck MODE=org COCCI=scripts/coccinelle/err_cast.cocci
|
||||||
|
|
||||||
|
will execute the following part of the SmPL script.
|
||||||
|
|
||||||
|
<smpl>
|
||||||
|
@r depends on !context && !patch && (org || report)@
|
||||||
|
expression x;
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
ERR_PTR@p(PTR_ERR(x))
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << r.p;
|
||||||
|
x << r.x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERR_CAST can be used with %s" % (x)
|
||||||
|
msg_safe=msg.replace("[","@(").replace("]",")")
|
||||||
|
coccilib.org.print_todo(p[0], msg_safe)
|
||||||
|
</smpl>
|
||||||
|
|
||||||
|
This SmPL excerpt generates Org entries on the standard output, as
|
||||||
|
illustrated below:
|
||||||
|
|
||||||
|
* TODO [[view:/home/user/linux/crypto/ctr.c::face=ovl-face1::linb=188::colb=9::cole=16][ERR_CAST can be used with alg]]
|
||||||
|
* TODO [[view:/home/user/linux/crypto/authenc.c::face=ovl-face1::linb=619::colb=9::cole=16][ERR_CAST can be used with auth]]
|
||||||
|
* TODO [[view:/home/user/linux/crypto/xts.c::face=ovl-face1::linb=227::colb=9::cole=16][ERR_CAST can be used with alg]]
|
14
MAINTAINERS
14
MAINTAINERS
|
@ -1569,6 +1569,16 @@ L: platform-driver-x86@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/platform/x86/classmate-laptop.c
|
F: drivers/platform/x86/classmate-laptop.c
|
||||||
|
|
||||||
|
COCCINELLE/Semantic Patches (SmPL)
|
||||||
|
M: Julia Lawall <julia@diku.dk>
|
||||||
|
M: Gilles Muller <Gilles.Muller@lip6.fr>
|
||||||
|
M: Nicolas Palix <npalix@diku.dk>
|
||||||
|
L: cocci@diku.dk (moderated for non-subscribers)
|
||||||
|
W: http://coccinelle.lip6.fr/
|
||||||
|
S: Supported
|
||||||
|
F: scripts/coccinelle/
|
||||||
|
F: scripts/coccicheck
|
||||||
|
|
||||||
CODA FILE SYSTEM
|
CODA FILE SYSTEM
|
||||||
M: Jan Harkes <jaharkes@cs.cmu.edu>
|
M: Jan Harkes <jaharkes@cs.cmu.edu>
|
||||||
M: coda@cs.cmu.edu
|
M: coda@cs.cmu.edu
|
||||||
|
@ -3266,8 +3276,8 @@ F: fs/autofs4/
|
||||||
|
|
||||||
KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
|
KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
|
||||||
M: Michal Marek <mmarek@suse.cz>
|
M: Michal Marek <mmarek@suse.cz>
|
||||||
T: git git://repo.or.cz/linux-kbuild.git for-next
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git for-next
|
||||||
T: git git://repo.or.cz/linux-kbuild.git for-linus
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6.git rc-fixes
|
||||||
L: linux-kbuild@vger.kernel.org
|
L: linux-kbuild@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/kbuild/
|
F: Documentation/kbuild/
|
||||||
|
|
12
Makefile
12
Makefile
|
@ -418,7 +418,7 @@ endif
|
||||||
# of make so .config is not included in this case either (for *config).
|
# of make so .config is not included in this case either (for *config).
|
||||||
|
|
||||||
no-dot-config-targets := clean mrproper distclean \
|
no-dot-config-targets := clean mrproper distclean \
|
||||||
cscope TAGS tags help %docs check% \
|
cscope TAGS tags help %docs check% coccicheck \
|
||||||
include/linux/version.h headers_% \
|
include/linux/version.h headers_% \
|
||||||
kernelversion
|
kernelversion
|
||||||
|
|
||||||
|
@ -532,7 +532,7 @@ endif # $(dot-config)
|
||||||
# The all: target is the default when no target is given on the
|
# The all: target is the default when no target is given on the
|
||||||
# command line.
|
# command line.
|
||||||
# This allow a user to issue only 'make' to build a kernel including modules
|
# This allow a user to issue only 'make' to build a kernel including modules
|
||||||
# Defaults vmlinux but it is usually overridden in the arch makefile
|
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
||||||
all: vmlinux
|
all: vmlinux
|
||||||
|
|
||||||
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||||
|
@ -1219,8 +1219,9 @@ help:
|
||||||
@echo ' includecheck - Check for duplicate included header files'
|
@echo ' includecheck - Check for duplicate included header files'
|
||||||
@echo ' export_report - List the usages of all exported symbols'
|
@echo ' export_report - List the usages of all exported symbols'
|
||||||
@echo ' headers_check - Sanity check on exported headers'
|
@echo ' headers_check - Sanity check on exported headers'
|
||||||
@echo ' headerdep - Detect inclusion cycles in headers'; \
|
@echo ' headerdep - Detect inclusion cycles in headers'
|
||||||
echo ''
|
@$(MAKE) -f $(srctree)/scripts/Makefile.help checker-help
|
||||||
|
@echo ''
|
||||||
@echo 'Kernel packaging:'
|
@echo 'Kernel packaging:'
|
||||||
@$(MAKE) $(build)=$(package-dir) help
|
@$(MAKE) $(build)=$(package-dir) help
|
||||||
@echo ''
|
@echo ''
|
||||||
|
@ -1379,6 +1380,9 @@ versioncheck:
|
||||||
-name '*.[hcS]' -type f -print | sort \
|
-name '*.[hcS]' -type f -print | sort \
|
||||||
| xargs $(PERL) -w $(srctree)/scripts/checkversion.pl
|
| xargs $(PERL) -w $(srctree)/scripts/checkversion.pl
|
||||||
|
|
||||||
|
coccicheck:
|
||||||
|
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/$@
|
||||||
|
|
||||||
namespacecheck:
|
namespacecheck:
|
||||||
$(PERL) $(srctree)/scripts/namespace.pl
|
$(PERL) $(srctree)/scripts/namespace.pl
|
||||||
|
|
||||||
|
|
3
scripts/Makefile.help
Normal file
3
scripts/Makefile.help
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
checker-help:
|
||||||
|
@echo ' coccicheck - Check with Coccinelle.'
|
|
@ -14,7 +14,7 @@ find $paths -name '*.[chS]' -o -name 'Makefile' -o -name 'Makefile*[^~]'| while
|
||||||
do
|
do
|
||||||
# Output the bare Kconfig variable and the filename; the _MODULE part at
|
# Output the bare Kconfig variable and the filename; the _MODULE part at
|
||||||
# the end is not removed here (would need perl an not-hungry regexp for that).
|
# the end is not removed here (would need perl an not-hungry regexp for that).
|
||||||
sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Z_]\+\).*!\2 '$i'!p' < $i
|
sed -ne 's!^.*\<\(UML_\)\?CONFIG_\([0-9A-Za-z_]\+\).*!\2 '$i'!p' < $i
|
||||||
done | \
|
done | \
|
||||||
# Smart "sort|uniq" implemented in awk and tuned to collect the names of all
|
# Smart "sort|uniq" implemented in awk and tuned to collect the names of all
|
||||||
# files which use a given symbol
|
# files which use a given symbol
|
||||||
|
|
80
scripts/coccicheck
Executable file
80
scripts/coccicheck
Executable file
|
@ -0,0 +1,80 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
SPATCH="`which ${SPATCH:=spatch}`"
|
||||||
|
|
||||||
|
if [ "$C" = "1" -o "$C" = "2" ]; then
|
||||||
|
ONLINE=1
|
||||||
|
|
||||||
|
# This requires Coccinelle >= 0.2.3
|
||||||
|
# FLAGS="-ignore_unknown_options -very_quiet"
|
||||||
|
# OPTIONS=$*
|
||||||
|
|
||||||
|
# Workaround for Coccinelle < 0.2.3
|
||||||
|
FLAGS="-I $srctree/include -very_quiet"
|
||||||
|
shift $(( $# - 1 ))
|
||||||
|
OPTIONS=$1
|
||||||
|
else
|
||||||
|
ONLINE=0
|
||||||
|
FLAGS="-very_quiet"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -x "$SPATCH" ]; then
|
||||||
|
echo 'spatch is part of the Coccinelle project and is available at http://coccinelle.lip6.fr/'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$MODE" = "" ] ; then
|
||||||
|
if [ "$ONLINE" = "0" ] ; then
|
||||||
|
echo 'You have not explicitly specify the mode to use. Fallback to "report".'
|
||||||
|
echo 'You can specify the mode with "make coccicheck MODE=<mode>"'
|
||||||
|
echo 'Available modes are: report, patch, context, org'
|
||||||
|
fi
|
||||||
|
MODE="report"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$ONLINE" = "0" ] ; then
|
||||||
|
echo ''
|
||||||
|
echo 'Please check for false positives in the output before submitting a patch.'
|
||||||
|
echo 'When using "patch" mode, carefully review the patch before submitting it.'
|
||||||
|
echo ''
|
||||||
|
fi
|
||||||
|
|
||||||
|
coccinelle () {
|
||||||
|
COCCI="$1"
|
||||||
|
|
||||||
|
OPT=`grep "Option" $COCCI | cut -d':' -f2`
|
||||||
|
|
||||||
|
# The option '-parse_cocci' can be used to syntaxically check the SmPL files.
|
||||||
|
#
|
||||||
|
# $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null
|
||||||
|
|
||||||
|
if [ "$ONLINE" = "0" ] ; then
|
||||||
|
|
||||||
|
FILE=`echo $COCCI | sed "s|$srctree/||"`
|
||||||
|
|
||||||
|
echo "Processing `basename $COCCI` with option(s) \"$OPT\""
|
||||||
|
echo 'Message example to submit a patch:'
|
||||||
|
|
||||||
|
sed -e '/\/\/\//!d' -e 's|^///||' $COCCI
|
||||||
|
|
||||||
|
echo ' The semantic patch that makes this change is available'
|
||||||
|
echo " in $FILE."
|
||||||
|
echo ''
|
||||||
|
echo ' More information about semantic patching is available at'
|
||||||
|
echo ' http://coccinelle.lip6.fr/'
|
||||||
|
echo ''
|
||||||
|
|
||||||
|
$SPATCH -D $MODE $FLAGS -sp_file $COCCI $OPT -dir $srctree || exit 1
|
||||||
|
else
|
||||||
|
$SPATCH -D $MODE $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$COCCI" = "" ] ; then
|
||||||
|
for f in `find $srctree/scripts/coccinelle/ -name '*.cocci' -type f | sort`; do
|
||||||
|
coccinelle $f
|
||||||
|
done
|
||||||
|
else
|
||||||
|
coccinelle $COCCI
|
||||||
|
fi
|
67
scripts/coccinelle/alloc/drop_kmalloc_cast.cocci
Normal file
67
scripts/coccinelle/alloc/drop_kmalloc_cast.cocci
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
///
|
||||||
|
/// Casting (void *) value returned by kmalloc is useless
|
||||||
|
/// as mentioned in Documentation/CodingStyle, Chap 14.
|
||||||
|
///
|
||||||
|
// Confidence: High
|
||||||
|
// Copyright: 2009,2010 Nicolas Palix, DIKU. GPLv2.
|
||||||
|
// URL: http://coccinelle.lip6.fr/
|
||||||
|
// Options: -no_includes -include_headers
|
||||||
|
//
|
||||||
|
// Keywords: kmalloc, kzalloc, kcalloc
|
||||||
|
// Version min: < 2.6.12 kmalloc
|
||||||
|
// Version min: < 2.6.12 kcalloc
|
||||||
|
// Version min: 2.6.14 kzalloc
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual context
|
||||||
|
virtual patch
|
||||||
|
virtual org
|
||||||
|
virtual report
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For context mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@depends on context@
|
||||||
|
type T;
|
||||||
|
@@
|
||||||
|
|
||||||
|
* (T *)
|
||||||
|
\(kmalloc\|kzalloc\|kcalloc\)(...)
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For patch mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@depends on patch@
|
||||||
|
type T;
|
||||||
|
@@
|
||||||
|
|
||||||
|
- (T *)
|
||||||
|
\(kmalloc\|kzalloc\|kcalloc\)(...)
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For org and report mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@r depends on org || report@
|
||||||
|
type T;
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(T@p *)\(kmalloc\|kzalloc\|kcalloc\)(...)
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << r.p;
|
||||||
|
t << r.T;
|
||||||
|
@@
|
||||||
|
|
||||||
|
coccilib.org.print_safe_todo(p[0], t)
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << r.p;
|
||||||
|
t << r.T;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="WARNING: casting value returned by k[cmz]alloc to (%s *) is useless." % (t)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
82
scripts/coccinelle/alloc/kzalloc-simple.cocci
Normal file
82
scripts/coccinelle/alloc/kzalloc-simple.cocci
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
///
|
||||||
|
/// kzalloc should be used rather than kmalloc followed by memset 0
|
||||||
|
///
|
||||||
|
// Confidence: High
|
||||||
|
// Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU. GPLv2.
|
||||||
|
// Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6. GPLv2.
|
||||||
|
// URL: http://coccinelle.lip6.fr/rules/kzalloc.html
|
||||||
|
// Options: -no_includes -include_headers
|
||||||
|
//
|
||||||
|
// Keywords: kmalloc, kzalloc
|
||||||
|
// Version min: < 2.6.12 kmalloc
|
||||||
|
// Version min: 2.6.14 kzalloc
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual context
|
||||||
|
virtual patch
|
||||||
|
virtual org
|
||||||
|
virtual report
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For context mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@depends on context@
|
||||||
|
type T, T2;
|
||||||
|
expression x;
|
||||||
|
expression E1,E2;
|
||||||
|
statement S;
|
||||||
|
@@
|
||||||
|
|
||||||
|
* x = (T)kmalloc(E1,E2);
|
||||||
|
if ((x==NULL) || ...) S
|
||||||
|
* memset((T2)x,0,E1);
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For patch mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@depends on patch@
|
||||||
|
type T, T2;
|
||||||
|
expression x;
|
||||||
|
expression E1,E2;
|
||||||
|
statement S;
|
||||||
|
@@
|
||||||
|
|
||||||
|
- x = (T)kmalloc(E1,E2);
|
||||||
|
+ x = kzalloc(E1,E2);
|
||||||
|
if ((x==NULL) || ...) S
|
||||||
|
- memset((T2)x,0,E1);
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For org mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@r depends on org || report@
|
||||||
|
type T, T2;
|
||||||
|
expression x;
|
||||||
|
expression E1,E2;
|
||||||
|
statement S;
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
x = (T)kmalloc@p(E1,E2);
|
||||||
|
if ((x==NULL) || ...) S
|
||||||
|
memset((T2)x,0,E1);
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << r.p;
|
||||||
|
x << r.x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="%s" % (x)
|
||||||
|
msg_safe=msg.replace("[","@(").replace("]",")")
|
||||||
|
coccilib.org.print_todo(p[0], msg_safe)
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << r.p;
|
||||||
|
x << r.x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="WARNING: kzalloc should be used for %s, instead of kmalloc/memset" % (x)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
293
scripts/coccinelle/deref_null.cocci
Normal file
293
scripts/coccinelle/deref_null.cocci
Normal file
|
@ -0,0 +1,293 @@
|
||||||
|
///
|
||||||
|
/// A variable is dereference under a NULL test.
|
||||||
|
/// Even though it is know to be NULL.
|
||||||
|
///
|
||||||
|
// Confidence: Moderate
|
||||||
|
// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2.
|
||||||
|
// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2.
|
||||||
|
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2.
|
||||||
|
// URL: http://coccinelle.lip6.fr/
|
||||||
|
// Comments: -I ... -all_includes can give more complete results
|
||||||
|
// Options:
|
||||||
|
|
||||||
|
virtual context
|
||||||
|
virtual patch
|
||||||
|
virtual org
|
||||||
|
virtual report
|
||||||
|
|
||||||
|
@initialize:python depends on !context && patch && !org && !report@
|
||||||
|
|
||||||
|
import sys
|
||||||
|
print >> sys.stderr, "This semantic patch does not support the 'patch' mode."
|
||||||
|
|
||||||
|
@depends on patch@
|
||||||
|
@@
|
||||||
|
|
||||||
|
this_rule_should_never_matches();
|
||||||
|
|
||||||
|
@ifm depends on !patch@
|
||||||
|
expression *E;
|
||||||
|
statement S1,S2;
|
||||||
|
position p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
if@p1 ((E == NULL && ...) || ...) S1 else S2
|
||||||
|
|
||||||
|
// The following two rules are separate, because both can match a single
|
||||||
|
// expression in different ways
|
||||||
|
@pr1 depends on !patch expression@
|
||||||
|
expression *ifm.E;
|
||||||
|
identifier f;
|
||||||
|
position p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(E != NULL && ...) ? <+...E->f@p1...+> : ...
|
||||||
|
|
||||||
|
@pr2 depends on !patch expression@
|
||||||
|
expression *ifm.E;
|
||||||
|
identifier f;
|
||||||
|
position p2;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(
|
||||||
|
(E != NULL) && ... && <+...E->f@p2...+>
|
||||||
|
|
|
||||||
|
(E == NULL) || ... || <+...E->f@p2...+>
|
||||||
|
|
|
||||||
|
sizeof(<+...E->f@p2...+>)
|
||||||
|
)
|
||||||
|
|
||||||
|
// For org and report modes
|
||||||
|
|
||||||
|
@r depends on !context && !patch && (org || report) exists@
|
||||||
|
expression subE <= ifm.E;
|
||||||
|
expression *ifm.E;
|
||||||
|
expression E1,E2;
|
||||||
|
identifier f;
|
||||||
|
statement S1,S2,S3,S4;
|
||||||
|
iterator iter;
|
||||||
|
position p!={pr1.p1,pr2.p2};
|
||||||
|
position ifm.p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
if@p1 ((E == NULL && ...) || ...)
|
||||||
|
{
|
||||||
|
... when != if (...) S1 else S2
|
||||||
|
(
|
||||||
|
iter(subE,...) S4 // no use
|
||||||
|
|
|
||||||
|
list_remove_head(E2,subE,...)
|
||||||
|
|
|
||||||
|
subE = E1
|
||||||
|
|
|
||||||
|
for(subE = E1;...;...) S4
|
||||||
|
|
|
||||||
|
subE++
|
||||||
|
|
|
||||||
|
++subE
|
||||||
|
|
|
||||||
|
--subE
|
||||||
|
|
|
||||||
|
subE--
|
||||||
|
|
|
||||||
|
&subE
|
||||||
|
|
|
||||||
|
E->f@p // bad use
|
||||||
|
)
|
||||||
|
... when any
|
||||||
|
return ...;
|
||||||
|
}
|
||||||
|
else S3
|
||||||
|
|
||||||
|
@script:python depends on !context && !patch && !org && report@
|
||||||
|
p << r.p;
|
||||||
|
p1 << ifm.p1;
|
||||||
|
x << ifm.E;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERROR: %s is NULL but dereferenced." % (x)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
||||||
|
cocci.include_match(False)
|
||||||
|
|
||||||
|
@script:python depends on !context && !patch && org && !report@
|
||||||
|
p << r.p;
|
||||||
|
p1 << ifm.p1;
|
||||||
|
x << ifm.E;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERROR: %s is NULL but dereferenced." % (x)
|
||||||
|
msg_safe=msg.replace("[","@(").replace("]",")")
|
||||||
|
cocci.print_main(msg_safe,p)
|
||||||
|
cocci.include_match(False)
|
||||||
|
|
||||||
|
@s depends on !context && !patch && (org || report) exists@
|
||||||
|
expression subE <= ifm.E;
|
||||||
|
expression *ifm.E;
|
||||||
|
expression E1,E2;
|
||||||
|
identifier f;
|
||||||
|
statement S1,S2,S3,S4;
|
||||||
|
iterator iter;
|
||||||
|
position p!={pr1.p1,pr2.p2};
|
||||||
|
position ifm.p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
if@p1 ((E == NULL && ...) || ...)
|
||||||
|
{
|
||||||
|
... when != if (...) S1 else S2
|
||||||
|
(
|
||||||
|
iter(subE,...) S4 // no use
|
||||||
|
|
|
||||||
|
list_remove_head(E2,subE,...)
|
||||||
|
|
|
||||||
|
subE = E1
|
||||||
|
|
|
||||||
|
for(subE = E1;...;...) S4
|
||||||
|
|
|
||||||
|
subE++
|
||||||
|
|
|
||||||
|
++subE
|
||||||
|
|
|
||||||
|
--subE
|
||||||
|
|
|
||||||
|
subE--
|
||||||
|
|
|
||||||
|
&subE
|
||||||
|
|
|
||||||
|
E->f@p // bad use
|
||||||
|
)
|
||||||
|
... when any
|
||||||
|
}
|
||||||
|
else S3
|
||||||
|
|
||||||
|
@script:python depends on !context && !patch && !org && report@
|
||||||
|
p << s.p;
|
||||||
|
p1 << ifm.p1;
|
||||||
|
x << ifm.E;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERROR: %s is NULL but dereferenced." % (x)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
||||||
|
|
||||||
|
@script:python depends on !context && !patch && org && !report@
|
||||||
|
p << s.p;
|
||||||
|
p1 << ifm.p1;
|
||||||
|
x << ifm.E;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERROR: %s is NULL but dereferenced." % (x)
|
||||||
|
msg_safe=msg.replace("[","@(").replace("]",")")
|
||||||
|
cocci.print_main(msg_safe,p)
|
||||||
|
|
||||||
|
// For context mode
|
||||||
|
|
||||||
|
@depends on context && !patch && !org && !report exists@
|
||||||
|
expression subE <= ifm.E;
|
||||||
|
expression *ifm.E;
|
||||||
|
expression E1,E2;
|
||||||
|
identifier f;
|
||||||
|
statement S1,S2,S3,S4;
|
||||||
|
iterator iter;
|
||||||
|
position p!={pr1.p1,pr2.p2};
|
||||||
|
position ifm.p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
if@p1 ((E == NULL && ...) || ...)
|
||||||
|
{
|
||||||
|
... when != if (...) S1 else S2
|
||||||
|
(
|
||||||
|
iter(subE,...) S4 // no use
|
||||||
|
|
|
||||||
|
list_remove_head(E2,subE,...)
|
||||||
|
|
|
||||||
|
subE = E1
|
||||||
|
|
|
||||||
|
for(subE = E1;...;...) S4
|
||||||
|
|
|
||||||
|
subE++
|
||||||
|
|
|
||||||
|
++subE
|
||||||
|
|
|
||||||
|
--subE
|
||||||
|
|
|
||||||
|
subE--
|
||||||
|
|
|
||||||
|
&subE
|
||||||
|
|
|
||||||
|
* E->f@p // bad use
|
||||||
|
)
|
||||||
|
... when any
|
||||||
|
return ...;
|
||||||
|
}
|
||||||
|
else S3
|
||||||
|
|
||||||
|
// The following three rules are duplicates of ifm, pr1 and pr2 respectively.
|
||||||
|
// It is need because the previous rule as already made a "change".
|
||||||
|
|
||||||
|
@ifm1 depends on !patch@
|
||||||
|
expression *E;
|
||||||
|
statement S1,S2;
|
||||||
|
position p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
if@p1 ((E == NULL && ...) || ...) S1 else S2
|
||||||
|
|
||||||
|
@pr11 depends on !patch expression@
|
||||||
|
expression *ifm1.E;
|
||||||
|
identifier f;
|
||||||
|
position p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(E != NULL && ...) ? <+...E->f@p1...+> : ...
|
||||||
|
|
||||||
|
@pr12 depends on !patch expression@
|
||||||
|
expression *ifm1.E;
|
||||||
|
identifier f;
|
||||||
|
position p2;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(
|
||||||
|
(E != NULL) && ... && <+...E->f@p2...+>
|
||||||
|
|
|
||||||
|
(E == NULL) || ... || <+...E->f@p2...+>
|
||||||
|
|
|
||||||
|
sizeof(<+...E->f@p2...+>)
|
||||||
|
)
|
||||||
|
|
||||||
|
@depends on context && !patch && !org && !report exists@
|
||||||
|
expression subE <= ifm1.E;
|
||||||
|
expression *ifm1.E;
|
||||||
|
expression E1,E2;
|
||||||
|
identifier f;
|
||||||
|
statement S1,S2,S3,S4;
|
||||||
|
iterator iter;
|
||||||
|
position p!={pr11.p1,pr12.p2};
|
||||||
|
position ifm1.p1;
|
||||||
|
@@
|
||||||
|
|
||||||
|
if@p1 ((E == NULL && ...) || ...)
|
||||||
|
{
|
||||||
|
... when != if (...) S1 else S2
|
||||||
|
(
|
||||||
|
iter(subE,...) S4 // no use
|
||||||
|
|
|
||||||
|
list_remove_head(E2,subE,...)
|
||||||
|
|
|
||||||
|
subE = E1
|
||||||
|
|
|
||||||
|
for(subE = E1;...;...) S4
|
||||||
|
|
|
||||||
|
subE++
|
||||||
|
|
|
||||||
|
++subE
|
||||||
|
|
|
||||||
|
--subE
|
||||||
|
|
|
||||||
|
subE--
|
||||||
|
|
|
||||||
|
&subE
|
||||||
|
|
|
||||||
|
* E->f@p // bad use
|
||||||
|
)
|
||||||
|
... when any
|
||||||
|
}
|
||||||
|
else S3
|
56
scripts/coccinelle/err_cast.cocci
Normal file
56
scripts/coccinelle/err_cast.cocci
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
///
|
||||||
|
/// Use ERR_CAST inlined function instead of ERR_PTR(PTR_ERR(...))
|
||||||
|
///
|
||||||
|
// Confidence: High
|
||||||
|
// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. GPLv2.
|
||||||
|
// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. GPLv2.
|
||||||
|
// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. GPLv2.
|
||||||
|
// URL: http://coccinelle.lip6.fr/
|
||||||
|
// Options:
|
||||||
|
//
|
||||||
|
// Keywords: ERR_PTR, PTR_ERR, ERR_CAST
|
||||||
|
// Version min: 2.6.25
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual context
|
||||||
|
virtual patch
|
||||||
|
virtual org
|
||||||
|
virtual report
|
||||||
|
|
||||||
|
|
||||||
|
@ depends on context && !patch && !org && !report@
|
||||||
|
expression x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
* ERR_PTR(PTR_ERR(x))
|
||||||
|
|
||||||
|
@ depends on !context && patch && !org && !report @
|
||||||
|
expression x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
- ERR_PTR(PTR_ERR(x))
|
||||||
|
+ ERR_CAST(x)
|
||||||
|
|
||||||
|
@r depends on !context && !patch && (org || report)@
|
||||||
|
expression x;
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
ERR_PTR@p(PTR_ERR(x))
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << r.p;
|
||||||
|
x << r.x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="WARNING ERR_CAST can be used with %s" % (x)
|
||||||
|
msg_safe=msg.replace("[","@(").replace("]",")")
|
||||||
|
coccilib.org.print_todo(p[0], msg_safe)
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << r.p;
|
||||||
|
x << r.x;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="WARNING: ERR_CAST can be used with %s" % (x)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
93
scripts/coccinelle/resource_size.cocci
Normal file
93
scripts/coccinelle/resource_size.cocci
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
///
|
||||||
|
/// Use resource_size function on resource object
|
||||||
|
/// instead of explicit computation.
|
||||||
|
///
|
||||||
|
// Confidence: High
|
||||||
|
// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. GPLv2.
|
||||||
|
// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. GPLv2.
|
||||||
|
// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. GPLv2.
|
||||||
|
// URL: http://coccinelle.lip6.fr/
|
||||||
|
// Options:
|
||||||
|
//
|
||||||
|
// Keywords: resource_size
|
||||||
|
// Version min: 2.6.27 resource_size
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual context
|
||||||
|
virtual patch
|
||||||
|
virtual org
|
||||||
|
virtual report
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For context mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@r_context depends on context && !patch && !org@
|
||||||
|
struct resource *res;
|
||||||
|
@@
|
||||||
|
|
||||||
|
* (res->end - res->start) + 1
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For patch mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
@r_patch depends on !context && patch && !org@
|
||||||
|
struct resource *res;
|
||||||
|
@@
|
||||||
|
|
||||||
|
- (res->end - res->start) + 1
|
||||||
|
+ resource_size(res)
|
||||||
|
|
||||||
|
//----------------------------------------------------------
|
||||||
|
// For org mode
|
||||||
|
//----------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@r_org depends on !context && !patch && (org || report)@
|
||||||
|
struct resource *res;
|
||||||
|
position p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
(res->end@p - res->start) + 1
|
||||||
|
|
||||||
|
@rbad_org depends on !context && !patch && (org || report)@
|
||||||
|
struct resource *res;
|
||||||
|
position p != r_org.p;
|
||||||
|
@@
|
||||||
|
|
||||||
|
res->end@p - res->start
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << r_org.p;
|
||||||
|
x << r_org.res;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERROR with %s" % (x)
|
||||||
|
msg_safe=msg.replace("[","@(").replace("]",")")
|
||||||
|
coccilib.org.print_todo(p[0], msg_safe)
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << r_org.p;
|
||||||
|
x << r_org.res;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="ERROR: Missing resource_size with %s" % (x)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
||||||
|
|
||||||
|
@script:python depends on org@
|
||||||
|
p << rbad_org.p;
|
||||||
|
x << rbad_org.res;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="WARNING with %s" % (x)
|
||||||
|
msg_safe=msg.replace("[","@(").replace("]",")")
|
||||||
|
coccilib.org.print_todo(p[0], msg_safe)
|
||||||
|
|
||||||
|
@script:python depends on report@
|
||||||
|
p << rbad_org.p;
|
||||||
|
x << rbad_org.res;
|
||||||
|
@@
|
||||||
|
|
||||||
|
msg="WARNING: Suspicious code. resource_size is maybe missing with %s" % (x)
|
||||||
|
coccilib.report.print_report(p[0], msg)
|
|
@ -40,7 +40,7 @@ echo $code
|
||||||
code=`echo $code | sed -e 's/.*Code: //'`
|
code=`echo $code | sed -e 's/.*Code: //'`
|
||||||
|
|
||||||
width=`expr index "$code" ' '`
|
width=`expr index "$code" ' '`
|
||||||
width=$[($width-1)/2]
|
width=$((($width-1)/2))
|
||||||
case $width in
|
case $width in
|
||||||
1) type=byte ;;
|
1) type=byte ;;
|
||||||
2) type=2byte ;;
|
2) type=2byte ;;
|
||||||
|
@ -48,10 +48,10 @@ case $width in
|
||||||
esac
|
esac
|
||||||
|
|
||||||
disas() {
|
disas() {
|
||||||
${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s &> /dev/null
|
${CROSS_COMPILE}as $AFLAGS -o $1.o $1.s > /dev/null 2>&1
|
||||||
|
|
||||||
if [ "$ARCH" == "arm" ]; then
|
if [ "$ARCH" = "arm" ]; then
|
||||||
if [ $width == 2 ]; then
|
if [ $width -eq 2 ]; then
|
||||||
OBJDUMPFLAGS="-M force-thumb"
|
OBJDUMPFLAGS="-M force-thumb"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ disas() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \
|
${CROSS_COMPILE}objdump $OBJDUMPFLAGS -S $1.o | \
|
||||||
grep -v "/tmp\|Disassembly\|\.text\|^$" &> $1.dis
|
grep -v "/tmp\|Disassembly\|\.text\|^$" > $1.dis 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
marker=`expr index "$code" "\<"`
|
marker=`expr index "$code" "\<"`
|
||||||
|
|
|
@ -77,6 +77,7 @@ static struct node *read_fstree(const char *dirname)
|
||||||
free(tmpnam);
|
free(tmpnam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
closedir(d);
|
||||||
return tree;
|
return tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
1
scripts/kconfig/.gitignore
vendored
1
scripts/kconfig/.gitignore
vendored
|
@ -17,6 +17,7 @@ gconf.glade.h
|
||||||
#
|
#
|
||||||
conf
|
conf
|
||||||
mconf
|
mconf
|
||||||
|
nconf
|
||||||
qconf
|
qconf
|
||||||
gconf
|
gconf
|
||||||
kxgettext
|
kxgettext
|
||||||
|
|
Loading…
Reference in a new issue