1b6b04ab938cddea89d9570f933d90991aceb0c6
[awesomized/libmemcached] / m4 / ax_harden_compiler_flags.m4
1 # vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2 # ===========================================================================
3 # https://github.com/BrianAker/ddm4/
4 # ===========================================================================
5 #
6 # SYNOPSIS
7 #
8 # AX_HARDEN_COMPILER_FLAGS() AX_HARDEN_LINKER_FLAGS()
9 #
10 # DESCRIPTION
11 #
12 # Any compiler flag that "hardens" or tests code. C99 is assumed.
13 #
14 # NOTE: Implementation based on AX_APPEND_FLAG.
15 #
16 # LICENSE
17 #
18 # Copyright (C) 2012-2013 Brian Aker
19 # All rights reserved.
20 #
21 # Redistribution and use in source and binary forms, with or without
22 # modification, are permitted provided that the following conditions are
23 # met:
24 #
25 # * Redistributions of source code must retain the above copyright
26 # notice, this list of conditions and the following disclaimer.
27 #
28 # * Redistributions in binary form must reproduce the above
29 # copyright notice, this list of conditions and the following disclaimer
30 # in the documentation and/or other materials provided with the
31 # distribution.
32 #
33 # * The names of its contributors may not be used to endorse or
34 # promote products derived from this software without specific prior
35 # written permission.
36 #
37 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
38 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
39 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
40 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
41 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
44 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
45 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
46 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
47 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48 #
49 # Notes:
50 # We do not test for c99 or c++11, that is out of scope.
51
52 # The Following flags are not checked for
53 # -Wdeclaration-after-statement is counter to C99
54 # _APPEND_COMPILE_FLAGS_ERROR([-pedantic])
55
56 #serial 13
57
58 AC_DEFUN([_SET_SANITIZE_FLAGS],
59 [AS_IF([test "x$MINGW" != xyes],[
60 AS_IF([test "x$enable_shared" = "xyes"],
61 [AS_CASE([$ax_harden_sanitize],
62 [thread],[
63 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=thread])],
64 [address],[
65 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=address])],
66 [rest],[
67 _APPEND_COMPILE_FLAGS_ERROR([-fno-omit-frame-pointer])
68 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=integer])
69 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=memory])
70 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=alignment])
71 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=bool])
72 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=bounds])
73 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=enum])
74 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=float-cast-overflow])
75 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=float-divide-by-zero])
76 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=integer-divide-by-zero])
77 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=null])
78 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=object-size])
79 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=return])
80 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=shift])
81 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=signed-integer-overflow])
82 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=unreachable])
83 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=unsigned-integer-overflow])
84 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=vla-bound])
85 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=vptr])])
86 ])
87 ])
88 ])
89
90 AC_DEFUN([_WARNINGS_AS_ERRORS],
91 [AC_CACHE_CHECK([if all warnings into errors],[ac_cv_warnings_as_errors],
92 [AS_IF([test "x$ac_cv_vcs_checkout" = xyes],[ac_cv_warnings_as_errors=yes],
93 [ac_cv_warnings_as_errors=no])
94 ])
95 ])
96
97 # Note: Should this be LIBS or LDFLAGS?
98 AC_DEFUN([_APPEND_LINK_FLAGS_ERROR],
99 [AX_APPEND_LINK_FLAGS([$1],[LDFLAGS],[-Werror])
100 ])
101
102 AC_DEFUN([_APPEND_COMPILE_FLAGS_ERROR],
103 [AX_APPEND_COMPILE_FLAGS([$1],,[-Werror])
104 ])
105
106 # Everything above this does the heavy lifting, while what follows does the specifics.
107
108 AC_DEFUN([_HARDEN_LINKER_FLAGS],
109 [AS_IF([test "$CC" != "clang"],
110 [_APPEND_LINK_FLAGS_ERROR([-z relro -z now])
111 AS_IF([test "x$ac_cv_warnings_as_errors" = xyes],[AX_APPEND_LINK_FLAGS([-Werror])])
112 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
113 [_APPEND_LINK_FLAGS_ERROR([-rdynamic])
114 # AX_APPEND_LINK_FLAGS([--coverage])])
115 ])
116 ])
117
118 AC_DEFUN([_AX_HARDEN_SANITIZE],
119 [AC_REQUIRE([AX_DEBUG])
120 AC_ARG_WITH([sanitize],
121 [AS_HELP_STRING([--with-sanitize],
122 [Enable sanitize flag for compiler if it supports them @<:@default=no@:>@])],
123 [AS_CASE([$with_sanitize],
124 [thread],[
125 ax_harden_sanitize='thread'],
126 [address],[
127 ax_harden_sanitize='address'],
128 [ax_harden_sanitize='rest'])
129 ],
130 [AS_IF([test "x$ax_enable_debug" = xyes],[ax_harden_sanitize='rest'])])
131 ])
132
133 AC_DEFUN([_HARDEN_CC_COMPILER_FLAGS],
134 [AC_LANG_PUSH([C])dnl
135
136 AS_IF([test "x$ax_enable_debug" = xyes],
137 [CFLAGS=''
138 _APPEND_COMPILE_FLAGS_ERROR([-H])
139 _APPEND_COMPILE_FLAGS_ERROR([-g])
140 _APPEND_COMPILE_FLAGS_ERROR([-g3])
141 _APPEND_COMPILE_FLAGS_ERROR([-fno-eliminate-unused-debug-types])
142 _APPEND_COMPILE_FLAGS_ERROR([-fno-omit-frame-pointer])
143 ],[
144 _APPEND_COMPILE_FLAGS_ERROR([-g])
145 _APPEND_COMPILE_FLAGS_ERROR([-O2])
146 ])
147
148 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
149 [_APPEND_COMPILE_FLAGS_ERROR([-fstack-check])
150 # _APPEND_COMPILE_FLAGS_ERROR([--coverage])
151 _APPEND_COMPILE_FLAGS_ERROR([-Wpragmas])
152 _APPEND_COMPILE_FLAGS_ERROR([-Wunknown-pragmas])],
153 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-unknown-pragmas])
154 _APPEND_COMPILE_FLAGS_ERROR([-Wno-pragmas])])
155
156 AS_IF([test "$CC" = "clang"],[_APPEND_COMPILE_FLAGS_ERROR([-Qunused-arguments])])
157
158 _APPEND_COMPILE_FLAGS_ERROR([-Wall])
159 _APPEND_COMPILE_FLAGS_ERROR([-Wextra])
160 _APPEND_COMPILE_FLAGS_ERROR([-Weverything])
161 _APPEND_COMPILE_FLAGS_ERROR([-Wthis-test-should-fail])
162 # Anything below this comment please keep sorted.
163 # _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-format-attribute])
164 _APPEND_COMPILE_FLAGS_ERROR([-Wunsuffixed-float-constants])
165 _APPEND_COMPILE_FLAGS_ERROR([-Wjump-misses-init])
166 _APPEND_COMPILE_FLAGS_ERROR([-Wno-attributes])
167 _APPEND_COMPILE_FLAGS_ERROR([-Waddress])
168 _APPEND_COMPILE_FLAGS_ERROR([-Wvarargs])
169 _APPEND_COMPILE_FLAGS_ERROR([-Warray-bounds])
170 _APPEND_COMPILE_FLAGS_ERROR([-Wbad-function-cast])
171 # Not in use -Wc++-compat
172 _APPEND_COMPILE_FLAGS_ERROR([-Wchar-subscripts])
173 _APPEND_COMPILE_FLAGS_ERROR([-Wcomment])
174 _APPEND_COMPILE_FLAGS_ERROR([-Wfloat-equal])
175 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-security])
176 _APPEND_COMPILE_FLAGS_ERROR([-Wformat=2])
177 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-y2k])
178 _APPEND_COMPILE_FLAGS_ERROR([-Wlogical-op])
179 _APPEND_COMPILE_FLAGS_ERROR([-Wmaybe-uninitialized])
180 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-field-initializers])
181 AS_IF([test "x$MINGW" = xyes],
182 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-missing-noreturn])],
183 [_APPEND_COMPILE_FLAGS_ERROR([-Wmissing-noreturn])])
184 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-prototypes])
185 _APPEND_COMPILE_FLAGS_ERROR([-Wnested-externs])
186 _APPEND_COMPILE_FLAGS_ERROR([-Wnormalized=id])
187 _APPEND_COMPILE_FLAGS_ERROR([-Woverride-init])
188 _APPEND_COMPILE_FLAGS_ERROR([-Wpointer-arith])
189 _APPEND_COMPILE_FLAGS_ERROR([-Wpointer-sign])
190 AS_IF([test "x$MINGW" = xyes],
191 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=const])
192 _APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=noreturn])
193 _APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=pure])
194 _APPEND_COMPILE_FLAGS_ERROR([-Wno-redundant-decls])],
195 [_APPEND_COMPILE_FLAGS_ERROR([-Wredundant-decls])])
196 _APPEND_COMPILE_FLAGS_ERROR([-Wshadow])
197 _APPEND_COMPILE_FLAGS_ERROR([-Wshorten-64-to-32])
198 _APPEND_COMPILE_FLAGS_ERROR([-Wsign-compare])
199 _APPEND_COMPILE_FLAGS_ERROR([-Wstrict-overflow=1])
200 _APPEND_COMPILE_FLAGS_ERROR([-Wstrict-prototypes])
201 _APPEND_COMPILE_FLAGS_ERROR([-Wswitch-enum])
202 _APPEND_COMPILE_FLAGS_ERROR([-Wtrampolines])
203 _APPEND_COMPILE_FLAGS_ERROR([-Wundef])
204 _APPEND_COMPILE_FLAGS_ERROR([-Wunsafe-loop-optimizations])
205 _APPEND_COMPILE_FLAGS_ERROR([-funsafe-loop-optimizations])
206
207 _APPEND_COMPILE_FLAGS_ERROR([-Wclobbered])
208 _APPEND_COMPILE_FLAGS_ERROR([-Wunused])
209 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-result])
210 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-variable])
211 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-parameter])
212 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-local-typedefs])
213 _APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings])
214 _APPEND_COMPILE_FLAGS_ERROR([-fwrapv])
215 _APPEND_COMPILE_FLAGS_ERROR([-pipe])
216 _APPEND_COMPILE_FLAGS_ERROR([-fPIE -pie])
217 _APPEND_COMPILE_FLAGS_ERROR([-Wsizeof-pointer-memaccess])
218 _APPEND_COMPILE_FLAGS_ERROR([-Wpacked])
219 # _APPEND_COMPILE_FLAGS_ERROR([-Wlong-long])
220 # GCC 4.5 removed this.
221 # _APPEND_COMPILE_FLAGS_ERROR([-Wunreachable-code])
222
223 _SET_SANITIZE_FLAGS
224
225 AS_IF([test "x$ax_enable_debug" = xno],
226 [AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
227 [AS_IF([test "x${host_os}" != "xmingw"],
228 [AS_IF([test "x$ac_c_gcc_recent" = xyes],
229 [_APPEND_COMPILE_FLAGS_ERROR([-D_FORTIFY_SOURCE=2])
230 #_APPEND_COMPILE_FLAGS_ERROR([-Wstack-protector])
231 #_APPEND_COMPILE_FLAGS_ERROR([-fstack-protector --param=ssp-buffer-size=4])
232 _APPEND_COMPILE_FLAGS_ERROR([-fstack-protector-all])
233 ])])])])
234
235 AS_IF([test "x$ac_cv_warnings_as_errors" = xyes],
236 [AX_APPEND_FLAG([-Werror])])
237
238 AC_LANG_POP([C])
239 ])
240
241 AC_DEFUN([_HARDEN_CXX_COMPILER_FLAGS],
242 [AC_LANG_PUSH([C++])
243 AS_IF([test "x$ax_enable_debug" = xyes],
244 [CXXFLAGS=''
245 _APPEND_COMPILE_FLAGS_ERROR([-H])
246 _APPEND_COMPILE_FLAGS_ERROR([-g])
247 _APPEND_COMPILE_FLAGS_ERROR([-g3])
248 _APPEND_COMPILE_FLAGS_ERROR([-fno-inline])
249 _APPEND_COMPILE_FLAGS_ERROR([-fno-eliminate-unused-debug-types])
250 _APPEND_COMPILE_FLAGS_ERROR([-fno-omit-frame-pointer])
251 ],[
252 _APPEND_COMPILE_FLAGS_ERROR([-g])
253 _APPEND_COMPILE_FLAGS_ERROR([-O2])
254 ])
255
256 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
257 [_APPEND_COMPILE_FLAGS_ERROR([-fstack-check])
258 # _APPEND_COMPILE_FLAGS_ERROR([--coverage])
259 _APPEND_COMPILE_FLAGS_ERROR([-Wpragmas])
260 _APPEND_COMPILE_FLAGS_ERROR([-Wunknown-pragmas])],
261 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-unknown-pragmas])
262 _APPEND_COMPILE_FLAGS_ERROR([-Wno-pragmas])])
263
264 AS_IF([test "$CXX" = "clang++"],[_APPEND_COMPILE_FLAGS_ERROR([-Qunused-arguments])])
265
266 _APPEND_COMPILE_FLAGS_ERROR([-Wall])
267 _APPEND_COMPILE_FLAGS_ERROR([-Wextra])
268 _APPEND_COMPILE_FLAGS_ERROR([-Weverything])
269 _APPEND_COMPILE_FLAGS_ERROR([-Wthis-test-should-fail])
270 # Anything below this comment please keep sorted.
271 # _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-format-attribute])
272 _APPEND_COMPILE_FLAGS_ERROR([-Wno-attributes])
273 _APPEND_COMPILE_FLAGS_ERROR([-Wvarargs])
274 _APPEND_COMPILE_FLAGS_ERROR([-Waddress])
275 _APPEND_COMPILE_FLAGS_ERROR([-Warray-bounds])
276 _APPEND_COMPILE_FLAGS_ERROR([-Wchar-subscripts])
277 _APPEND_COMPILE_FLAGS_ERROR([-Wcomment])
278 _APPEND_COMPILE_FLAGS_ERROR([-Wctor-dtor-privacy])
279 _APPEND_COMPILE_FLAGS_ERROR([-Wfloat-equal])
280 _APPEND_COMPILE_FLAGS_ERROR([-Wformat=2])
281 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-y2k])
282 _APPEND_COMPILE_FLAGS_ERROR([-Wmaybe-uninitialized])
283 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-field-initializers])
284 _APPEND_COMPILE_FLAGS_ERROR([-Wlogical-op])
285 _APPEND_COMPILE_FLAGS_ERROR([-Wnon-virtual-dtor])
286 _APPEND_COMPILE_FLAGS_ERROR([-Wnormalized=id])
287 _APPEND_COMPILE_FLAGS_ERROR([-Woverloaded-virtual])
288 _APPEND_COMPILE_FLAGS_ERROR([-Wpointer-arith])
289 AS_IF([test "x$MINGW" = xyes],
290 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=const])
291 _APPEND_COMPILE_FLAGS_ERROR([-Wno-missing-noreturn])
292 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-noreturn])
293 _APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=noreturn])
294 _APPEND_COMPILE_FLAGS_ERROR([-Wno-error=suggest-attribute=noreturn])
295 _APPEND_COMPILE_FLAGS_ERROR([-Wno-redundant-decls])],
296 [_APPEND_COMPILE_FLAGS_ERROR([-Wredundant-decls])])
297 _APPEND_COMPILE_FLAGS_ERROR([-Wshadow])
298 _APPEND_COMPILE_FLAGS_ERROR([-Wshorten-64-to-32])
299 _APPEND_COMPILE_FLAGS_ERROR([-Wsign-compare])
300 _APPEND_COMPILE_FLAGS_ERROR([-Wstrict-overflow=1])
301 _APPEND_COMPILE_FLAGS_ERROR([-Wswitch-enum])
302 _APPEND_COMPILE_FLAGS_ERROR([-Wtrampolines])
303 _APPEND_COMPILE_FLAGS_ERROR([-Wundef])
304 _APPEND_COMPILE_FLAGS_ERROR([-Wunsafe-loop-optimizations])
305 _APPEND_COMPILE_FLAGS_ERROR([-funsafe-loop-optimizations])
306 _APPEND_COMPILE_FLAGS_ERROR([-Wc++11-compat])
307 # _APPEND_COMPILE_FLAGS_ERROR([-Weffc++])
308 # _APPEND_COMPILE_FLAGS_ERROR([-Wold-style-cast])
309 _APPEND_COMPILE_FLAGS_ERROR([-Wclobbered])
310 _APPEND_COMPILE_FLAGS_ERROR([-Wunused])
311 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-result])
312 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-variable])
313 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-parameter])
314 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-local-typedefs])
315 _APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings])
316 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-security])
317 _APPEND_COMPILE_FLAGS_ERROR([-fwrapv])
318 _APPEND_COMPILE_FLAGS_ERROR([-pipe])
319 _APPEND_COMPILE_FLAGS_ERROR([-fPIE -pie])
320 _APPEND_COMPILE_FLAGS_ERROR([-Wsizeof-pointer-memaccess])
321 _APPEND_COMPILE_FLAGS_ERROR([-Wpacked])
322 # _APPEND_COMPILE_FLAGS_ERROR([-Wlong-long])
323 # GCC 4.5 removed this.
324 # _APPEND_COMPILE_FLAGS_ERROR([-Wunreachable-code])
325
326 AS_IF([test "x$ax_enable_debug" = xno],
327 [AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
328 [AS_IF([test "x${host_os}" != "xmingw"],
329 [AS_IF([test "x$ac_c_gcc_recent" = xyes],
330 [_APPEND_COMPILE_FLAGS_ERROR([-D_FORTIFY_SOURCE=2])
331 #_APPEND_COMPILE_FLAGS_ERROR([-Wstack-protector])
332 #_APPEND_COMPILE_FLAGS_ERROR([-fstack-protector --param=ssp-buffer-size=4])
333 _APPEND_COMPILE_FLAGS_ERROR([-fstack-protector-all])
334 ])])])])
335
336 _SET_SANITIZE_FLAGS
337
338 AS_IF([test "x$ac_cv_warnings_as_errors" = xyes],
339 [AX_APPEND_FLAG([-Werror])])
340 AC_LANG_POP([C++])
341 ])
342
343 # All of the heavy lifting happens in _HARDEN_LINKER_FLAGS,
344 # _HARDEN_CC_COMPILER_FLAGS, _HARDEN_CXX_COMPILER_FLAGS
345 AC_DEFUN([AX_HARDEN_COMPILER_FLAGS],
346 [AC_PREREQ([2.63])dnl
347 AC_REQUIRE([AC_CANONICAL_HOST])
348 AC_REQUIRE([AX_COMPILER_VERSION])
349 AC_REQUIRE([AX_ASSERT])
350 _WARNINGS_AS_ERRORS
351 _AX_HARDEN_SANITIZE
352
353 AC_REQUIRE([gl_VISIBILITY])
354 AS_IF([test -n "$CFLAG_VISIBILITY"],[CPPFLAGS="$CPPFLAGS $CFLAG_VISIBILITY"])
355
356 _WARNINGS_AS_ERRORS
357 _HARDEN_LINKER_FLAGS
358 _HARDEN_CC_COMPILER_FLAGS
359 _HARDEN_CXX_COMPILER_FLAGS
360 ])
361