]> ruderich.org/simon Gitweb - blhc/blhc.git/commitdiff
Refactor flag overwrite check into separate function
authorSimon Ruderich <simon@ruderich.org>
Thu, 10 May 2018 15:39:00 +0000 (17:39 +0200)
committerSimon Ruderich <simon@ruderich.org>
Thu, 10 May 2018 15:39:00 +0000 (17:39 +0200)
bin/blhc

index f11ba111028c3949fd526a8f89eee47f316fba2c..d56a6c079eb9cd641961f87f13efc609dee4b29f 100755 (executable)
--- a/bin/blhc
+++ b/bin/blhc
@@ -427,35 +427,46 @@ sub all_flags_used {
     @{$missing_flags_ref} = @missing_flags;
     return 0;
 }
+# Check if any of \@bad_flags occurs after $good_flag. Doesn't check if
+# $good_flag is present.
+sub flag_overwritten {
+    my ($line, $good_flag, $bad_flags) = @_;
 
-sub cppflags_fortify_broken {
-    my ($line, $missing_flags) = @_;
-
-    if (not any_flags_used($line, @def_cppflags_fortify_bad)) {
+    if (not any_flags_used($line, @{$bad_flags})) {
         return 0;
     }
 
-    # $def_cppflags_fortify[0] must be -D_FORTIFY_SOURCE=2!
-    my $fortify_source = $def_cppflags_fortify[0];
-
-    # Some build systems enable/disable fortify source multiple times, check
-    # the final result.
-    my $disable_pos = 0;
-    foreach my $flag (@def_cppflags_fortify_bad) {
+    my $bad_pos = 0;
+    foreach my $flag (@{$bad_flags}) {
         while ($line =~ /$flag/g) {
-            if ($disable_pos < $+[0]) {
-                $disable_pos = $+[0];
+            if ($bad_pos < $+[0]) {
+                $bad_pos = $+[0];
             }
         }
     }
-    my $enable_pos = 0;
-    while ($line =~ /$fortify_source/g) {
-        $enable_pos = $+[0];
+    my $good_pos = 0;
+    while ($line =~ /$good_flag/g) {
+        $good_pos = $+[0];
     }
-    if ($enable_pos > $disable_pos) {
+    if ($good_pos > $bad_pos) {
         return 0;
     }
+    return 1;
+}
 
+sub cppflags_fortify_broken {
+    my ($line, $missing_flags) = @_;
+
+    # $def_cppflags_fortify[0] must be -D_FORTIFY_SOURCE=2!
+    my $fortify_source = $def_cppflags_fortify[0];
+
+    # Some build systems enable/disable fortify source multiple times, check
+    # the final result.
+    if (not flag_overwritten($line,
+                             $fortify_source,
+                             \@def_cppflags_fortify_bad)) {
+        return 0;
+    }
     push @{$missing_flags}, $fortify_source;
     return 1;
 }