1 /* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */ 2 /* 3 * Copyright (c) 1993, 1994, 1995, 1996, 1997 4 * The Regents of the University of California. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by the Computer Systems 17 * Engineering Group at Lawrence Berkeley Laboratory. 18 * 4. Neither the name of the University nor of the Laboratory may be used 19 * to endorse or promote products derived from this software without 20 * specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 #ifndef _diag_control_h 36 #define _diag_control_h 37 38 #include "pcap/compiler-tests.h" 39 40 #if PCAP_IS_AT_LEAST_CLANG_VERSION(2,8) || \ 41 PCAP_IS_AT_LEAST_GNUC_VERSION(4,6) || \ 42 PCAP_IS_AT_LEAST_SUNC_VERSION(5,5) 43 /* 44 * All these compilers support this way of putting pragmas into #defines. 45 * We use it only if we have a compiler that supports it; see below 46 * for the code that uses it and the #defines that control whether 47 * that code is used. 48 */ 49 #define PCAP_DO_PRAGMA(x) _Pragma (#x) 50 #endif 51 52 /* 53 * Suppress "enum value not explicitly handled in switch" warnings. 54 * We may have to build on multiple different Windows SDKs, so we 55 * may not be able to include all enum values in a switch, as they 56 * won't necessarily be defined on all the SDKs, and, unlike 57 * #defines, there's no easy way to test whether a given enum has 58 * a given value. It *could* be done by the configure script or 59 * CMake tests. 60 */ 61 #if defined(_MSC_VER) 62 #define DIAG_OFF_ENUM_SWITCH \ 63 __pragma(warning(push)) \ 64 __pragma(warning(disable:4061)) 65 #define DIAG_ON_ENUM_SWITCH \ 66 __pragma(warning(pop)) 67 #endif 68 69 /* 70 * Suppress "switch statement has only a default case" warnings. 71 * There's a switch in bpf_filter.c that only has additional 72 * cases on Linux. 73 */ 74 #if defined(_MSC_VER) 75 #define DIAG_OFF_DEFAULT_ONLY_SWITCH \ 76 __pragma(warning(push)) \ 77 __pragma(warning(disable:4065)) 78 #define DIAG_ON_DEFAULT_ONLY_SWITCH \ 79 __pragma(warning(pop)) 80 #endif 81 82 /* 83 * Suppress Flex, narrowing, and deprecation warnings. 84 */ 85 #if PCAP_IS_AT_LEAST_CLANG_VERSION(2,8) 86 /* 87 * This is Clang 2.8 or later; we can use "clang diagnostic 88 * ignored -Wxxx" and "clang diagnostic push/pop". 89 * 90 * Suppress -Wdocumentation warnings; GCC doesn't support -Wdocumentation, 91 * at least according to the GCC 7.3 documentation. Apparently, Flex 92 * generates code that upsets at least some versions of Clang's 93 * -Wdocumentation. 94 * 95 * (This could be clang-cl, which defines _MSC_VER, so test this 96 * before testing _MSC_VER.) 97 */ 98 #define DIAG_OFF_FLEX \ 99 PCAP_DO_PRAGMA(clang diagnostic push) \ 100 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wsign-compare") \ 101 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wdocumentation") \ 102 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wshorten-64-to-32") \ 103 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wmissing-noreturn") \ 104 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wunused-parameter") \ 105 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wunreachable-code") 106 #define DIAG_ON_FLEX \ 107 PCAP_DO_PRAGMA(clang diagnostic pop) 108 109 /* 110 * Suppress the only narrowing warnings you get from Clang. 111 */ 112 #define DIAG_OFF_NARROWING \ 113 PCAP_DO_PRAGMA(clang diagnostic push) \ 114 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wshorten-64-to-32") 115 116 #define DIAG_ON_NARROWING \ 117 PCAP_DO_PRAGMA(clang diagnostic pop) 118 119 /* 120 * Suppress deprecation warnings. 121 */ 122 #define DIAG_OFF_DEPRECATION \ 123 PCAP_DO_PRAGMA(clang diagnostic push) \ 124 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wdeprecated-declarations") 125 #define DIAG_ON_DEPRECATION \ 126 PCAP_DO_PRAGMA(clang diagnostic pop) 127 128 /* 129 * When Clang correctly detects an old-style function prototype after 130 * preprocessing, the warning can be irrelevant to this source tree because 131 * the prototype comes from a system header macro. 132 */ 133 #if PCAP_IS_AT_LEAST_CLANG_VERSION(5,0) 134 #define DIAG_OFF_STRICT_PROTOTYPES \ 135 PCAP_DO_PRAGMA(clang diagnostic push) \ 136 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wstrict-prototypes") 137 #define DIAG_ON_STRICT_PROTOTYPES \ 138 PCAP_DO_PRAGMA(clang diagnostic pop) 139 #endif 140 141 #define DIAG_OFF_DOCUMENTATION \ 142 PCAP_DO_PRAGMA(clang diagnostic push) \ 143 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wdocumentation") 144 #define DIAG_ON_DOCUMENTATION \ 145 PCAP_DO_PRAGMA(clang diagnostic pop) 146 147 #define DIAG_OFF_SIGN_COMPARE \ 148 PCAP_DO_PRAGMA(clang diagnostic push) \ 149 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wsign-compare") 150 #define DIAG_ON_SIGN_COMPARE \ 151 PCAP_DO_PRAGMA(clang diagnostic pop) 152 #elif defined(_MSC_VER) 153 /* 154 * This is Microsoft Visual Studio; we can use __pragma(warning(disable:XXXX)) 155 * and __pragma(warning(push/pop)). 156 * 157 * Suppress signed-vs-unsigned comparison, narrowing, and unreachable 158 * code warnings. 159 */ 160 #define DIAG_OFF_FLEX \ 161 __pragma(warning(push)) \ 162 __pragma(warning(disable:4127)) \ 163 __pragma(warning(disable:4242)) \ 164 __pragma(warning(disable:4244)) \ 165 __pragma(warning(disable:4702)) 166 #define DIAG_ON_FLEX \ 167 __pragma(warning(pop)) 168 169 /* 170 * Suppress narrowing warnings. 171 */ 172 #define DIAG_OFF_NARROWING \ 173 __pragma(warning(push)) \ 174 __pragma(warning(disable:4242)) \ 175 __pragma(warning(disable:4311)) 176 #define DIAG_ON_NARROWING \ 177 __pragma(warning(pop)) 178 179 /* 180 * Suppress deprecation warnings. 181 */ 182 #define DIAG_OFF_DEPRECATION \ 183 __pragma(warning(push)) \ 184 __pragma(warning(disable:4996)) 185 #define DIAG_ON_DEPRECATION \ 186 __pragma(warning(pop)) 187 #elif PCAP_IS_AT_LEAST_GNUC_VERSION(4,6) 188 /* 189 * This is GCC 4.6 or later, or a compiler claiming to be that. 190 * We can use "GCC diagnostic ignored -Wxxx" (introduced in 4.2) 191 * and "GCC diagnostic push/pop" (introduced in 4.6). 192 */ 193 #define DIAG_OFF_FLEX \ 194 PCAP_DO_PRAGMA(GCC diagnostic push) \ 195 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wsign-compare") \ 196 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wunused-parameter") \ 197 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wunreachable-code") 198 #define DIAG_ON_FLEX \ 199 PCAP_DO_PRAGMA(GCC diagnostic pop) 200 201 /* 202 * GCC currently doesn't issue any narrowing warnings. 203 */ 204 205 /* 206 * Suppress deprecation warnings. 207 */ 208 #define DIAG_OFF_DEPRECATION \ 209 PCAP_DO_PRAGMA(GCC diagnostic push) \ 210 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wdeprecated-declarations") 211 #define DIAG_ON_DEPRECATION \ 212 PCAP_DO_PRAGMA(GCC diagnostic pop) 213 214 /* 215 * Suppress format-truncation= warnings. 216 * GCC 7.1 had introduced this warning option. Earlier versions (at least 217 * one particular copy of GCC 4.6.4) treat the request as a warning. 218 */ 219 #if PCAP_IS_AT_LEAST_GNUC_VERSION(7,1) 220 #define DIAG_OFF_FORMAT_TRUNCATION \ 221 PCAP_DO_PRAGMA(GCC diagnostic push) \ 222 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wformat-truncation=") 223 #define DIAG_ON_FORMAT_TRUNCATION \ 224 PCAP_DO_PRAGMA(GCC diagnostic pop) 225 #endif 226 #elif PCAP_IS_AT_LEAST_SUNC_VERSION(5,5) 227 /* 228 * Sun C compiler version 5.5 (Studio version 8) and later supports "#pragma 229 * error_messages()". 230 */ 231 #define DIAG_OFF_FLEX \ 232 PCAP_DO_PRAGMA(error_messages(off,E_STATEMENT_NOT_REACHED)) 233 #define DIAG_ON_FLEX \ 234 PCAP_DO_PRAGMA(error_messages(default,E_STATEMENT_NOT_REACHED)) 235 #endif 236 237 #ifdef YYBYACC 238 /* 239 * Berkeley YACC. 240 * 241 * It generates a global declaration of yylval, or the appropriately 242 * prefixed version of yylval, in grammar.h, *even though it's been 243 * told to generate a pure parser, meaning it doesn't have any global 244 * variables*. Bison doesn't do this. 245 * 246 * That causes a warning due to the local declaration in the parser 247 * shadowing the global declaration. 248 * 249 * So, if the compiler warns about that, we turn off -Wshadow warnings. 250 * 251 * In addition, the generated code may have functions with unreachable 252 * code, so suppress warnings about those. 253 */ 254 #if PCAP_IS_AT_LEAST_CLANG_VERSION(2,8) 255 /* 256 * This is Clang 2.8 or later (including clang-cl, so test this 257 * before _MSC_VER); we can use "clang diagnostic ignored -Wxxx". 258 */ 259 #define DIAG_OFF_BISON_BYACC \ 260 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wshadow") \ 261 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wunreachable-code") 262 #elif defined(_MSC_VER) 263 /* 264 * This is Microsoft Visual Studio; we can use 265 * __pragma(warning(disable:XXXX)). 266 */ 267 #define DIAG_OFF_BISON_BYACC \ 268 __pragma(warning(disable:4702)) 269 #elif PCAP_IS_AT_LEAST_GNUC_VERSION(4,6) 270 /* 271 * This is GCC 4.6 or later, or a compiler claiming to be that. 272 * We can use "GCC diagnostic ignored -Wxxx" (introduced in 4.2, 273 * but it may not actually work very well prior to 4.6). 274 */ 275 #define DIAG_OFF_BISON_BYACC \ 276 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wshadow") \ 277 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wunreachable-code") 278 #endif 279 #else 280 /* 281 * Bison. 282 * 283 * The generated code may have functions with unreachable code and 284 * switches with only a default case, so suppress warnings about those. 285 */ 286 #if PCAP_IS_AT_LEAST_CLANG_VERSION(2,8) 287 /* 288 * This is Clang 2.8 or later (including clang-cl, so test this 289 * before _MSC_VER); we can use "clang diagnostic ignored -Wxxx". 290 */ 291 #define DIAG_OFF_BISON_BYACC \ 292 PCAP_DO_PRAGMA(clang diagnostic ignored "-Wunreachable-code") 293 #elif defined(_MSC_VER) 294 /* 295 * This is Microsoft Visual Studio; we can use 296 * __pragma(warning(disable:XXXX)). 297 * 298 * Suppress some /Wall warnings. 299 */ 300 #define DIAG_OFF_BISON_BYACC \ 301 __pragma(warning(disable:4065)) \ 302 __pragma(warning(disable:4127)) \ 303 __pragma(warning(disable:4242)) \ 304 __pragma(warning(disable:4244)) \ 305 __pragma(warning(disable:4702)) 306 #elif PCAP_IS_AT_LEAST_GNUC_VERSION(4,6) 307 /* 308 * This is GCC 4.6 or later, or a compiler claiming to be that. 309 * We can use "GCC diagnostic ignored -Wxxx" (introduced in 4.2, 310 * but it may not actually work very well prior to 4.6). 311 */ 312 #define DIAG_OFF_BISON_BYACC \ 313 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wunreachable-code") 314 #elif PCAP_IS_AT_LEAST_SUNC_VERSION(5,5) 315 /* 316 * Same as for DIAG_OFF_FLEX above. 317 */ 318 #define DIAG_OFF_BISON_BYACC \ 319 PCAP_DO_PRAGMA(error_messages(off,E_STATEMENT_NOT_REACHED)) 320 #endif 321 #endif 322 323 #if PCAP_IS_AT_LEAST_CLANG_VERSION(2,8) 324 /* 325 * Clang appears to let you ignore a result without a warning by 326 * casting the function result to void, so we don't appear to 327 * need this for Clang. 328 */ 329 #elif PCAP_IS_AT_LEAST_GNUC_VERSION(4,5) 330 /* 331 * GCC warns about unused return values if a function is marked as 332 * "warn about ignoring this function's return value". 333 */ 334 #define DIAG_OFF_WARN_UNUSED_RESULT \ 335 PCAP_DO_PRAGMA(GCC diagnostic push) \ 336 PCAP_DO_PRAGMA(GCC diagnostic ignored "-Wunused-result") 337 #define DIAG_ON_WARN_UNUSED_RESULT \ 338 PCAP_DO_PRAGMA(GCC diagnostic pop) 339 340 /* 341 * GCC does not currently generate any -Wstrict-prototypes warnings that 342 * would need silencing as is done for Clang above. 343 */ 344 #endif 345 346 /* 347 * GCC needs this on AIX for longjmp(). 348 */ 349 #if PCAP_IS_AT_LEAST_GNUC_VERSION(5,1) 350 /* 351 * Beware that the effect of this builtin is more than just squelching the 352 * warning! GCC trusts it enough for the process to segfault if the control 353 * flow reaches the builtin (an infinite empty loop in the same context would 354 * squelch the warning and ruin the process too, albeit in a different way). 355 * So please remember to use this very carefully. 356 */ 357 #define PCAP_UNREACHABLE __builtin_unreachable(); 358 #endif 359 360 #ifndef DIAG_OFF_ENUM_SWITCH 361 #define DIAG_OFF_ENUM_SWITCH 362 #endif 363 #ifndef DIAG_ON_ENUM_SWITCH 364 #define DIAG_ON_ENUM_SWITCH 365 #endif 366 #ifndef DIAG_OFF_DEFAULT_ONLY_SWITCH 367 #define DIAG_OFF_DEFAULT_ONLY_SWITCH 368 #endif 369 #ifndef DIAG_ON_DEFAULT_ONLY_SWITCH 370 #define DIAG_ON_DEFAULT_ONLY_SWITCH 371 #endif 372 #ifndef DIAG_OFF_FLEX 373 #define DIAG_OFF_FLEX 374 #endif 375 #ifndef DIAG_ON_FLEX 376 #define DIAG_ON_FLEX 377 #endif 378 #ifndef DIAG_OFF_NARROWING 379 #define DIAG_OFF_NARROWING 380 #endif 381 #ifndef DIAG_ON_NARROWING 382 #define DIAG_ON_NARROWING 383 #endif 384 #ifndef DIAG_OFF_DEPRECATION 385 #define DIAG_OFF_DEPRECATION 386 #endif 387 #ifndef DIAG_ON_DEPRECATION 388 #define DIAG_ON_DEPRECATION 389 #endif 390 #ifndef DIAG_OFF_FORMAT_TRUNCATION 391 #define DIAG_OFF_FORMAT_TRUNCATION 392 #endif 393 #ifndef DIAG_ON_FORMAT_TRUNCATION 394 #define DIAG_ON_FORMAT_TRUNCATION 395 #endif 396 #ifndef DIAG_OFF_BISON_BYACC 397 #define DIAG_OFF_BISON_BYACC 398 #endif 399 // 400 // DIAG_ON_BISON_BYACC does not need to be defined. 401 // 402 #ifndef DIAG_OFF_WARN_UNUSED_RESULT 403 #define DIAG_OFF_WARN_UNUSED_RESULT 404 #endif 405 #ifndef DIAG_ON_WARN_UNUSED_RESULT 406 #define DIAG_ON_WARN_UNUSED_RESULT 407 #endif 408 #ifndef DIAG_OFF_STRICT_PROTOTYPES 409 #define DIAG_OFF_STRICT_PROTOTYPES 410 #endif 411 #ifndef DIAG_ON_STRICT_PROTOTYPES 412 #define DIAG_ON_STRICT_PROTOTYPES 413 #endif 414 #ifndef DIAG_OFF_DOCUMENTATION 415 #define DIAG_OFF_DOCUMENTATION 416 #endif 417 #ifndef DIAG_ON_DOCUMENTATION 418 #define DIAG_ON_DOCUMENTATION 419 #endif 420 #ifndef DIAG_OFF_SIGN_COMPARE 421 #define DIAG_OFF_SIGN_COMPARE 422 #endif 423 #ifndef DIAG_ON_SIGN_COMPARE 424 #define DIAG_ON_SIGN_COMPARE 425 #endif 426 #ifndef PCAP_UNREACHABLE 427 #define PCAP_UNREACHABLE 428 #endif 429 430 #endif /* _diag_control_h */ 431