Chekpatch does not warn about some quoted string split across lines

Jorgyano Vieira jorgyano at gmail.com
Wed Oct 24 09:09:28 EDT 2012


On Wed, Oct 24, 2012 at 12:01:16PM +0530, Anmol Sarma wrote:
> I've noticed that that some quoted string split across lines are not
> reported by checkpatch.pl. For example, running it on
> /drivers/staging/android/binder.c does not warn of multi-line strings at
> lines 512, 544, 776, 804 and several others. Does anyone know why this is
> happening?
> 
> Thanks!

well, checkpatch.pl is a very helpful script but it is still a buggy one.

see below the part of the code (checkpatch.pl:1779) where split strings is 
checked and warned:

------------------------ START -------------------------------------------------
# Check for user-visible strings broken across lines, which breaks the ability
# to grep for the string.  Limited to strings used as parameters (those
# following an open parenthesis), which almost completely eliminates false
# positives, as well as warning only once per parameter rather than once per
# line of the string.  Make an exception when the previous string ends in a
# newline (multiple lines in one string constant) or \n\t (common in inline
# assembly to indent the instruction on the following line).
		if ($line =~ /^\+\s*"/ &&
		    $prevline =~ /"\s*$/ &&
		    $prevline =~ /\(/ &&
		    $prevrawline !~ /\\n(?:\\t)*"\s*$/) {
			WARN("SPLIT_STRING",
			    "quoted string split across lines\n" . $hereprev);
		}
------------------------ END ---------------------------------------------------

Now, let's analyze the conditions to trigger the warnning:

condition 1]
    # True if the line with double quotes (we can have whitespaces before it) 
    $line =~ /^\+\s*"/ &&    

condition 2]
    # True if the previous line ends with a double quote (we can have 
    # whitespaces after it)
    $prevline =~ /"\s*$/ &&

condition 3]
    # True if the previous line has a open parenthesis (we are looking for
    # strings as parameters only)
    $prevline =~ /\(/ &&

condition 4]
    # True if the previous line don't have a multiple lines in one string
    $prevrawline !~ /\\n(?:\\t)*"\s*$/) {
	WARN("SPLIT_STRING",
	    "quoted string split across lines\n" . $hereprev);

So, let's look at an example of the kind line which checkpatch.pl does not
trigger the warning when it should:

driver/staging/android/binder.c:544
------------------------ SART --------------------------------------------------
 binder_debug(BINDER_DEBUG_BUFFER_ALLOC,
                     "binder: %d: add free buffer, size %zd, "
                     "at %p\n", proc->pid, new_buffer_size, new_buffer);
------------------------ END ---------------------------------------------------

When checkpatch.pl reads the line 544 (the line which it should trgger the 
warning) of binder.c and enters the "split string check" we have:
condition 1: matches, the third line of the code snippet, it ends with a '"'
condition 2: matches, the previous line ends with a double quote
condition 3: NOT MATCH, the previous line does not have a open paranthesis

So the reason why checkpatch.pl does not trigger the warning on these lines is: 
_the opening parenthesis is not on the previous line_, but on the line
before the previous line, and checkpatch does not foresee this particular case.



More information about the Kernelnewbies mailing list