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