Skip to content
Snippets Groups Projects
checkpatch.pl 57.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • # check for needless kfree() checks
    		if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
    			my $expr = $1;
    			if ($line =~ /\bkfree\(\Q$expr\E\);/) {
    				WARN("kfree(NULL) is safe this check is probabally not required\n" . $hereprev);
    			}
    		}
    
    
    # warn about #ifdefs in C files
    
    #		if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
    
    #			print "#ifdef in C files should be avoided\n";
    #			print "$herecurr";
    #			$clean = 0;
    #		}
    
    
    # warn about spacing in #ifdefs
    
    		if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
    
    			ERROR("exactly one space required after that #$1\n" . $herecurr);
    		}
    
    
    # check for spinlock_t definitions without a comment.
    
    		if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
    		    $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
    
    			my $which = $1;
    			if (!ctx_has_comment($first_line, $linenr)) {
    
    				CHK("$1 definition without comment\n" . $herecurr);
    
    			}
    		}
    # check for memory barriers without a comment.
    		if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
    			if (!ctx_has_comment($first_line, $linenr)) {
    
    				CHK("memory barrier without comment\n" . $herecurr);
    
    			}
    		}
    # check of hardware specific defines
    
    		if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
    
    			CHK("architecture specific defines should be avoided\n" .  $herecurr);
    
    # check the location of the inline attribute, that it is between
    # storage class and type.
    
    		if ($line =~ /\b$Type\s+$Inline\b/ ||
    		    $line =~ /\b$Inline\s+$Storage\b/) {
    
    			ERROR("inline keyword should sit between storage class and type\n" . $herecurr);
    		}
    
    
    # Check for __inline__ and __inline, prefer inline
    		if ($line =~ /\b(__inline__|__inline)\b/) {
    			WARN("plain inline is preferred over $1\n" . $herecurr);
    		}
    
    
    # check for new externs in .c files.
    
    		if ($realfile =~ /\.c$/ && defined $stat &&
    
    		    $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
    
    			my $function_name = $1;
    			my $paren_space = $2;
    
    
    			my $s = $stat;
    			if (defined $cond) {
    				substr($s, 0, length($cond), '');
    			}
    
    			if ($s =~ /^\s*;/ &&
    			    $function_name ne 'uninitialized_var')
    			{
    
    				WARN("externs should be avoided in .c files\n" .  $herecurr);
    			}
    
    			if ($paren_space =~ /\n/) {
    				WARN("arguments for function declarations should follow identifier\n" . $herecurr);
    			}
    
    
    		} elsif ($realfile =~ /\.c$/ && defined $stat &&
    		    $stat =~ /^.\s*extern\s+/)
    		{
    			WARN("externs should be avoided in .c files\n" .  $herecurr);
    
    		}
    
    # checks for new __setup's
    		if ($rawline =~ /\b__setup\("([^"]*)"/) {
    			my $name = $1;
    
    			if (!grep(/$name/, @setup_docs)) {
    				CHK("__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
    			}
    
    
    # check for pointless casting of kmalloc return
    		if ($line =~ /\*\s*\)\s*k[czm]alloc\b/) {
    			WARN("unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
    		}
    
    
    # check for gcc specific __FUNCTION__
    		if ($line =~ /__FUNCTION__/) {
    			WARN("__func__ should be used instead of gcc specific __FUNCTION__\n"  . $herecurr);
    		}
    
    
    # check for semaphores used as mutexes
    
    		if ($line =~ /^.\s*(DECLARE_MUTEX|init_MUTEX)\s*\(/) {
    
    			WARN("mutexes are preferred for single holder semaphores\n" . $herecurr);
    		}
    # check for semaphores used as mutexes
    
    		if ($line =~ /^.\s*init_MUTEX_LOCKED\s*\(/) {
    
    			WARN("consider using a completion\n" . $herecurr);
    		}
    # recommend strict_strto* over simple_strto*
    		if ($line =~ /\bsimple_(strto.*?)\s*\(/) {
    			WARN("consider using strict_$1 in preference to simple_$1\n" . $herecurr);
    		}
    
    # check for __initcall(), use device_initcall() explicitly please
    		if ($line =~ /^.\s*__initcall\s*\(/) {
    			WARN("please use device_initcall() instead of __initcall()\n" . $herecurr);
    		}
    
    
    # use of NR_CPUS is usually wrong
    # ignore definitions of NR_CPUS and usage to define arrays as likely right
    		if ($line =~ /\bNR_CPUS\b/ &&
    
    		    $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
    		    $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
    
    		    $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
    		    $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
    		    $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
    
    		{
    			WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
    		}
    
    
    # check for %L{u,d,i} in strings
    		my $string;
    		while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
    			$string = substr($rawline, $-[1], $+[1] - $-[1]);
    			if ($string =~ /(?<!%)%L[udi]/) {
    				WARN("\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
    				last;
    			}
    		}
    
    	}
    
    	# If we have no input at all, then there is nothing to report on
    	# so just keep quiet.
    	if ($#rawlines == -1) {
    		exit(0);
    
    	# In mailback mode only produce a report in the negative, for
    	# things that appear to be patches.
    	if ($mailback && ($clean == 1 || !$is_patch)) {
    		exit(0);
    	}
    
    	# This is not a patch, and we are are in 'no-patch' mode so
    	# just keep quiet.
    	if (!$chk_patch && !$is_patch) {
    		exit(0);
    	}
    
    	if (!$is_patch) {
    
    		ERROR("Does not appear to be a unified-diff format patch\n");
    
    	}
    	if ($is_patch && $chk_signoff && $signoff == 0) {
    
    		ERROR("Missing Signed-off-by: line(s)\n");
    
    	print report_dump();
    
    	if ($summary && !($clean == 1 && $quiet == 1)) {
    		print "$filename " if ($summary_file);
    
    		print "total: $cnt_error errors, $cnt_warn warnings, " .
    			(($check)? "$cnt_chk checks, " : "") .
    			"$cnt_lines lines checked\n";
    		print "\n" if ($quiet == 0);
    
    	if ($clean == 1 && $quiet == 0) {
    
    		print "$vname has no obvious style problems and is ready for submission.\n"
    
    	}
    	if ($clean == 0 && $quiet == 0) {
    
    		print "$vname has style problems, please review.  If any of these errors\n";
    
    		print "are false positives report them to the maintainer, see\n";
    		print "CHECKPATCH in MAINTAINERS.\n";
    	}
    
    	return $clean;
    }