Coverage Report

Created: 2026-07-24 06:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/postfix/postfix/include/check_arg.h
Line
Count
Source
1
#ifndef _CHECK_ARG_INCLUDED_
2
#define _CHECK_ARG_INCLUDED_
3
4
/*++
5
/* NAME
6
/*  check_arg 3h
7
/* SUMMARY
8
/*  type checking/narrowing/widening for unprototyped arguments
9
/* SYNOPSIS
10
/*  #include <check_arg.h>
11
/*
12
/*  /* Example checking infrastructure for int, int *, const int *. */
13
/*  CHECK_VAL_HELPER_DCL(tag, int);
14
/*  CHECK_PTR_HELPER_DCL(tag, int);
15
/*  CHECK_CPTR_HELPER_DCL(tag, int);
16
/*
17
/*  /* Example variables with type int, int *, const int *. */
18
/*  int int_val;
19
/*  int *int_ptr;
20
/*  const int *int_cptr;
21
/*
22
/*  /* Example variadic function with type-flag arguments. */
23
/*  func(FLAG_INT_VAL, CHECK_VAL(tag, int, int_val),
24
/*       FLAG_INT_PTR, CHECK_PTR(tag, int, int_ptr),
25
/*       FLAG_INT_CPTR, CHECK_CPTR(tag, int, int_cptr)
26
/*       FLAG_END);
27
/* DESCRIPTION
28
/*  This module implements wrappers for unprototyped function
29
/*  arguments, to enable the same type checking, type narrowing,
30
/*  and type widening as for prototyped function arguments. The
31
/*  wrappers may also be useful in other contexts.
32
/*
33
/*  Typically, these wrappers are hidden away in a per-module
34
/*  header file that is read by the consumers of that module.
35
/*  To protect consumers against name collisions between wrappers
36
/*  in different header files, wrappers should be called with
37
/*  a distinct per-module tag value.  The tag syntax is that
38
/*  of a C identifier.
39
/*
40
/*  Use CHECK_VAL(tag, type, argument) for arguments with a
41
/*  basic type: int, long, etc., and types defined with "typedef"
42
/*  where indirection is built into the type itself (for example,
43
/*  the result of "typedef int *foo" or function pointer
44
/*  typedefs).
45
/*
46
/*  Use CHECK_PTR(tag, type, argument) for non-const pointer
47
/*  arguments, CHECK_CPTR(tag, type, argument) for const pointer
48
/*  arguments, and CHECK_PPTR(tag, type, argument) for pointer-
49
/*  to-pointer arguments.
50
/*
51
/*  Use CHECK_*_HELPER_DCL(tag, type) to provide the
52
/*  checking infrastructure for all CHECK_*(tag, type, ...)
53
/*  instances with the same *, tag and type. Depending on
54
/*  the compilation environment, the infrastructure consists
55
/*  of an inline function definition or a dummy assignment
56
/*  target declaration.
57
/*
58
/*  The compiler should report the following problems:
59
/* .IP \(bu
60
/*  Const pointer argument where a non-const pointer is expected.
61
/* .IP \(bu
62
/*  Pointer argument where a non-pointer is expected and
63
/*  vice-versa.
64
/* .IP \(bu
65
/*  Pointer/pointer type mismatches except void/non-void pointers.
66
/*  Just like function prototypes, all CHECK_*PTR() wrappers
67
/*  cast their result to the desired type.
68
/* .IP \(bu
69
/*  Non-constant non-pointer argument where a pointer is expected.
70
/*. PP
71
/*  Just like function prototypes, the CHECK_*PTR() wrappers
72
/*  handle "bare" numerical constants by casting their argument
73
/*  to the desired pointer type.
74
/*
75
/*  Just like function prototypes, the CHECK_VAL() wrapper
76
/*  cannot force the caller to specify a particular non-pointer
77
/*  type and casts its argument value to the desired type which
78
/*  may wider or narrower than the argument value.
79
/* IMPLEMENTATION
80
81
 /*
82
  * Choose between an implementation based on inline functions (standardized
83
  * with C99) or conditional assignment (portable to older compilers, with
84
  * some caveats as discussed below).
85
  */
86
#ifndef NO_INLINE
87
88
 /*
89
  * Parameter checks expand into inline helper function calls.
90
  */
91
0
#define CHECK_VAL(tag, type, v) check_val_##tag##type(v)
92
0
#define CHECK_PTR(tag, type, v) check_ptr_##tag##type(v)
93
0
#define CHECK_CPTR(tag, type, v) check_cptr_##tag##type(v)
94
#define CHECK_PPTR(tag, type, v) check_pptr_##tag##type(v)
95
96
 /*
97
  * Macros to instantiate the inline helper functions.
98
  */
99
#define CHECK_VAL_HELPER_DCL(tag, type) \
100
0
  static inline type check_val_##tag##type(type v) { return v; }
Unexecuted instantiation: fuzz_mime.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: fuzz_mime.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: fuzz_mime.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: fuzz_mime.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: fuzz_mime.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: fuzz_mime.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: fuzz_mime.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: fuzz_mime.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mime_state.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: header_opts.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: header_token.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_params.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_params.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: mail_params.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: mail_params.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_params.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: mail_params.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: mail_params.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: mail_params.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_params.c:check_val_ATTRssize_t
Unexecuted instantiation: mail_params.c:check_val_ATTRlong
Unexecuted instantiation: mail_params.c:check_val_ATTRint
Unexecuted instantiation: mail_params.c:check_val_ATTRunsigned
Unexecuted instantiation: mail_params.c:check_val_ATTRbool
Unexecuted instantiation: mail_params.c:check_val_ATTRATTR_PRINT_CUSTOM_FN
Unexecuted instantiation: mail_params.c:check_val_ATTRATTR_SCAN_CUSTOM_FN
Unexecuted instantiation: mynetworks.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: own_inet_addr.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: verp_sender.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_nbool.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: compat_level.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: config_known_tcp_ports.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: nbdb_util.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: nbdb_util.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: nbdb_util.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: nbdb_util.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: nbdb_util.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: nbdb_util.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: nbdb_util.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: nbdb_util.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: nbdb_redirect.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: been_here.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_conf.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: mail_conf.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: mail_conf.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: mail_conf.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: mail_conf.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: mail_conf.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_bool.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_conf_int.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: mail_conf_int.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: mail_conf_int.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_int.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: mail_conf_int.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: mail_conf_int.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: mail_conf_int.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_int.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_conf_long.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: mail_conf_long.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: mail_conf_long.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_long.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: mail_conf_long.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: mail_conf_long.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: mail_conf_long.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_long.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_conf_str.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: mail_conf_time.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: mail_conf_time.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: mail_conf_time.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_time.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: mail_conf_time.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: mail_conf_time.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: mail_conf_time.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: mail_conf_time.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTREAM_CTLint
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTREAM_CTLssize_t
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTREAM_CTLVSTREAM_WAITPID_FN
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTREAM_CTLVSTREAM_RW_FN
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTREAM_PPNuid_t
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTREAM_PPNgid_t
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTREAM_PPNVSTREAM_WAITPID_FN
Unexecuted instantiation: nbdb_clnt.c:check_val_VSTRING_CTLssize_t
Unexecuted instantiation: nbdb_clnt.c:check_val_ATTRssize_t
Unexecuted instantiation: nbdb_clnt.c:check_val_ATTRlong
Unexecuted instantiation: nbdb_clnt.c:check_val_ATTRint
Unexecuted instantiation: nbdb_clnt.c:check_val_ATTRunsigned
Unexecuted instantiation: nbdb_clnt.c:check_val_ATTRbool
Unexecuted instantiation: nbdb_clnt.c:check_val_ATTRATTR_PRINT_CUSTOM_FN
Unexecuted instantiation: nbdb_clnt.c:check_val_ATTRATTR_SCAN_CUSTOM_FN
101
#define CHECK_PTR_HELPER_DCL(tag, type) \
102
0
  static inline type *check_ptr_##tag##type(type *v) { return v; }
Unexecuted instantiation: fuzz_mime.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: fuzz_mime.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: mail_params.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: mail_params.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: mail_params.c:check_ptr_ATTRvoid
Unexecuted instantiation: mail_params.c:check_ptr_ATTRlong
Unexecuted instantiation: mail_params.c:check_ptr_ATTRint
Unexecuted instantiation: mail_params.c:check_ptr_ATTRunsigned
Unexecuted instantiation: mail_params.c:check_ptr_ATTRbool
Unexecuted instantiation: mail_params.c:check_ptr_ATTRVSTRING
Unexecuted instantiation: mail_params.c:check_ptr_ATTRNVTABLE
Unexecuted instantiation: mail_params.c:check_ptr_ATTRHTABLE
Unexecuted instantiation: mail_conf_nbool.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: mail_conf_nbool.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: nbdb_util.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: nbdb_util.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: nbdb_redirect.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: nbdb_redirect.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: mail_conf.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: mail_conf.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: mail_conf_bool.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: mail_conf_bool.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: mail_conf_int.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: mail_conf_int.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: mail_conf_long.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: mail_conf_long.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: mail_conf_time.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: mail_conf_time.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRint
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRVSTRING
Unexecuted instantiation: nbdb_clnt.c:check_ptr_VSTREAM_CTLvoid
Unexecuted instantiation: nbdb_clnt.c:check_ptr_VSTREAM_CTLVSTREAM
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRvoid
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRlong
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRunsigned
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRbool
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRNVTABLE
Unexecuted instantiation: nbdb_clnt.c:check_ptr_ATTRHTABLE
103
#define CHECK_CPTR_HELPER_DCL(tag, type) \
104
  static inline const type *check_cptr_##tag##type(const type *v) \
105
0
      { return v; }
Unexecuted instantiation: fuzz_mime.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: fuzz_mime.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_params.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: mail_params.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_params.c:check_cptr_ATTRvoid
Unexecuted instantiation: mail_params.c:check_cptr_ATTRchar
Unexecuted instantiation: mail_params.c:check_cptr_ATTRNVTABLE
Unexecuted instantiation: mail_params.c:check_cptr_ATTRHTABLE
Unexecuted instantiation: mail_conf_nbool.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: mail_conf_nbool.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: nbdb_util.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: nbdb_util.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: nbdb_redirect.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: nbdb_redirect.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: mail_conf.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_bool.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: mail_conf_bool.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_int.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: mail_conf_int.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_long.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: mail_conf_long.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_time.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: mail_conf_time.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: nbdb_clnt.c:check_cptr_ATTRchar
Unexecuted instantiation: nbdb_clnt.c:check_cptr_VSTREAM_CTLchar
Unexecuted instantiation: nbdb_clnt.c:check_cptr_VSTREAM_PPNchar
Unexecuted instantiation: nbdb_clnt.c:check_cptr_ATTRvoid
Unexecuted instantiation: nbdb_clnt.c:check_cptr_ATTRNVTABLE
Unexecuted instantiation: nbdb_clnt.c:check_cptr_ATTRHTABLE
106
#define CHECK_PPTR_HELPER_DCL(tag, type) \
107
0
  static inline type **check_pptr_##tag##type(type **v) { return v; }
Unexecuted instantiation: fuzz_mime.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_params.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_nbool.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: nbdb_util.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: nbdb_redirect.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_bool.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_int.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_long.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: mail_conf_time.c:check_pptr_VSTREAM_PPNchar
Unexecuted instantiation: nbdb_clnt.c:check_pptr_VSTREAM_PPNchar
108
109
#else         /* NO_INLINE */
110
111
 /*
112
  * Parameter checks expand into unreachable conditional assignments.
113
  * Inspired by OpenSSL's verified pointer check, our implementation also
114
  * detects const/non-const pointer conflicts, and it also supports
115
  * non-pointer expressions.
116
  */
117
#define CHECK_VAL(tag, type, v) ((type) (1 ? (v) : (CHECK_VAL_DUMMY(type) = (v))))
118
#define CHECK_PTR(tag, type, v) ((type *) (1 ? (v) : (CHECK_PTR_DUMMY(type) = (v))))
119
#define CHECK_CPTR(tag, type, v) \
120
  ((const type *) (1 ? (v) : (CHECK_CPTR_DUMMY(type) = (v))))
121
#define CHECK_PPTR(tag, type, v) ((type **) (1 ? (v) : (CHECK_PPTR_DUMMY(type) = (v))))
122
123
 /*
124
  * These macros instantiate assignment target declarations. Since the
125
  * assignment is made in unreachable code, the compiler "should" not emit
126
  * any references to those assignment targets. We use the "extern" class so
127
  * that gcc will not complain about unused variables. Using "extern" breaks
128
  * when a compiler does emit references to unreachable assignment targets.
129
  * Hopefully, those cases will be rare.
130
  */
131
#define CHECK_VAL_HELPER_DCL(tag, type) extern type CHECK_VAL_DUMMY(type)
132
#define CHECK_PTR_HELPER_DCL(tag, type) extern type *CHECK_PTR_DUMMY(type)
133
#define CHECK_CPTR_HELPER_DCL(tag, type) extern const type *CHECK_CPTR_DUMMY(type)
134
#define CHECK_PPTR_HELPER_DCL(tag, type) extern type **CHECK_PPTR_DUMMY(type)
135
136
 /*
137
  * The actual dummy assignment target names.
138
  */
139
#define CHECK_VAL_DUMMY(type) check_val_dummy_##type
140
#define CHECK_PTR_DUMMY(type) check_ptr_dummy_##type
141
#define CHECK_CPTR_DUMMY(type) check_cptr_dummy_##type
142
#define CHECK_PPTR_DUMMY(type) check_pptr_dummy_##type
143
144
#endif          /* NO_INLINE */
145
146
/* LICENSE
147
/* .ad
148
/* .fi
149
/*  The Secure Mailer license must be distributed with this software.
150
/* AUTHOR(S)
151
/*  Wietse Venema
152
/*  IBM T.J. Watson Research
153
/*  P.O. Box 704
154
/*  Yorktown Heights, NY 10598, USA
155
/*--*/
156
157
#endif