chiark / gitweb /
Detect Fink automatically.
[secnet.git] / ac_prog_cc_no_writeable_strings.m4
1 dnl @synopsis AC_PROG_CC_NO_WRITEABLE_STRINGS(substvar [,hard])
2 dnl
3 dnl Try to find a compiler option that warns when a stringliteral is
4 dnl used in a place that could potentially modify the address. This
5 dnl should warn on giving an stringliteral to a function that asks of
6 dnl a non-const-modified char-pointer.
7 dnl
8 dnl The sanity check is done by looking at string.h which has a set
9 dnl of strcpy definitions that should be defined with const-modifiers
10 dnl to not emit a warning in all so many places.
11 dnl
12 dnl Currently this macro knows about GCC.
13 dnl hopefully will evolve to use:    Solaris C compiler,
14 dnl Digital Unix C compiler, C for AIX Compiler, HP-UX C compiler,
15 dnl and IRIX C compiler.
16 dnl
17 dnl @version $Id: ac_prog_cc_no_writeable_strings.m4,v 1.1 2002/02/20 16:18:18 steve Exp $
18 dnl @author Guido Draheim <guidod@gmx.de>
19 dnl
20 AC_DEFUN([AC_PROG_CC_NO_WRITEABLE_STRINGS], [
21   pushdef([CV],ac_cv_prog_cc_no_writeable_strings)dnl
22   hard=$2
23   if test -z "$hard"; then
24     msg="C to warn about writing to stringliterals"
25   else
26     msg="C to prohibit any write to stringliterals"
27   fi
28   AC_CACHE_CHECK($msg, CV, [
29   cat > conftest.c <<EOF
30 #include <string.h>
31 int main (void)
32 {
33    char test[[16]];
34    if (strcpy (test, "test")) return 0;
35    return 1;
36 }
37 EOF
38   dnl GCC
39   if test "$GCC" = "yes"; 
40   then
41         if test -z "$hard"; then
42             CV="-Wwrite-strings"
43         else
44             CV="-fno-writable-strings -Wwrite-strings"
45         fi
46
47         if test -n "`${CC-cc} -c $CV conftest.c 2>&1`" ; then
48             CV="suppressed: string.h"
49         fi
50
51   dnl Solaris C compiler
52   elif  $CC -flags 2>&1 | grep "Xc.*strict ANSI C" > /dev/null 2>&1 &&
53         $CC -c -xstrconst conftest.c > /dev/null 2>&1 &&
54         test -f conftest.o 
55   then
56         # strings go into readonly segment
57         CV="-xstrconst"
58
59         rm conftest.o
60         if test -n "`${CC-cc} -c $CV conftest.c 2>&1`" ; then
61              CV="suppressed: string.h"
62         fi
63   
64   dnl HP-UX C compiler
65   elif  $CC > /dev/null 2>&1 &&
66         $CC -c +ESlit conftest.c > /dev/null 2>&1 &&
67         test -f conftest.o 
68   then
69        # strings go into readonly segment
70         CV="+ESlit"
71         
72         rm conftest.o
73         if test -n "`${CC-cc} -c $CV conftest.c 2>&1`" ; then
74              CV="suppressed: string.h"
75         fi
76
77   dnl Digital Unix C compiler
78   elif ! $CC > /dev/null 2>&1 &&
79         $CC -c -readonly_strings conftest.c > /dev/null 2>&1 &&
80         test -f conftest.o
81   then  
82        # strings go into readonly segment
83         CV="-readonly_strings"
84         
85         rm conftest.o
86         if test -n "`${CC-cc} -c $CV conftest.c 2>&1`" ; then
87              CV="suppressed: string.h"
88         fi
89
90   dnl C for AIX Compiler
91
92   dnl IRIX C compiler
93         # -use_readonly_const is the default for IRIX C, 
94         # puts them into .rodata, but they are copied later.
95         # need to be "-G0 -rdatashared" for strictmode but
96         # I am not sure what effect that has really.
97
98   fi
99   rm -f conftest.*
100   ])
101   if test -z "[$]$1" ; then
102     if test -n "$CV" ; then
103       case "$CV" in
104         suppressed*) $1="" ;; # known but suppressed
105         *)  $1="$CV" ;;
106       esac
107     fi
108   fi
109   AC_SUBST($1)
110   popdef([CV])dnl
111 ])
112
113