X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=bin%2Fblhc;h=348dbb6c875e6c04842bc60ad9eb1127ecfdab46;hb=ad221453b3058bdc13ab4b9314348ac2e5d6d643;hp=704d323694031709909d15becefea70ab006ffee;hpb=ae5da64f4f6f53ca3eb055d2124988847b2e8d50;p=blhc%2Fblhc.git diff --git a/bin/blhc b/bin/blhc index 704d323..348dbb6 100755 --- a/bin/blhc +++ b/bin/blhc @@ -42,6 +42,10 @@ my $cc_regex_full = qr/ (?:[a-z0-9_]+-(?:linux-|kfreebsd-)?gnu(?:eabi|eabihf)?-)? $cc_regex /x; +# Regex to check if a line contains a compiler command. +my $cc_regex_normal = qr/ + \b$cc_regex(?:\s|\\) + /x; # Regex to catch (GCC) compiler warnings. my $warning_regex = qr/^(.+?):(\d+):\d+: warning: (.+?) \[(.+?)\]$/; @@ -117,6 +121,7 @@ my @object = ( # Hashes for fast extensions lookup to check if a file falls in one of these # categories. my %extensions_no_preprocess = map { $_ => 1 } ( + # There's no @header_no_preprocess. @source_no_preprocess, ); my %extensions_preprocess = map { $_ => 1 } ( @@ -636,8 +641,7 @@ foreach my $file (@ARGV) { # only, doesn't use the dpkg-buildpackage header. Necessary to ignore # build logs which aren't built (wrong architecture, build error, # etc.). - if (not $arch - and $line =~ /^Architecture: (.+)$/) { + if (not $arch and $line =~ /^Architecture: (.+)$/) { $arch = $1; } @@ -716,7 +720,7 @@ foreach my $file (@ARGV) { # Ignore compiler warnings for now. next if $line =~ /$warning_regex/o; - if (not $option_buildd and index($line, "\033") != -1) { # esc + if (not $option_buildd and index($line, "\033") != -1) { # \033 = esc # Remove all ANSI color sequences which are sometimes used in # non-verbose builds. $line = Term::ANSIColor::colorstrip($line); @@ -768,7 +772,7 @@ foreach my $file (@ARGV) { # Ignore lines with no compiler commands. next if not $non_verbose - and not $line =~ /\b$cc_regex(?:\s|\\)/o; + and not $line =~ /$cc_regex_normal/o; # Ignore lines with no filenames with extensions. May miss some # non-verbose builds (e.g. "gcc -o test" [sic!]), but shouldn't be # a problem as the log will most likely contain other non-verbose @@ -783,7 +787,7 @@ foreach my $file (@ARGV) { and $line =~ /^(?:checking|[Cc]onfigure:) /; next if $line =~ /^\s*(?:Host\s+)?(?:C(?:\+\+)?\s+)? [Cc]ompiler[\s.]*:?\s+ - /xo; + /x; next if $line =~ /^\s*(?:- )?(?:HOST_)?(?:CC|CXX)\s*=\s*$cc_regex_full\s*$/o; # `moc-qt4`, contains '-I/usr/share/qt4/mkspecs/linux-g++' (or # similar for other architectures) which gets recognized as a @@ -792,6 +796,14 @@ foreach my $file (@ARGV) { \s.+\s -I/usr/share/qt4/mkspecs/[a-z]+-g\++(?:-64)? \s}x; + # Ignore false positives when the line contains only CC=gcc but no + # other gcc command. + if ($line =~ /(.*)CC=$cc_regex_full(.*)/o) { + my $before = $1; + my $after = $2; + next if not $before =~ /$cc_regex_normal/o + and not $after =~ /$cc_regex_normal/o; + } # Check if additional hardening options were used. Used to ensure # they are used for the complete build. @@ -831,7 +843,7 @@ foreach my $file (@ARGV) { # Option or auto detected. if ($arch) { - # The following was partially copied from dpkg-dev 1.16.1.2 + # The following was partially copied from dpkg-dev 1.16.4.3 # (/usr/share/perl5/Dpkg/Vendor/Debian.pm, add_hardening_flags()), # copyright Raphaël Hertzog , Kees Cook # , Canonical, Ltd. licensed under GPL version 2 or @@ -929,7 +941,7 @@ LINE: # checks easier and faster. $line =~ s/^.*?$cc_regex//o; # "([...] test.c)" is not detected as 'test.c' - fix this by removing - # the brace and similar characters. + # the brace and similar characters at the line end. $line =~ s/['")]+$//; # Skip unnecessary tests when only preprocessing. @@ -979,18 +991,18 @@ LINE: } if (not $flag_preprocess) { - # If there are source files then it's compiling/linking in one step - # and we must check both. We only check for source files here, because - # header files cause too many false positives. + # If there are source files then it's compiling/linking in one + # step and we must check both. We only check for source files + # here, because header files cause too many false positives. if (extension_found(\%extensions_compile_link, @extensions)) { - # Assembly files don't need CFLAGS. - if (not extension_found(\%extensions_compile, @extensions) - and extension_found(\%extensions_no_compile, @extensions)) { - $compile = 0; - # But the rest does. - } else { - $compile = 1; - } + # Assembly files don't need CFLAGS. + if (not extension_found(\%extensions_compile, @extensions) + and extension_found(\%extensions_no_compile, @extensions)) { + $compile = 0; + # But the rest does. + } else { + $compile = 1; + } # No compilable extensions found, either linking or compiling # header flags. # @@ -1184,7 +1196,8 @@ Don't require Term::ANSIColor. =item * -Return exit code 0, unless there was a error. +Return exit code 0, unless there was a error (-I, -W messages don't count as +error). =back