|
|
|
1 |
|
#ifndef SPECSTRINGS_H |
2 |
|
#define SPECSTRINGS_H |
3 |
|
/************************************************************************* |
4 |
|
* See specstrings_strict.h for documentation of all user visible macros. |
5 |
|
*************************************************************************/ |
6 |
|
#if _MSC_VER |
7 |
|
#pragma once |
8 |
|
#endif |
9 |
|
#include <sal.h> |
10 |
|
|
11 |
|
#ifndef __SAL_H_FULL_VER |
12 |
|
#define __SAL_H_FULL_VER 140050727 |
13 |
|
#endif |
14 |
|
|
15 |
|
#ifdef __cplusplus |
16 |
|
extern "C" { |
17 |
|
#endif |
18 |
|
|
19 |
|
/* version specific fixes to bring sal.h upto date */ |
20 |
|
#if __SAL_H_FULL_VER <= 140050727 |
21 |
|
|
22 |
|
/* Missing from RTM sal.h */ |
23 |
|
#if !defined(__midl) && defined(_PREFAST_) && _MSC_VER >= 1000 |
24 |
|
|
25 |
|
#define __inexpressible_readableTo(size) __declspec("SAL_readableTo(inexpressibleCount('" SPECSTRINGIZE(size) "'))") |
26 |
|
#define __inexpressible_writableTo(size) __declspec("SAL_writableTo(inexpressibleCount('" SPECSTRINGIZE(size) "'))") |
27 |
|
#define __inner_bound __declspec("SAL_bound") |
28 |
|
#define __inner_range(lb,ub) __declspec("SAL_range(" SPECSTRINGIZE(lb) "," SPECSTRINGIZE(ub) ")") |
29 |
|
#define __inner_assume_bound_dec __inline __nothrow void __AssumeBoundInt(__post __inner_bound int i) {i;} |
30 |
|
#define __inner_assume_bound(i) __AssumeBoundInt(i); |
31 |
|
#define __inner_allocator __declspec("SAL_allocator") |
32 |
|
#else |
33 |
|
#define __inexpressible_readableTo(size) |
34 |
|
#define __inexpressible_writableTo(size) |
35 |
|
#define __inner_bound |
36 |
|
#define __inner_range(lb,ub) |
37 |
|
#define __inner_assume_bound_dec |
38 |
|
#define __inner_assume_bound(i) |
39 |
|
#define __inner_allocator |
40 |
|
#endif |
41 |
|
|
42 |
|
#define __xcount(size) __notnull __inexpressible_writableTo(size) |
43 |
|
#define __in_xcount(size) __in __pre __inexpressible_readableTo(size) |
44 |
|
#define __out_xcount(size) __xcount(size) __post __valid __refparam |
45 |
|
#define __out_xcount_part(size,length) __out_xcount(size) __post __inexpressible_readableTo(length) |
46 |
|
#define __out_xcount_full(size) __out_xcount_part(size,size) |
47 |
|
#define __inout_xcount(size) __out_xcount(size) __pre __valid |
48 |
|
#define __inout_xcount_part(size,length) __out_xcount_part(size,length) __pre __valid __pre __inexpressible_readableTo(length) |
49 |
|
#define __inout_xcount_full(size) __inout_xcount_part(size,size) |
50 |
|
#define __xcount_opt(size) __xcount(size) __exceptthat __maybenull |
51 |
|
#define __in_xcount_opt(size) __in_xcount(size) __exceptthat __maybenull |
52 |
|
#define __out_xcount_opt(size) __out_xcount(size) __exceptthat __maybenull |
53 |
|
#define __out_xcount_part_opt(size,length) __out_xcount_part(size,length) __exceptthat __maybenull |
54 |
|
#define __out_xcount_full_opt(size) __out_xcount_full(size) __exceptthat __maybenull |
55 |
|
#define __inout_xcount_opt(size) __inout_xcount(size) __exceptthat __maybenull |
56 |
|
#define __inout_xcount_part_opt(size,length) __inout_xcount_part(size,length) __exceptthat __maybenull |
57 |
|
#define __inout_xcount_full_opt(size) __inout_xcount_full(size) __exceptthat __maybenull |
58 |
|
#define __deref_xcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __inexpressible_writableTo(size) |
59 |
|
#define __deref_in __in __pre __deref __deref __readonly |
60 |
|
#define __deref_in_ecount(size) __deref_in __pre __deref __elem_readableTo(size) |
61 |
|
#define __deref_in_bcount(size) __deref_in __pre __deref __byte_readableTo(size) |
62 |
|
#define __deref_in_xcount(size) __deref_in __pre __deref __inexpressible_readableTo(size) |
63 |
|
#define __deref_out_xcount(size) __deref_xcount(size) __post __deref __valid __refparam |
64 |
|
#define __deref_out_xcount_part(size,length) __deref_out_xcount(size) __post __deref __inexpressible_readableTo(length) |
65 |
|
#define __deref_out_xcount_full(size) __deref_out_xcount_part(size,size) |
66 |
|
#define __deref_out_xcount(size) __deref_xcount(size) __post __deref __valid __refparam |
67 |
|
#define __inout_xcount_opt(size) __inout_xcount(size) __exceptthat __maybenull |
68 |
|
#define __inout_xcount_part_opt(size,length) __inout_xcount_part(size,length) __exceptthat __maybenull |
69 |
|
#define __inout_xcount_full_opt(size) __inout_xcount_full(size) __exceptthat __maybenull |
70 |
|
#define __deref_xcount(size) __ecount(1) __post __elem_readableTo(1) __post __deref __notnull __post __deref __inexpressible_writableTo(size) |
71 |
|
#define __deref_in __in __pre __deref __deref __readonly |
72 |
|
#define __deref_in_ecount(size) __deref_in __pre __deref __elem_readableTo(size) |
73 |
|
#define __deref_in_bcount(size) __deref_in __pre __deref __byte_readableTo(size) |
74 |
|
#define __deref_in_xcount(size) __deref_in __pre __deref __inexpressible_readableTo(size) |
75 |
|
#define __deref_out_xcount(size) __deref_xcount(size) __post __deref __valid __refparam |
76 |
|
#define __deref_out_xcount_part(size,length) __deref_out_xcount(size) __post __deref __inexpressible_readableTo(length) |
77 |
|
#define __deref_out_xcount_full(size) __deref_out_xcount_part(size,size) |
78 |
|
#define __deref_out_xcount(size) __deref_xcount(size) __post __deref __valid __refparam |
79 |
|
#define __deref_inout_xcount(size) __deref_inout __pre __deref __inexpressible_writableTo(size) __post __deref __inexpressible_writableTo(size) |
80 |
|
#define __deref_inout_xcount_part(size,length) __deref_inout_xcount(size) __pre __deref __inexpressible_readableTo(length) __post __deref __inexpressible_readableTo(length) |
81 |
|
#define __deref_inout_xcount_full(size) __deref_inout_xcount_part(size,size) |
82 |
|
#define __deref_xcount_opt(size) __deref_xcount(size) __post __deref __exceptthat __maybenull |
83 |
|
#define __deref_in_opt __deref_in __pre __deref __exceptthat __maybenull |
84 |
|
#define __deref_in_ecount_opt(size) __deref_in_ecount(size) __pre __deref __exceptthat __maybenull |
85 |
|
#define __deref_in_bcount_opt(size) __deref_in_bcount(size) __pre __deref __exceptthat __maybenull |
86 |
|
#define __deref_in_xcount_opt(size) __deref_in_xcount(size) __pre __deref __exceptthat __maybenull |
87 |
|
#define __deref_out_xcount_opt(size) __deref_out_xcount(size) __post __deref __exceptthat __maybenull |
88 |
|
#define __deref_out_xcount_part_opt(size,length) __deref_out_xcount_part(size,length) __post __deref __exceptthat __maybenull |
89 |
|
#define __deref_out_xcount_full_opt(size) __deref_out_xcount_full(size) __post __deref __exceptthat __maybenull |
90 |
|
#define __deref_inout_xcount_opt(size) __deref_inout_xcount(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull |
91 |
|
#define __deref_inout_xcount_part_opt(size,length) __deref_inout_xcount_part(size,length) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull |
92 |
|
#define __deref_inout_xcount_full_opt(size) __deref_inout_xcount_full(size) __pre __deref __exceptthat __maybenull __post __deref __exceptthat __maybenull |
93 |
|
#define __deref_opt_xcount(size) __deref_xcount(size) __exceptthat __maybenull |
94 |
|
#define __deref_opt_in __deref_in __exceptthat __maybenull |
95 |
|
#define __deref_opt_in_ecount(size) __deref_in_ecount(size) __exceptthat __maybenull |
96 |
|
#define __deref_opt_in_bcount(size) __deref_in_bcount(size) __exceptthat __maybenull |
97 |
|
#define __deref_opt_in_xcount(size) __deref_in_xcount(size) __exceptthat __maybenull |
98 |
|
#define __deref_opt_out_xcount(size) __deref_out_xcount(size) __exceptthat __maybenull |
99 |
|
#define __deref_opt_out_xcount_part(size,length) __deref_out_xcount_part(size,length) __exceptthat __maybenull |
100 |
|
#define __deref_opt_out_xcount_full(size) __deref_out_xcount_full(size) __exceptthat __maybenull |
101 |
|
#define __deref_opt_inout_xcount(size) __deref_inout_xcount(size) __exceptthat __maybenull |
102 |
|
#define __deref_opt_inout_xcount_part(size,length) __deref_inout_xcount_part(size,length) __exceptthat __maybenull |
103 |
|
#define __deref_opt_inout_xcount_full(size) __deref_inout_xcount_full(size) __exceptthat __maybenull |
104 |
|
#define __deref_opt_xcount_opt(size) __deref_xcount_opt(size) __exceptthat __maybenull |
105 |
|
#define __deref_opt_in_opt __deref_in_opt __exceptthat __maybenull |
106 |
|
#define __deref_opt_in_ecount_opt(size) __deref_in_ecount_opt(size) __exceptthat __maybenull |
107 |
|
#define __deref_opt_in_bcount_opt(size) __deref_in_bcount_opt(size) __exceptthat __maybenull |
108 |
|
#define __deref_opt_in_xcount_opt(size) __deref_in_xcount_opt(size) __exceptthat __maybenull |
109 |
|
#define __deref_opt_out_xcount_opt(size) __deref_out_xcount_opt(size) __exceptthat __maybenull |
110 |
|
#define __deref_opt_out_xcount_part_opt(size,length) __deref_out_xcount_part_opt(size,length) __exceptthat __maybenull |
111 |
|
#define __deref_opt_out_xcount_full_opt(size) __deref_out_xcount_full_opt(size) __exceptthat __maybenull |
112 |
|
#define __deref_opt_inout_xcount_opt(size) __deref_inout_xcount_opt(size) __exceptthat __maybenull |
113 |
|
#define __deref_opt_inout_xcount_part_opt(size,length) __deref_inout_xcount_part_opt(size,length) __exceptthat __maybenull |
114 |
|
#define __deref_opt_inout_xcount_full_opt(size) __deref_inout_xcount_full_opt(size) __exceptthat __maybenull |
115 |
|
/* Must protect redfinitions of macros to workaround rc.exe issues. */ |
116 |
|
#ifndef RC_INVOKED |
117 |
|
#undef __nullnullterminated |
118 |
|
#define __nullnullterminated __xcount("string terminated by two nulls") |
119 |
|
#undef __checkReturn |
120 |
|
#define __checkReturn __post __inner_checkReturn |
121 |
|
#endif |
122 |
|
#endif //__SAL_H_FULL_VER <= 140050727 |
123 |
|
|
124 |
|
/************************************************************************ |
125 |
|
New extensions to sal.h follow here. |
126 |
|
*************************************************************************/ |
127 |
|
|
128 |
|
#if (_MSC_VER >= 1000) && !defined(__midl) && defined(_PREFAST_) |
129 |
|
#define __file_parser(typ) __declspec("SAL_file_parser(function, " #typ ")") |
130 |
|
#define __file_parser_class(typ) __declspec("SAL_file_parser(class, " #typ ")") |
131 |
|
#define __file_parser_library(typ) extern int __declspec("SAL_file_parser(library, " #typ ")") __iSALFileParserLibrary##typ; |
132 |
|
#define __source_code_content(typ) extern int __declspec("SAL_source_code_content(" #typ ")") __iSAL_Source_Code_Content##typ; |
133 |
|
#define __class_code_content(typ) __declspec("SAL_class_code_content(" #typ ")") |
134 |
|
#define __analysis_assert(e) __assume(e) |
135 |
|
#define __analysis_hint(hint) __declspec("SAL_analysisHint(" #hint ")") |
136 |
|
/* Internal defintions */ |
137 |
|
#define __inner_data_source(src_raw) __declspec("SAL_untrusted_data_source(" src_raw ")") |
138 |
|
#define __inner_this_data_source(src_raw) __declspec("SAL_untrusted_data_source_this(" src_raw ")") |
139 |
|
#define __inner_out_validated(typ_raw) __declspec("SAL_post") __declspec("SAL_validated(" typ_raw ")") |
140 |
|
#define __inner_this_out_validated(typ_raw) __declspec("SAL_validated_this(" typ_raw ")") |
141 |
|
#define __inner_assume_validated_dec __inline __nothrow void __AssumeValidated(__inner_out_validated("BY_DESIGN") const void *p) {p;} |
142 |
|
#define __inner_assume_validated(p) __AssumeValidated(p) |
143 |
|
#define __inner_transfer(formal) __declspec("SAL_transfer_adt_property_from(" SPECSTRINGIZE(formal) ")") |
144 |
|
#define __inner_encoded __declspec("SAL_encoded") |
145 |
|
|
146 |
|
#define __$adt_prop(adt,prop) __declspec("SAL_adt("#adt","#prop")") |
147 |
|
#define __$adt_add_prop(adt,prop) __declspec("SAL_add_adt_property("#adt","#prop")") |
148 |
|
#define __$adt_remove_prop(adt,prop) __declspec("SAL_remove_adt_property("#adt","#prop")") |
149 |
|
#define __$adt_transfer_prop(arg) __declspec("SAL_transfer_adt_property_from("#arg")") |
150 |
|
#define __$adt_type_props(typ) __declspec("SAL_post_type("#typ")") |
151 |
|
#define __$volatile __declspec("SAL_volatile") |
152 |
|
#define __$nonvolatile __declspec("SAL_nonvolatile") |
153 |
|
#define __$possibly_notnulltermiated __declspec("SAL_RequiresZeroTermination(sometimes)") |
154 |
|
#else |
155 |
|
#define __file_parser(typ) |
156 |
|
#define __file_parser_class(typ) |
157 |
|
#define __file_parser_library(typ) |
158 |
|
#define __source_code_content(typ) |
159 |
|
#define __class_code_content(typ) |
160 |
|
#define __analysis_assert(e) |
161 |
|
#define __analysis_hint(hint) |
162 |
|
/* Internal defintions */ |
163 |
|
#define __inner_data_source(src_raw) |
164 |
|
#define __inner_this_data_source(src_raw) |
165 |
|
#define __inner_out_validated(typ_raw) |
166 |
|
#define __inner_this_out_validated(typ_raw) |
167 |
|
#define __inner_assume_validated_dec |
168 |
|
#define __inner_assume_validated(p) |
169 |
|
#define __inner_transfer(formal) |
170 |
|
#define __inner_encoded |
171 |
|
#define __$adt_prop(adt,prop) |
172 |
|
#define __$adt_add_prop(adt,prop) |
173 |
|
#define __$adt_remove_prop(adt,prop) |
174 |
|
#define __$adt_transfer_prop(arg) |
175 |
|
#define __$adt_type_props(typ) |
176 |
|
#define __$volatile |
177 |
|
#define __$nonvolatile |
178 |
|
#define __$possibly_notnulltermiated |
179 |
|
#endif // #if (_MSC_VER >= 1000) && !defined(__midl) && defined(_PREFAST_) |
180 |
|
|
181 |
|
#define __field_ecount(size) __notnull __elem_writableTo(size) |
182 |
|
#define __field_bcount(size) __notnull __byte_writableTo(size) |
183 |
|
#define __field_xcount(size) __notnull __inexpressible_writableTo(size) |
184 |
|
|
185 |
|
#define __field_ecount_opt(size) __maybenull __elem_writableTo(size) |
186 |
|
#define __field_bcount_opt(size) __maybenull __byte_writableTo(size) |
187 |
|
#define __field_xcount_opt(size) __maybenull __inexpressible_writableTo(size) |
188 |
|
|
189 |
|
#define __field_ecount_part(size,init) __notnull __elem_writableTo(size) __elem_readableTo(init) |
190 |
|
#define __field_bcount_part(size,init) __notnull __byte_writableTo(size) __byte_readableTo(init) |
191 |
|
#define __field_xcount_part(size,init) __notnull __inexpressible_writableTo(size) __inexpressible_readableTo(init) |
192 |
|
|
193 |
|
#define __field_ecount_part_opt(size,init) __maybenull __elem_writableTo(size) __elem_readableTo(init) |
194 |
|
#define __field_bcount_part_opt(size,init) __maybenull __byte_writableTo(size) __byte_readableTo(init) |
195 |
|
#define __field_xcount_part_opt(size,init) __maybenull __inexpressible_writableTo(size) __inexpressible_readableTo(init) |
196 |
|
|
207 |
|
|
208 |
|
#define __out_awcount(expr,size) __pre __notnull \ |
209 |
|
__byte_writableTo((expr) ? (size) : (size) * 2) \ |
210 |
|
__post __valid __refparam |
211 |
|
#define __in_awcount(expr,size) __pre __valid \ |
212 |
|
__pre __deref __readonly \ |
213 |
|
__byte_readableTo((expr) ? (size) : (size) * 2) |
214 |
|
|
215 |
|
/* integer related macros */ |
216 |
|
#define __allocator __inner_allocator |
217 |
|
#define __bound __inner_bound |
218 |
|
#define __range(lb,ub) __inner_range(lb,ub) |
219 |
|
#define __in_bound __pre __inner_bound |
220 |
|
#define __out_bound __post __inner_bound |
221 |
|
#define __deref_out_bound __post __deref __inner_bound |
222 |
|
#define __in_range(lb,ub) __pre __inner_range(lb,ub) |
223 |
|
#define __out_range(lb,ub) __post __inner_range(lb,ub) |
224 |
|
#define __deref_in_range(lb,ub) __pre __deref __inner_range(lb,ub) |
225 |
|
#define __deref_out_range(lb,ub) __post __deref __inner_range(lb,ub) |
226 |
|
#define __field_range(lb,ub) __range(lb,ub) |
227 |
|
#define __field_data_source(src_sym) __inner_data_source(#src_sym) |
228 |
|
|
229 |
|
/* Pentraion review macros */ |
230 |
|
#define __in_data_source(src_sym) __pre __inner_data_source(#src_sym) |
231 |
|
#define __out_data_source(src_sym) __post __inner_data_source(#src_sym) |
232 |
|
#define __out_validated(typ_sym) __inner_out_validated(#typ_sym) |
233 |
|
#define __this_out_data_source(src_sym) __inner_this_data_source(#src_sym) |
234 |
|
#define __this_out_validated(typ_sym) __inner_this_out_validated(#typ_sym) |
235 |
|
#define __transfer(formal) __post __inner_transfer(formal) |
236 |
|
#define __rpc_entry __inner_control_entrypoint(RPC) |
237 |
|
#define __kernel_entry __inner_control_entrypoint(UserToKernel) |
238 |
|
#define __gdi_entry __inner_control_entrypoint(GDI) |
239 |
|
#define __encoded_pointer __inner_encoded |
240 |
|
#define __encoded_array __inner_encoded |
241 |
|
#define __field_encoded_pointer __inner_encoded |
242 |
|
#define __field_encoded_array __inner_encoded |
243 |
|
#define __type_has_adt_prop(adt,prop) __$adt_prop(adt,prop) |
244 |
|
#define __out_has_adt_prop(adt,prop) __post __$adt_add_prop(adt,prop) |
245 |
|
#define __out_not_has_adt_prop(adt,prop) __post __$adt_remove_prop(adt,prop) |
246 |
|
#define __out_transfer_adt_prop(arg) __post __$adt_transfer_prop(arg) |
247 |
|
#define __out_has_type_adt_props(typ) __post __$adt_type_props(typ) |
248 |
|
|
249 |
|
/* useful PFD related macros */ |
250 |
|
#define __possibly_notnulltermiated __post __$possibly_notnulltermiated |
251 |
|
|
252 |
|
/* Windows Internal */ |
253 |
|
#define __volatile __$volatile |
254 |
|
#define __nonvolatile __$nonvolatile |
255 |
|
#define __deref_volatile __deref __volatile |
256 |
|
#define __deref_nonvolatile __deref __nonvolatile |
257 |
|
|
258 |
|
/* declare stub functions for macros */ |
259 |
|
__inner_assume_validated_dec |
260 |
|
__inner_assume_bound_dec |
261 |
|
|
262 |
|
#define __assume_validated(p) __inner_assume_validated(p) |
263 |
|
#define __assume_bound(i) __inner_assume_bound(i) |
264 |
|
#ifdef __cplusplus |
265 |
|
} |
266 |
|
#endif |
267 |
|
#include <specstrings_adt.h> |
268 |
|
#ifdef _PREFIX_ |
269 |
|
/************************************************************************** |
270 |
|
* Defintion of __pfx_assume and __pfx_assert. Thse should be the only |
271 |
|
* defintions of these functions. |
272 |
|
***************************************************************************/ |
273 |
|
#if __cplusplus |
274 |
|
extern "C" void __pfx_assert(bool, const char *); |
275 |
|
extern "C" void __pfx_assume(bool, const char *); |
276 |
|
#else |
277 |
|
void __pfx_assert(int, const char *); |
278 |
|
void __pfx_assume(int, const char *); |
279 |
|
#endif |
280 |
|
/************************************************************************** |
281 |
|
* Redefintion of __analysis_assume and __analysis_assert for PREFIX build |
282 |
|
**************************************************************************/ |
283 |
|
#undef __analysis_assume |
284 |
|
#undef __analysis_assert |
285 |
|
#define __analysis_assume(e) (__pfx_assume(e,"pfx_assume"),__assume(e)); |
286 |
|
#define __analysis_assert(e) (__pfx_assert(e,"pfx_assert"),__assume(e)); |
287 |
|
#endif /* ifdef _PREFIX_ */ |
288 |
|
|
289 |
|
/************************************************************************** |
290 |
|
* This include should always be the last thing in this file. |
291 |
|
* Must avoid redfinitions of macros to workaround rc.exe issues. |
292 |
|
***************************************************************************/ |
293 |
|
#if !(defined(RC_INVOKED) || defined(SORTPP_PASS)) |
294 |
|
#include <specstrings_strict.h> |
295 |
|
#endif /* if !(defined(RC_INVOKED) || defined(SORTPP_PASS)) */ |
296 |
|
#endif /* #ifndef SPECSTRINGS_H */ |
297 |
|
|
298 |
|
|
299 |
|
|
300 |
|
|
|
|
|