diff mbox series

scripts: Add fortify checks on installed headers

Message ID 20230620195510.2274938-1-adhemerval.zanella@linaro.org
State New
Headers show
Series scripts: Add fortify checks on installed headers | expand

Commit Message

Adhemerval Zanella Netto June 20, 2023, 7:55 p.m. UTC
The _FORTIFY_SOURCE is used as default by some system compilers,
and there is no way to check if some fortify extension does not
trigger any conformance issue.

Checked on x86_64-linux-gnu.
---
 scripts/check-installed-headers.sh | 36 +++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 13 deletions(-)

Comments

Carlos O'Donell July 10, 2023, 2:10 p.m. UTC | #1
On 6/20/23 15:55, Adhemerval Zanella via Libc-alpha wrote:
> The _FORTIFY_SOURCE is used as default by some system compilers,
> and there is no way to check if some fortify extension does not
> trigger any conformance issue.
> 
> Checked on x86_64-linux-gnu.

LGTM. Increases coverage. Thank you!

Reviewed-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  scripts/check-installed-headers.sh | 36 +++++++++++++++++++-----------
>  1 file changed, 23 insertions(+), 13 deletions(-)
> 
> diff --git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh
> index 5a50a491ca..23506a2514 100644
> --- a/scripts/check-installed-headers.sh
> +++ b/scripts/check-installed-headers.sh
> @@ -29,6 +29,9 @@ cxx_modes="-std=c++98 -std=gnu++98 -std=c++11 -std=gnu++11"
>  # These are probably the most commonly used three.
>  lib_modes="-D_DEFAULT_SOURCE=1 -D_GNU_SOURCE=1 -D_XOPEN_SOURCE=700"
>  
> +# Also check for fortify modes, since it might be enabled as default.
> +fortify_modes="1 2 3"

OK. Great idea. I agree we should be checking the installed headers against 1, 2, and 3.

> +
>  if [ $# -lt 3 ]; then
>      echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
>      exit 2
> @@ -100,29 +103,36 @@ EOF
>      echo :: "$header"
>      for lang_mode in "" $lang_modes; do
>          for lib_mode in "" $lib_modes; do
> -            echo :::: $lang_mode $lib_mode
> -            if [ -z "$lib_mode" ]; then
> -                expanded_lib_mode='/* default library mode */'
> -            else
> -                expanded_lib_mode=$(echo : $lib_mode | \
> -                    sed 's/^: -D/#define /; s/=/ /')
> -            fi
> -            cat >"$cih_test_c" <<EOF
> +            for fortify_mode in "" $fortify_modes; do

OK. Iterate the fortify mode.

> +                echo :::: $lang_mode $lib_mode $fortify_mode
> +                if [ -z "$lib_mode" ]; then
> +                    expanded_lib_mode='/* default library mode */'
> +                else
> +                    expanded_lib_mode=$(echo : $lib_mode | \
> +                        sed 's/^: -D/#define /; s/=/ /')
> +                fi
> +                if [ ! -z $fortify_mode ]; then
> +                    fortify_mode="#define _FORTIFY_SOURCE $fortify_mode"

OK. Set $fortify_mode.

> +                fi
> +                cat >"$cih_test_c" <<EOF
>  /* These macros may have been defined on the command line.  They are
>     inappropriate for this test.  */
>  #undef _LIBC
>  #undef _GNU_SOURCE
> +#undef _FORTIFY_SOURCE
> +$fortify_mode

OK. Use $fortify_mode.

>  /* The library mode is selected here rather than on the command line to
>     ensure that this selection wins. */
>  $expanded_lib_mode
>  #include <$header>
>  int avoid_empty_translation_unit;
>  EOF
> -            if $cc_cmd -finput-charset=ascii -fsyntax-only $lang_mode \
> -		       "$cih_test_c" 2>&1
> -            then :
> -            else failed=1
> -            fi
> +                if $cc_cmd -finput-charset=ascii -fsyntax-only $lang_mode \
> +		           "$cih_test_c" 2>&1
> +                then :
> +                else failed=1
> +                fi
> +            done

OK. Nested +1 due to iteration over fortify check.

>          done
>      done
>  done
diff mbox series

Patch

diff --git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh
index 5a50a491ca..23506a2514 100644
--- a/scripts/check-installed-headers.sh
+++ b/scripts/check-installed-headers.sh
@@ -29,6 +29,9 @@  cxx_modes="-std=c++98 -std=gnu++98 -std=c++11 -std=gnu++11"
 # These are probably the most commonly used three.
 lib_modes="-D_DEFAULT_SOURCE=1 -D_GNU_SOURCE=1 -D_XOPEN_SOURCE=700"
 
+# Also check for fortify modes, since it might be enabled as default.
+fortify_modes="1 2 3"
+
 if [ $# -lt 3 ]; then
     echo "usage: $0 c|c++ \"compile command\" header header header..." >&2
     exit 2
@@ -100,29 +103,36 @@  EOF
     echo :: "$header"
     for lang_mode in "" $lang_modes; do
         for lib_mode in "" $lib_modes; do
-            echo :::: $lang_mode $lib_mode
-            if [ -z "$lib_mode" ]; then
-                expanded_lib_mode='/* default library mode */'
-            else
-                expanded_lib_mode=$(echo : $lib_mode | \
-                    sed 's/^: -D/#define /; s/=/ /')
-            fi
-            cat >"$cih_test_c" <<EOF
+            for fortify_mode in "" $fortify_modes; do
+                echo :::: $lang_mode $lib_mode $fortify_mode
+                if [ -z "$lib_mode" ]; then
+                    expanded_lib_mode='/* default library mode */'
+                else
+                    expanded_lib_mode=$(echo : $lib_mode | \
+                        sed 's/^: -D/#define /; s/=/ /')
+                fi
+                if [ ! -z $fortify_mode ]; then
+                    fortify_mode="#define _FORTIFY_SOURCE $fortify_mode"
+                fi
+                cat >"$cih_test_c" <<EOF
 /* These macros may have been defined on the command line.  They are
    inappropriate for this test.  */
 #undef _LIBC
 #undef _GNU_SOURCE
+#undef _FORTIFY_SOURCE
+$fortify_mode
 /* The library mode is selected here rather than on the command line to
    ensure that this selection wins. */
 $expanded_lib_mode
 #include <$header>
 int avoid_empty_translation_unit;
 EOF
-            if $cc_cmd -finput-charset=ascii -fsyntax-only $lang_mode \
-		       "$cih_test_c" 2>&1
-            then :
-            else failed=1
-            fi
+                if $cc_cmd -finput-charset=ascii -fsyntax-only $lang_mode \
+		           "$cih_test_c" 2>&1
+                then :
+                else failed=1
+                fi
+            done
         done
     done
 done