Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/usr/include/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 3 kB image not shown  

Quelle  headers_check.pl   Sprache: Shell

 
#!/usr/bin/env perl
# SPDX-License-Identifier: GPL-2.0
#
# headers_check.pl execute a number of trivial consistency checks
#
# Usage: headers_check.pl dir [files...]
# dir:   dir to look for included files
# files: list of files to check
#
# The script reads the supplied files line by line and:
#
# 1) for each include statement it checks if the
#    included file actually exists.
#    Only include files located in asm* and linux* are checked.
#    The rest are assumed to be system include files.
#
# 2) It is checked that prototypes does not use "extern"
#
# 3) Check for leaked CONFIG_ symbols

use warnings;
use strict;
use File::Basename;

my ($dir, @files) = @ARGV;

my $ret = 0;
my $line;
my $lineno = 0;
my $filename;

foreach my $file (@files) {
 $filename = $file;

 open(my $fh, '<', $filename)
  or die "$filename: $!\n";
 $lineno = 0;
 while ($line = <$fh>) {
  $lineno++;
  &check_include();
  &check_asm_types();
  &check_sizetypes();
  &check_declarations();
  # Dropped for now. Too much noise &check_config();
 }
 close $fh;
}
exit $ret;

sub check_include
{
 if ($line =~ m/^\s*#\s*include\s+<((asm|linux).*)>/) {
  my $inc = $1;
  my $found;
  $found = stat($dir . "/" . $inc);
  if (!$found) {
   printf STDERR "$filename:$lineno: included file '$inc' is not exported\n";
   $ret = 1;
  }
 }
}

sub check_declarations
{
 # soundcard.h is what it is
 if ($line =~ m/^void seqbuf_dump\(void\);/) {
  return;
 }
 # drm headers are being C++ friendly
 if ($line =~ m/^extern "C"/) {
  return;
 }
 if ($line =~ m/^(\s*extern|unsigned|char|short|int|long|void)\b/) {
  printf STDERR "$filename:$lineno: " .
         "userspace cannot reference function or " .
         "variable defined in the kernel\n";
 }
}

sub check_config
{
 if ($line =~ m/[^a-zA-Z0-9_]+CONFIG_([a-zA-Z0-9_]+)[^a-zA-Z0-9_]/) {
  printf STDERR "$filename:$lineno: leaks CONFIG_$1 to userspace where it is not valid\n";
 }
}

my $linux_asm_types;
sub check_asm_types
{
 if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
  return;
 }
 if ($lineno == 1) {
  $linux_asm_types = 0;
 } elsif ($linux_asm_types >= 1) {
  return;
 }
 if ($line =~ m/^\s*#\s*include\s+<asm\/types.h>/) {
  $linux_asm_types = 1;
  printf STDERR "$filename:$lineno: " .
  "include of is preferred over \n"
  # Warn until headers are all fixed
  #$ret = 1;
 }
}

my $linux_types;
my %import_stack = ();
sub check_include_typesh
{
 my $path = $_[0];
 my $import_path;

 my $fh;
 my @file_paths = ($path, $dir . "/" .  $path, dirname($filename) . "/" . $path);
 for my $possible ( @file_paths ) {
     if (not $import_stack{$possible} and open($fh, '<', $possible)) {
  $import_path = $possible;
  $import_stack{$import_path} = 1;
  last;
     }
 }
 if (eof $fh) {
     return;
 }

 my $line;
 while ($line = <$fh>) {
  if ($line =~ m/^\s*#\s*include\s+<linux\/types.h>/) {
   $linux_types = 1;
   last;
  }
  if (my $included = ($line =~ /^\s*#\s*include\s+[<"](\S+)[>"]/)[0]) {
   check_include_typesh($included);
  }
 }
 close $fh;
 delete $import_stack{$import_path};
}

sub check_sizetypes
{
 if ($filename =~ /types.h|int-l64.h|int-ll64.h/o) {
  return;
 }
 if ($lineno == 1) {
  $linux_types = 0;
 } elsif ($linux_types >= 1) {
  return;
 }
 if ($line =~ m/^\s*#\s*include\s+<linux\/types.h>/) {
  $linux_types = 1;
  return;
 }
 if (my $included = ($line =~ /^\s*#\s*include\s+[<"](\S+)[>"]/)[0]) {
  check_include_typesh($included);
 }
 # strip single-line comments, as types may be referenced within them
 $line =~ s@/\*.*?\*/@@;
 if ($line =~ m/__[us](8|16|32|64)\b/) {
  printf STDERR "$filename:$lineno: " .
                "found __[us]{8,16,32,64} type " .
                "without #include \n";
  $linux_types = 2;
  # Warn until headers are all fixed
  #$ret = 1;
 }
}

100%


¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.