m4: skip -fsanitize=object-size on clang
[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=return])
77 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=shift])
78 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=signed-integer-overflow])
79 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=unreachable])
80 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=unsigned-integer-overflow])
81 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=vla-bound])
82 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=vptr])
83 AS_IF([test "$ax_cv_c_compiler_vendor" != "clang"],[
84 _APPEND_COMPILE_FLAGS_ERROR([-fsanitize=object-size])
85 ])
86 ])
87 ])
88 ])
89 ])
90
91 # Note: Should this be LIBS or LDFLAGS?
92 AC_DEFUN([_APPEND_LINK_FLAGS_ERROR],
93 [AX_APPEND_LINK_FLAGS([$1],[LDFLAGS],[-Werror])
94 ])
95
96 AC_DEFUN([_APPEND_COMPILE_FLAGS_ERROR],
97 [AX_APPEND_COMPILE_FLAGS([$1],,[-Werror])
98 ])
99
100 # Everything above this does the heavy lifting, while what follows does the specifics.
101
102 AC_DEFUN([_HARDEN_LINKER_FLAGS],
103 [AS_IF([test "$ax_cv_c_compiler_vendor" != "clang"],
104 [_APPEND_LINK_FLAGS_ERROR(["-z relro" "-z now"])
105 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
106 [_APPEND_LINK_FLAGS_ERROR([-rdynamic])
107 # AX_APPEND_LINK_FLAGS([--coverage])])
108 AS_IF([test "x$ac_cv_warnings_as_errors" = xyes],[AX_APPEND_LINK_FLAGS([-Werror])])
109 ])
110 ])
111
112 AC_DEFUN([_AX_HARDEN_SANITIZE],
113 [AC_REQUIRE([AX_DEBUG])
114 AC_ARG_WITH([sanitize],
115 [AS_HELP_STRING([--with-sanitize],
116 [Enable sanitize flag for compiler if it supports them @<:@default=no@:>@])],
117 [AS_CASE([$with_sanitize],
118 [thread],[
119 ax_harden_sanitize='thread'],
120 [address],[
121 ax_harden_sanitize='address'],
122 [ax_harden_sanitize='rest'])
123 ],
124 [AS_IF([test "x$ax_enable_debug" = xyes],[ax_harden_sanitize='rest'])])
125 ])
126
127 AC_DEFUN([_HARDEN_CC_COMPILER_FLAGS],
128 [AC_LANG_PUSH([C])dnl
129
130 AS_IF([test "x$ax_enable_debug" = xyes],
131 [
132 #_APPEND_COMPILE_FLAGS_ERROR([-H])
133 _APPEND_COMPILE_FLAGS_ERROR([-g])
134 _APPEND_COMPILE_FLAGS_ERROR([-g3])
135 _APPEND_COMPILE_FLAGS_ERROR([-fno-eliminate-unused-debug-types])
136 _APPEND_COMPILE_FLAGS_ERROR([-fno-omit-frame-pointer])
137 ],[
138 _APPEND_COMPILE_FLAGS_ERROR([-g])
139 _APPEND_COMPILE_FLAGS_ERROR([-O2])
140 ])
141
142 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
143 [_APPEND_COMPILE_FLAGS_ERROR([-fstack-check])
144 # _APPEND_COMPILE_FLAGS_ERROR([--coverage])
145 _APPEND_COMPILE_FLAGS_ERROR([-Wpragmas])
146 _APPEND_COMPILE_FLAGS_ERROR([-Wunknown-pragmas])],
147 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-unknown-pragmas])
148 _APPEND_COMPILE_FLAGS_ERROR([-Wno-pragmas])])
149
150 AS_IF([test "$ax_cv_c_compiler_vendor" = "clang"],[_APPEND_COMPILE_FLAGS_ERROR([-Qunused-arguments])])
151
152 _APPEND_COMPILE_FLAGS_ERROR([-Wall])
153 _APPEND_COMPILE_FLAGS_ERROR([-Wextra])
154 _APPEND_COMPILE_FLAGS_ERROR([-Weverything])
155 _APPEND_COMPILE_FLAGS_ERROR([-Wthis-test-should-fail])
156 # Anything below this comment please keep sorted.
157 # _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-format-attribute])
158 _APPEND_COMPILE_FLAGS_ERROR([-Wno-attributes])
159 _APPEND_COMPILE_FLAGS_ERROR([-Waddress])
160 _APPEND_COMPILE_FLAGS_ERROR([-Wvarargs])
161 _APPEND_COMPILE_FLAGS_ERROR([-Warray-bounds])
162 _APPEND_COMPILE_FLAGS_ERROR([-Wbad-function-cast])
163 # Not in use -Wc++-compat
164 _APPEND_COMPILE_FLAGS_ERROR([-Wchar-subscripts])
165 _APPEND_COMPILE_FLAGS_ERROR([-Wcomment])
166 _APPEND_COMPILE_FLAGS_ERROR([-Wfloat-equal])
167 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-security])
168 _APPEND_COMPILE_FLAGS_ERROR([-Wformat=2])
169 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-y2k])
170 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-field-initializers])
171 AS_IF([test "x$MINGW" = xyes],
172 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-missing-noreturn])],
173 [_APPEND_COMPILE_FLAGS_ERROR([-Wmissing-noreturn])])
174 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-prototypes])
175 _APPEND_COMPILE_FLAGS_ERROR([-Wnested-externs])
176 _APPEND_COMPILE_FLAGS_ERROR([-Wpointer-arith])
177 _APPEND_COMPILE_FLAGS_ERROR([-Wpointer-sign])
178 AS_IF([test "x$MINGW" = xyes],
179 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=const])
180 _APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=noreturn])
181 _APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=pure])
182 _APPEND_COMPILE_FLAGS_ERROR([-Wno-redundant-decls])],
183 [_APPEND_COMPILE_FLAGS_ERROR([-Wredundant-decls])])
184 _APPEND_COMPILE_FLAGS_ERROR([-Wshadow])
185 _APPEND_COMPILE_FLAGS_ERROR([-Wshorten-64-to-32])
186 _APPEND_COMPILE_FLAGS_ERROR([-Wsign-compare])
187 _APPEND_COMPILE_FLAGS_ERROR([-Wstrict-overflow=1])
188 _APPEND_COMPILE_FLAGS_ERROR([-Wstrict-prototypes])
189 _APPEND_COMPILE_FLAGS_ERROR([-Wswitch-enum])
190 _APPEND_COMPILE_FLAGS_ERROR([-Wundef])
191
192 _APPEND_COMPILE_FLAGS_ERROR([-Wunused])
193 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-result])
194 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-variable])
195 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-parameter])
196 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-local-typedefs])
197 _APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings])
198 _APPEND_COMPILE_FLAGS_ERROR([-fwrapv])
199 _APPEND_COMPILE_FLAGS_ERROR([-fmudflapt])
200 _APPEND_COMPILE_FLAGS_ERROR([-pipe])
201 AS_IF([test "x$MINGW" = xyes],
202 [],
203 [_APPEND_COMPILE_FLAGS_ERROR([-fPIE -pie])])
204 _APPEND_COMPILE_FLAGS_ERROR([-Wsizeof-pointer-memaccess])
205 _APPEND_COMPILE_FLAGS_ERROR([-Wpacked])
206 _APPEND_COMPILE_FLAGS_ERROR([-Wlong-long])
207 _APPEND_COMPILE_FLAGS_ERROR([-ftrapv])
208 # Stop error when using -pie on library builds
209 _APPEND_COMPILE_FLAGS_ERROR([-Wno-unused-command-line-argument])
210 # GCC 4.5 removed this.
211 # _APPEND_COMPILE_FLAGS_ERROR([-Wunreachable-code])
212
213 _SET_SANITIZE_FLAGS
214
215 AS_IF([test "x$ax_enable_debug" = xno],
216 [AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
217 [AS_IF([test "x${host_os}" != "xmingw"],
218 [AS_IF([test "x$ac_c_gcc_recent" = xyes],
219 [_APPEND_COMPILE_FLAGS_ERROR([-D_FORTIFY_SOURCE=2])
220 #_APPEND_COMPILE_FLAGS_ERROR([-Wstack-protector])
221 #_APPEND_COMPILE_FLAGS_ERROR([-fstack-protector --param=ssp-buffer-size=4])
222 _APPEND_COMPILE_FLAGS_ERROR([-fstack-protector-all])
223 ])])])])
224
225 AS_IF([test "x$ac_cv_warnings_as_errors" = xyes],
226 [AX_APPEND_COMPILE_FLAGS([-Werror])])
227
228 AC_LANG_POP([C])
229 ])
230
231 AC_DEFUN([_HARDEN_CXX_COMPILER_FLAGS],
232 [AC_LANG_PUSH([C++])
233 AS_IF([test "x$ax_enable_debug" = xyes],
234 [CXXFLAGS=''
235 #_APPEND_COMPILE_FLAGS_ERROR([-H])
236 _APPEND_COMPILE_FLAGS_ERROR([-g])
237 _APPEND_COMPILE_FLAGS_ERROR([-g3])
238 _APPEND_COMPILE_FLAGS_ERROR([-fno-inline])
239 _APPEND_COMPILE_FLAGS_ERROR([-fno-eliminate-unused-debug-types])
240 _APPEND_COMPILE_FLAGS_ERROR([-fno-omit-frame-pointer])
241 ],[
242 _APPEND_COMPILE_FLAGS_ERROR([-g])
243 _APPEND_COMPILE_FLAGS_ERROR([-O2])
244 ])
245
246 AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
247 [_APPEND_COMPILE_FLAGS_ERROR([-fstack-check])
248 # _APPEND_COMPILE_FLAGS_ERROR([--coverage])
249 _APPEND_COMPILE_FLAGS_ERROR([-Wpragmas])
250 _APPEND_COMPILE_FLAGS_ERROR([-Wunknown-pragmas])],
251 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-unknown-pragmas])
252 _APPEND_COMPILE_FLAGS_ERROR([-Wno-pragmas])])
253
254 AS_IF([test "$ax_cv_c_compiler_vendor" = "clang"],[_APPEND_COMPILE_FLAGS_ERROR([-Qunused-arguments])])
255
256 _APPEND_COMPILE_FLAGS_ERROR([-Wall])
257 _APPEND_COMPILE_FLAGS_ERROR([-Wextra])
258 _APPEND_COMPILE_FLAGS_ERROR([-Weverything])
259 _APPEND_COMPILE_FLAGS_ERROR([-Wthis-test-should-fail])
260 # Anything below this comment please keep sorted.
261 # _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-format-attribute])
262 _APPEND_COMPILE_FLAGS_ERROR([-Wno-attributes])
263 _APPEND_COMPILE_FLAGS_ERROR([-Wvarargs])
264 _APPEND_COMPILE_FLAGS_ERROR([-Waddress])
265 _APPEND_COMPILE_FLAGS_ERROR([-Warray-bounds])
266 _APPEND_COMPILE_FLAGS_ERROR([-Wchar-subscripts])
267 _APPEND_COMPILE_FLAGS_ERROR([-Wcomment])
268 _APPEND_COMPILE_FLAGS_ERROR([-Wctor-dtor-privacy])
269 _APPEND_COMPILE_FLAGS_ERROR([-Wfloat-equal])
270 _APPEND_COMPILE_FLAGS_ERROR([-Wformat=2])
271 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-y2k])
272 _APPEND_COMPILE_FLAGS_ERROR([-Wmaybe-uninitialized])
273 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-field-initializers])
274 _APPEND_COMPILE_FLAGS_ERROR([-Wlogical-op])
275 _APPEND_COMPILE_FLAGS_ERROR([-Wnon-virtual-dtor])
276 _APPEND_COMPILE_FLAGS_ERROR([-Wnormalized=id])
277 _APPEND_COMPILE_FLAGS_ERROR([-Woverloaded-virtual])
278 _APPEND_COMPILE_FLAGS_ERROR([-Wpointer-arith])
279 AS_IF([test "x$MINGW" = xyes],
280 [_APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=const])
281 _APPEND_COMPILE_FLAGS_ERROR([-Wno-missing-noreturn])
282 _APPEND_COMPILE_FLAGS_ERROR([-Wmissing-noreturn])
283 _APPEND_COMPILE_FLAGS_ERROR([-Wno-suggest-attribute=noreturn])
284 _APPEND_COMPILE_FLAGS_ERROR([-Wno-error=suggest-attribute=noreturn])
285 _APPEND_COMPILE_FLAGS_ERROR([-Wno-redundant-decls])],
286 [_APPEND_COMPILE_FLAGS_ERROR([-Wredundant-decls])])
287 _APPEND_COMPILE_FLAGS_ERROR([-Wshadow])
288 _APPEND_COMPILE_FLAGS_ERROR([-Wshorten-64-to-32])
289 _APPEND_COMPILE_FLAGS_ERROR([-Wsign-compare])
290 _APPEND_COMPILE_FLAGS_ERROR([-Wstrict-overflow=1])
291 _APPEND_COMPILE_FLAGS_ERROR([-Wswitch-enum])
292 _APPEND_COMPILE_FLAGS_ERROR([-Wtrampolines])
293 _APPEND_COMPILE_FLAGS_ERROR([-Wundef])
294 _APPEND_COMPILE_FLAGS_ERROR([-Wunsafe-loop-optimizations])
295 _APPEND_COMPILE_FLAGS_ERROR([-funsafe-loop-optimizations])
296 _APPEND_COMPILE_FLAGS_ERROR([-Wc++11-compat])
297 # Disabled due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55837
298 # _APPEND_COMPILE_FLAGS_ERROR([-Weffc++])
299 _APPEND_COMPILE_FLAGS_ERROR([-Wold-style-cast])
300 _APPEND_COMPILE_FLAGS_ERROR([-Wclobbered])
301 _APPEND_COMPILE_FLAGS_ERROR([-Wunused])
302 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-result])
303 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-variable])
304 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-parameter])
305 _APPEND_COMPILE_FLAGS_ERROR([-Wunused-local-typedefs])
306 _APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings])
307 _APPEND_COMPILE_FLAGS_ERROR([-Wformat-security])
308 _APPEND_COMPILE_FLAGS_ERROR([-fwrapv])
309 _APPEND_COMPILE_FLAGS_ERROR([-fmudflapt])
310 _APPEND_COMPILE_FLAGS_ERROR([-pipe])
311 AS_IF([test "x$MINGW" = xyes],
312 [],
313 [_APPEND_COMPILE_FLAGS_ERROR([-fPIE -pie])])
314 _APPEND_COMPILE_FLAGS_ERROR([-Wsizeof-pointer-memaccess])
315 _APPEND_COMPILE_FLAGS_ERROR([-Wpacked])
316 _APPEND_COMPILE_FLAGS_ERROR([-Wlong-long])
317 # GCC 4.5 removed this.
318 # _APPEND_COMPILE_FLAGS_ERROR([-Wunreachable-code])
319
320 AS_IF([test "x$ax_enable_debug" = xno],
321 [AS_IF([test "x$ac_cv_vcs_checkout" = xyes],
322 [AS_IF([test "x${host_os}" != "xmingw"],
323 [AS_IF([test "x$ac_c_gcc_recent" = xyes],
324 [_APPEND_COMPILE_FLAGS_ERROR([-D_FORTIFY_SOURCE=2])
325 #_APPEND_COMPILE_FLAGS_ERROR([-Wstack-protector])
326 #_APPEND_COMPILE_FLAGS_ERROR([-fstack-protector --param=ssp-buffer-size=4])
327 _APPEND_COMPILE_FLAGS_ERROR([-fstack-protector-all])
328 ])])])])
329
330 _SET_SANITIZE_FLAGS
331
332 AS_IF([test "x$ac_cv_warnings_as_errors" = xyes],
333 [AX_APPEND_COMPILE_FLAGS([-Werror])])
334 AC_LANG_POP([C++])
335 ])
336
337 # All of the heavy lifting happens in _HARDEN_LINKER_FLAGS,
338 # _HARDEN_CC_COMPILER_FLAGS, _HARDEN_CXX_COMPILER_FLAGS
339 AC_DEFUN([AX_HARDEN_COMPILER_FLAGS],
340 [AC_PREREQ([2.63])dnl
341 AC_REQUIRE([AC_CANONICAL_HOST])
342 AC_REQUIRE([AX_COMPILER_VERSION])
343 AC_REQUIRE([AX_DEBUG])
344 AC_REQUIRE([AX_ASSERT])
345 _AX_HARDEN_SANITIZE
346
347 AC_REQUIRE([gl_VISIBILITY])
348 AS_IF([test -n "$CFLAG_VISIBILITY"],[CPPFLAGS="$CPPFLAGS $CFLAG_VISIBILITY"])
349
350 _HARDEN_LINKER_FLAGS
351 _HARDEN_CC_COMPILER_FLAGS
352 _HARDEN_CXX_COMPILER_FLAGS
353 ])
354