X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=bin%2Fblhc;h=57ea0005df4f17712ef3e775d0e6ba8f1a829f12;hb=5bba87ced3180480ea9d147b300517b79ac15136;hp=fa2c507fff10c679a94d277b3b95571bf7cebe31;hpb=0261fdd4ff435c302e6e85bfb1954940e004c26b;p=blhc%2Fblhc.git diff --git a/bin/blhc b/bin/blhc index fa2c507..57ea000 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: (.+?) \[(.+?)\]$/; @@ -571,7 +575,7 @@ if (scalar @option_ignore_flag > 0) { # Same for arch specific ignore flags, but only prepare here. if (scalar @option_ignore_arch_flag > 0) { foreach my $ignore (@option_ignore_arch_flag) { - my ($ignore_arch, $ignore_flag) = split ':', $ignore, 2; + my ($ignore_arch, $ignore_flag) = split /:/, $ignore, 2; if (not $ignore_arch or not $ignore_flag) { printf STDERR 'Value "%s" invalid for option ignore-arch-flag ' @@ -597,7 +601,7 @@ foreach my $ignore (@option_ignore_line) { # Same for arch specific ignore lines. if (scalar @option_ignore_arch_line > 0) { foreach my $ignore (@option_ignore_arch_line) { - my ($ignore_arch, $ignore_line) = split ':', $ignore, 2; + my ($ignore_arch, $ignore_line) = split /:/, $ignore, 2; if (not $ignore_arch or not $ignore_line) { printf STDERR 'Value "%s" invalid for option ignore-arch-line ' @@ -637,9 +641,8 @@ 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: (.+)$/) { - $arch = $1; + if (not $arch and index($line, 'Architecture: ') == 0) { + $arch = substr $line, 14, -1; # -1 to ignore '\n' at the end } # dpkg-buildflags only provides hardening flags since 1.16.1, don't @@ -699,6 +702,10 @@ foreach my $file (@ARGV) { # Input lines, contain only the lines with compiler commands. my @input = (); + # Non-verbose lines in the input. Used to reduce calls to + # is_non_verbose_build() (which is quite slow) in the second loop when + # it's already clear if a line is non-verbose or not. + my @input_nonverbose = (); my $continuation = 0; my $complete_line = undef; @@ -706,18 +713,19 @@ foreach my $file (@ARGV) { # And stop at the end of the build log. Package details (reported by # the buildd logs) are not important for us. This also prevents false # positives. - last if $line =~ /^Build finished at \d{8}-\d{4}$/; + last if index($line, 'Build finished at ') == 0 + and $line =~ /^Build finished at \d{8}-\d{4}$/; # Detect architecture automatically unless overridden. if (not $arch - and $line =~ /^dpkg-buildpackage: host architecture (.+)$/) { - $arch = $1; + and index($line, 'dpkg-buildpackage: host architecture ') == 0) { + $arch = substr $line, 37, -1; # -1 to ignore '\n' at the end } # 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); @@ -769,7 +777,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 @@ -784,7 +792,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 @@ -793,6 +801,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. @@ -801,6 +817,7 @@ foreach my $file (@ARGV) { $harden_bindnow = 1 if any_flags_used($line, @def_ldflags_bindnow); push @input, $line; + push @input_nonverbose, $non_verbose; } } @@ -832,7 +849,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 @@ -891,9 +908,9 @@ foreach my $file (@ARGV) { # Ignore flags for this arch if requested. if ($arch and exists $option_ignore_arch_flag{$arch}) { - my @flag_refs = (\@cflags, \@cxxflags, \@cppflags, \@ldflags); + my @local_flag_refs = (\@cflags, \@cxxflags, \@cppflags, \@ldflags); - remove_flags(\@flag_refs, + remove_flags(\@local_flag_refs, \%flag_renames, @{$option_ignore_arch_flag{$arch}}); } @@ -914,7 +931,8 @@ LINE: } my $skip = 0; - if (is_non_verbose_build($line, $input[$i + 1], \$skip)) { + if ($input_nonverbose[$i] + and is_non_verbose_build($line, $input[$i + 1], \$skip)) { if (not $option_buildd) { error_non_verbose_build($line); $exit |= $exit_code{non_verbose_build}; @@ -930,7 +948,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. @@ -1369,7 +1387,7 @@ Simon Ruderich, Esimon@ruderich.orgE Thanks to to Bernhard R. Link Ebrlink@debian.orgE and Jaria Alto Ejari.aalto@cante.netE for their valuable input and suggestions. -=head1 COPYRIGHT AND LICENSE +=head1 LICENSE AND COPYRIGHT Copyright (C) 2012 by Simon Ruderich