Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/libpcap/diag-control.h
39478 views
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
432