STLdoc
STLdocumentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
sal.h
Go to the documentation of this file.
1 /***
2 *sal.h - markers for documenting the semantics of APIs
3 *
4 * Copyright (c) Microsoft Corporation. All rights reserved.
5 *
6 *Purpose:
7 * sal.h provides a set of annotations to describe how a function uses its
8 * parameters - the assumptions it makes about them, and the guarantees it makes
9 * upon finishing.
10 *
11 * [Public]
12 *
13 ****/
14 #pragma once
15 
16 /*==========================================================================
17 
18  The comments in this file are intended to give basic understanding of
19  the usage of SAL, the Microsoft Source Code Annotation Language.
20  For more details, please see http://go.microsoft.com/fwlink/?LinkID=242134
21 
22  The macros are defined in 3 layers, plus the structural set:
23 
24  _In_/_Out_/_Ret_ Layer:
25  ----------------------
26  This layer provides the highest abstraction and its macros should be used
27  in most cases. These macros typically start with:
28  _In_ : input parameter to a function, unmodified by called function
29  _Out_ : output parameter, written to by called function, pointed-to
30  location not expected to be initialized prior to call
31  _Outptr_ : like _Out_ when returned variable is a pointer type
32  (so param is pointer-to-pointer type). Called function
33  provides/allocated space.
34  _Outref_ : like _Outptr_, except param is reference-to-pointer type.
35  _Inout_ : inout parameter, read from and potentially modified by
36  called function.
37  _Ret_ : for return values
38  _Field_ : class/struct field invariants
39  For common usage, this class of SAL provides the most concise annotations.
40  Note that _In_/_Out_/_Inout_/_Outptr_ annotations are designed to be used
41  with a parameter target. Using them with _At_ to specify non-parameter
42  targets may yield unexpected results.
43 
44  This layer also includes a number of other properties that can be specified
45  to extend the ability of code analysis, most notably:
46  -- Designating parameters as format strings for printf/scanf/scanf_s
47  -- Requesting stricter type checking for C enum parameters
48 
49  _Pre_/_Post_ Layer:
50  ------------------
51  The macros of this layer only should be used when there is no suitable macro
52  in the _In_/_Out_ layer. Its macros start with _Pre_ or _Post_.
53  This layer provides the most flexibility for annotations.
54 
55  Implementation Abstraction Layer:
56  --------------------------------
57  Macros from this layer should never be used directly. The layer only exists
58  to hide the implementation of the annotation macros.
59 
60  Structural Layer:
61  ----------------
62  These annotations, like _At_ and _When_, are used with annotations from
63  any of the other layers as modifiers, indicating exactly when and where
64  the annotations apply.
65 
66 
67  Common syntactic conventions:
68  ----------------------------
69 
70  Usage:
71  -----
72  _In_, _Out_, _Inout_, _Pre_, _Post_, are for formal parameters.
73  _Ret_, _Deref_ret_ must be used for return values.
74 
75  Nullness:
76  --------
77  If the parameter can be NULL as a precondition to the function, the
78  annotation contains _opt. If the macro does not contain '_opt' the
79  parameter cannot be NULL.
80 
81  If an out/inout parameter returns a null pointer as a postcondition, this is
82  indicated by _Ret_maybenull_ or _result_maybenull_. If the macro is not
83  of this form, then the result will not be NULL as a postcondition.
84  _Outptr_ - output value is not NULL
85  _Outptr_result_maybenull_ - output value might be NULL
86 
87  String Type:
88  -----------
89  _z: NullTerminated string
90  for _In_ parameters the buffer must have the specified stringtype before the call
91  for _Out_ parameters the buffer must have the specified stringtype after the call
92  for _Inout_ parameters both conditions apply
93 
94  Extent Syntax:
95  -------------
96  Buffer sizes are expressed as element counts, unless the macro explicitly
97  contains _byte_ or _bytes_. Some annotations specify two buffer sizes, in
98  which case the second is used to indicate how much of the buffer is valid
99  as a postcondition. This table outlines the precondition buffer allocation
100  size, precondition number of valid elements, postcondition allocation size,
101  and postcondition number of valid elements for representative buffer size
102  annotations:
103  Pre | Pre | Post | Post
104  alloc | valid | alloc | valid
105  Annotation elems | elems | elems | elems
106  ---------- ------------------------------------
107  _In_reads_(s) s | s | s | s
108  _Inout_updates_(s) s | s | s | s
109  _Inout_updates_to_(s,c) s | s | s | c
110  _Out_writes_(s) s | 0 | s | s
111  _Out_writes_to_(s,c) s | 0 | s | c
112  _Outptr_result_buffer_(s) ? | ? | s | s
113  _Outptr_result_buffer_to_(s,c) ? | ? | s | c
114 
115  For the _Outptr_ annotations, the buffer in question is at one level of
116  dereference. The called function is responsible for supplying the buffer.
117 
118  Success and failure:
119  -------------------
120  The SAL concept of success allows functions to define expressions that can
121  be tested by the caller, which if it evaluates to non-zero, indicates the
122  function succeeded, which means that its postconditions are guaranteed to
123  hold. Otherwise, if the expression evaluates to zero, the function is
124  considered to have failed, and the postconditions are not guaranteed.
125 
126  The success criteria can be specified with the _Success_(expr) annotation:
127  _Success_(return != FALSE) BOOL
128  PathCanonicalizeA(_Out_writes_(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
129  pszBuf is only guaranteed to be NULL-terminated when TRUE is returned,
130  and FALSE indiates failure. In common practice, callers check for zero
131  vs. non-zero returns, so it is preferable to express the success
132  criteria in terms of zero/non-zero, not checked for exactly TRUE.
133 
134  Functions can specify that some postconditions will still hold, even when
135  the function fails, using _On_failure_(anno-list), or postconditions that
136  hold regardless of success or failure using _Always_(anno-list).
137 
138  The annotation _Return_type_success_(expr) may be used with a typedef to
139  give a default _Success_ criteria to all functions returning that type.
140  This is the case for common Windows API status types, including
141  HRESULT and NTSTATUS. This may be overridden on a per-function basis by
142  specifying a _Success_ annotation locally.
143 
144 ============================================================================*/
145 
146 #define __ATTR_SAL
147 
148 #ifndef _SAL_VERSION
149 #define _SAL_VERSION 20
150 #endif
151 
152 #ifndef __SAL_H_VERSION
153 #define __SAL_H_VERSION 180000000
154 #endif
155 
156 #ifdef _PREFAST_ // [
157 
158 // choose attribute or __declspec implementation
159 #ifndef _USE_DECLSPECS_FOR_SAL // [
160 #define _USE_DECLSPECS_FOR_SAL 1
161 #endif // ]
162 
163 #if _USE_DECLSPECS_FOR_SAL // [
164 #undef _USE_ATTRIBUTES_FOR_SAL
165 #define _USE_ATTRIBUTES_FOR_SAL 0
166 #elif !defined(_USE_ATTRIBUTES_FOR_SAL) // ][
167 #if _MSC_VER >= 1400 // [
168 #define _USE_ATTRIBUTES_FOR_SAL 1
169 #else // ][
170 #define _USE_ATTRIBUTES_FOR_SAL 0
171 #endif // ]
172 #endif // ]
173 
174 
175 #if !_USE_DECLSPECS_FOR_SAL // [
176 #if !_USE_ATTRIBUTES_FOR_SAL // [
177 #if _MSC_VER >= 1400 // [
178 #undef _USE_ATTRIBUTES_FOR_SAL
179 #define _USE_ATTRIBUTES_FOR_SAL 1
180 #else // ][
181 #undef _USE_DECLSPECS_FOR_SAL
182 #define _USE_DECLSPECS_FOR_SAL 1
183 #endif // ]
184 #endif // ]
185 #endif // ]
186 
187 #else
188 
189 // Disable expansion of SAL macros in non-Prefast mode to
190 // improve compiler throughput.
191 #ifndef _USE_DECLSPECS_FOR_SAL // [
192 #define _USE_DECLSPECS_FOR_SAL 0
193 #endif // ]
194 #ifndef _USE_ATTRIBUTES_FOR_SAL // [
195 #define _USE_ATTRIBUTES_FOR_SAL 0
196 #endif // ]
197 
198 #endif // ]
199 
200 // safeguard for MIDL and RC builds
201 #if _USE_DECLSPECS_FOR_SAL && ( defined( MIDL_PASS ) || defined(__midl) || defined(RC_INVOKED) || !defined(_PREFAST_) ) // [
202 #undef _USE_DECLSPECS_FOR_SAL
203 #define _USE_DECLSPECS_FOR_SAL 0
204 #endif // ]
205 #if _USE_ATTRIBUTES_FOR_SAL && ( !defined(_MSC_EXTENSIONS) || defined( MIDL_PASS ) || defined(__midl) || defined(RC_INVOKED) ) // [
206 #undef _USE_ATTRIBUTES_FOR_SAL
207 #define _USE_ATTRIBUTES_FOR_SAL 0
208 #endif // ]
209 
210 #if _USE_DECLSPECS_FOR_SAL || _USE_ATTRIBUTES_FOR_SAL
211 
212 // Special enum type for Y/N/M
213 enum __SAL_YesNo {_SAL_notpresent, _SAL_no, _SAL_maybe, _SAL_yes, _SAL_default};
214 
215 #endif
216 
217 #if defined(BUILD_WINDOWS) && !_USE_ATTRIBUTES_FOR_SAL
218 #define _SAL1_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "1") _GrouP_(annotes _SAL_nop_impl_)
219 #define _SAL1_1_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "1.1") _GrouP_(annotes _SAL_nop_impl_)
220 #define _SAL1_2_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "1.2") _GrouP_(annotes _SAL_nop_impl_)
221 #define _SAL2_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "2") _GrouP_(annotes _SAL_nop_impl_)
222 
223 #ifndef _SAL_L_Source_
224 // Some annotations aren't officially SAL2 yet.
225 #define _SAL_L_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "2") _GrouP_(annotes _SAL_nop_impl_)
226 #endif
227 #else
228 #define _SAL1_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "1") _Group_(annotes _SAL_nop_impl_)
229 #define _SAL1_1_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "1.1") _Group_(annotes _SAL_nop_impl_)
230 #define _SAL1_2_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "1.2") _Group_(annotes _SAL_nop_impl_)
231 #define _SAL2_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "2") _Group_(annotes _SAL_nop_impl_)
232 
233 #ifndef _SAL_L_Source_
234 // Some annotations aren't officially SAL2 yet.
235 #define _SAL_L_Source_(Name, args, annotes) _SA_annotes3(SAL_name, #Name, "", "2") _Group_(annotes _SAL_nop_impl_)
236 #endif
237 #endif
238 
239 
240 //============================================================================
241 // Structural SAL:
242 // These annotations modify the use of other annotations. They may
243 // express the annotation target (i.e. what parameter/field the annotation
244 // applies to) or the condition under which the annotation is applicable.
245 //============================================================================
246 
247 // _At_(target, annos) specifies that the annotations listed in 'annos' is to
248 // be applied to 'target' rather than to the identifier which is the current
249 // lexical target.
250 #define _At_(target, annos) _At_impl_(target, annos _SAL_nop_impl_)
251 
252 // _At_buffer_(target, iter, bound, annos) is similar to _At_, except that
253 // target names a buffer, and each annotation in annos is applied to each
254 // element of target up to bound, with the variable named in iter usable
255 // by the annotations to refer to relevant offsets within target.
256 #define _At_buffer_(target, iter, bound, annos) _At_buffer_impl_(target, iter, bound, annos _SAL_nop_impl_)
257 
258 // _When_(expr, annos) specifies that the annotations listed in 'annos' only
259 // apply when 'expr' evaluates to non-zero.
260 #define _When_(expr, annos) _When_impl_(expr, annos _SAL_nop_impl_)
261 #define _Group_(annos) _Group_impl_(annos _SAL_nop_impl_)
262 #define _GrouP_(annos) _GrouP_impl_(annos _SAL_nop_impl_)
263 
264 // <expr> indicates whether normal post conditions apply to a function
265 #define _Success_(expr) _SAL2_Source_(_Success_, (expr), _Success_impl_(expr))
266 
267 // <expr> indicates whether post conditions apply to a function returning
268 // the type that this annotation is applied to
269 #define _Return_type_success_(expr) _SAL2_Source_(_Return_type_success_, (expr), _Success_impl_(expr))
270 
271 // Establish postconditions that apply only if the function does not succeed
272 #define _On_failure_(annos) _On_failure_impl_(annos _SAL_nop_impl_)
273 
274 // Establish postconditions that apply in both success and failure cases.
275 // Only applicable with functions that have _Success_ or _Return_type_succss_.
276 #define _Always_(annos) _Always_impl_(annos _SAL_nop_impl_)
277 
278 // Usable on a function defintion. Asserts that a function declaration is
279 // in scope, and its annotations are to be used. There are no other annotations
280 // allowed on the function definition.
281 #define _Use_decl_annotations_ _Use_decl_anno_impl_
282 
283 // _Notref_ may precede a _Deref_ or "real" annotation, and removes one
284 // level of dereference if the parameter is a C++ reference (&). If the
285 // net deref on a "real" annotation is negative, it is simply discarded.
286 #define _Notref_ _Notref_impl_
287 
288 // Annotations for defensive programming styles.
289 #define _Pre_defensive_ _SA_annotes0(SAL_pre_defensive)
290 #define _Post_defensive_ _SA_annotes0(SAL_post_defensive)
291 
292 #define _In_defensive_(annotes) _Pre_defensive_ _Group_(annotes)
293 #define _Out_defensive_(annotes) _Post_defensive_ _Group_(annotes)
294 #define _Inout_defensive_(annotes) _Pre_defensive_ _Post_defensive_ _Group_(annotes)
295 
296 //============================================================================
297 // _In_\_Out_ Layer:
298 //============================================================================
299 
300 // Reserved pointer parameters, must always be NULL.
301 #define _Reserved_ _SAL2_Source_(_Reserved_, (), _Pre1_impl_(__null_impl))
302 
303 // _Const_ allows specification that any namable memory location is considered
304 // readonly for a given call.
305 #define _Const_ _SAL2_Source_(_Const_, (), _Pre1_impl_(__readaccess_impl_notref))
306 
307 
308 // Input parameters --------------------------
309 
310 // _In_ - Annotations for parameters where data is passed into the function, but not modified.
311 // _In_ by itself can be used with non-pointer types (although it is redundant).
312 
313 // e.g. void SetPoint( _In_ const POINT* pPT );
314 #define _In_ _SAL2_Source_(_In_, (), _Pre1_impl_(__notnull_impl_notref) _Pre_valid_impl_ _Deref_pre1_impl_(__readaccess_impl_notref))
315 #define _In_opt_ _SAL2_Source_(_In_opt_, (), _Pre1_impl_(__maybenull_impl_notref) _Pre_valid_impl_ _Deref_pre_readonly_)
316 
317 // nullterminated 'in' parameters.
318 // e.g. void CopyStr( _In_z_ const char* szFrom, _Out_z_cap_(cchTo) char* szTo, size_t cchTo );
319 #define _In_z_ _SAL2_Source_(_In_z_, (), _In_ _Pre1_impl_(__zterm_impl))
320 #define _In_opt_z_ _SAL2_Source_(_In_opt_z_, (), _In_opt_ _Pre1_impl_(__zterm_impl))
321 
322 
323 // 'input' buffers with given size
324 
325 #define _In_reads_(size) _SAL2_Source_(_In_reads_, (size), _Pre_count_(size) _Deref_pre_readonly_)
326 #define _In_reads_opt_(size) _SAL2_Source_(_In_reads_opt_, (size), _Pre_opt_count_(size) _Deref_pre_readonly_)
327 #define _In_reads_bytes_(size) _SAL2_Source_(_In_reads_bytes_, (size), _Pre_bytecount_(size) _Deref_pre_readonly_)
328 #define _In_reads_bytes_opt_(size) _SAL2_Source_(_In_reads_bytes_opt_, (size), _Pre_opt_bytecount_(size) _Deref_pre_readonly_)
329 #define _In_reads_z_(size) _SAL2_Source_(_In_reads_z_, (size), _In_reads_(size) _Pre_z_)
330 #define _In_reads_opt_z_(size) _SAL2_Source_(_In_reads_opt_z_, (size), _Pre_opt_count_(size) _Deref_pre_readonly_ _Pre_opt_z_)
331 #define _In_reads_or_z_(size) _SAL2_Source_(_In_reads_or_z_, (size), _In_ _When_(_String_length_(_Curr_) < (size), _Pre_z_) _When_(_String_length_(_Curr_) >= (size), _Pre1_impl_(__count_impl(size))))
332 #define _In_reads_or_z_opt_(size) _SAL2_Source_(_In_reads_or_z_opt_, (size), _In_opt_ _When_(_String_length_(_Curr_) < (size), _Pre_z_) _When_(_String_length_(_Curr_) >= (size), _Pre1_impl_(__count_impl(size))))
333 
334 
335 // 'input' buffers valid to the given end pointer
336 
337 #define _In_reads_to_ptr_(ptr) _SAL2_Source_(_In_reads_to_ptr_, (ptr), _Pre_ptrdiff_count_(ptr) _Deref_pre_readonly_)
338 #define _In_reads_to_ptr_opt_(ptr) _SAL2_Source_(_In_reads_to_ptr_opt_, (ptr), _Pre_opt_ptrdiff_count_(ptr) _Deref_pre_readonly_)
339 #define _In_reads_to_ptr_z_(ptr) _SAL2_Source_(_In_reads_to_ptr_z_, (ptr), _In_reads_to_ptr_(ptr) _Pre_z_)
340 #define _In_reads_to_ptr_opt_z_(ptr) _SAL2_Source_(_In_reads_to_ptr_opt_z_, (ptr), _Pre_opt_ptrdiff_count_(ptr) _Deref_pre_readonly_ _Pre_opt_z_)
341 
342 
343 
344 // Output parameters --------------------------
345 
346 // _Out_ - Annotations for pointer or reference parameters where data passed back to the caller.
347 // These are mostly used where the pointer/reference is to a non-pointer type.
348 // _Outptr_/_Outref) (see below) are typically used to return pointers via parameters.
349 
350 // e.g. void GetPoint( _Out_ POINT* pPT );
351 #define _Out_ _SAL2_Source_(_Out_, (), _Out_impl_)
352 #define _Out_opt_ _SAL2_Source_(_Out_opt_, (), _Out_opt_impl_)
353 
354 #define _Out_writes_(size) _SAL2_Source_(_Out_writes_, (size), _Pre_cap_(size) _Post_valid_impl_)
355 #define _Out_writes_opt_(size) _SAL2_Source_(_Out_writes_opt_, (size), _Pre_opt_cap_(size) _Post_valid_impl_)
356 #define _Out_writes_bytes_(size) _SAL2_Source_(_Out_writes_bytes_, (size), _Pre_bytecap_(size) _Post_valid_impl_)
357 #define _Out_writes_bytes_opt_(size) _SAL2_Source_(_Out_writes_bytes_opt_, (size), _Pre_opt_bytecap_(size) _Post_valid_impl_)
358 #define _Out_writes_z_(size) _SAL2_Source_(_Out_writes_z_, (size), _Pre_cap_(size) _Post_valid_impl_ _Post_z_)
359 #define _Out_writes_opt_z_(size) _SAL2_Source_(_Out_writes_opt_z_, (size), _Pre_opt_cap_(size) _Post_valid_impl_ _Post_z_)
360 
361 #define _Out_writes_to_(size,count) _SAL2_Source_(_Out_writes_to_, (size,count), _Pre_cap_(size) _Post_valid_impl_ _Post_count_(count))
362 #define _Out_writes_to_opt_(size,count) _SAL2_Source_(_Out_writes_to_opt_, (size,count), _Pre_opt_cap_(size) _Post_valid_impl_ _Post_count_(count))
363 #define _Out_writes_all_(size) _SAL2_Source_(_Out_writes_all_, (size), _Out_writes_to_(_Old_(size), _Old_(size)))
364 #define _Out_writes_all_opt_(size) _SAL2_Source_(_Out_writes_all_opt_, (size), _Out_writes_to_opt_(_Old_(size), _Old_(size)))
365 
366 #define _Out_writes_bytes_to_(size,count) _SAL2_Source_(_Out_writes_bytes_to_, (size,count), _Pre_bytecap_(size) _Post_valid_impl_ _Post_bytecount_(count))
367 #define _Out_writes_bytes_to_opt_(size,count) _SAL2_Source_(_Out_writes_bytes_to_opt_, (size,count), _Pre_opt_bytecap_(size) _Post_valid_impl_ _Post_bytecount_(count))
368 #define _Out_writes_bytes_all_(size) _SAL2_Source_(_Out_writes_bytes_all_, (size), _Out_writes_bytes_to_(_Old_(size), _Old_(size)))
369 #define _Out_writes_bytes_all_opt_(size) _SAL2_Source_(_Out_writes_bytes_all_opt_, (size), _Out_writes_bytes_to_opt_(_Old_(size), _Old_(size)))
370 
371 #define _Out_writes_to_ptr_(ptr) _SAL2_Source_(_Out_writes_to_ptr_, (ptr), _Pre_ptrdiff_cap_(ptr) _Post_valid_impl_)
372 #define _Out_writes_to_ptr_opt_(ptr) _SAL2_Source_(_Out_writes_to_ptr_opt_, (ptr), _Pre_opt_ptrdiff_cap_(ptr) _Post_valid_impl_)
373 #define _Out_writes_to_ptr_z_(ptr) _SAL2_Source_(_Out_writes_to_ptr_z_, (ptr), _Pre_ptrdiff_cap_(ptr) _Post_valid_impl_ Post_z_)
374 #define _Out_writes_to_ptr_opt_z_(ptr) _SAL2_Source_(_Out_writes_to_ptr_opt_z_, (ptr), _Pre_opt_ptrdiff_cap_(ptr) _Post_valid_impl_ Post_z_)
375 
376 
377 // Inout parameters ----------------------------
378 
379 // _Inout_ - Annotations for pointer or reference parameters where data is passed in and
380 // potentially modified.
381 // void ModifyPoint( _Inout_ POINT* pPT );
382 // void ModifyPointByRef( _Inout_ POINT& pPT );
383 
384 #define _Inout_ _SAL2_Source_(_Inout_, (), _Prepost_valid_)
385 #define _Inout_opt_ _SAL2_Source_(_Inout_opt_, (), _Prepost_opt_valid_)
386 
387 // For modifying string buffers
388 // void toupper( _Inout_z_ char* sz );
389 #define _Inout_z_ _SAL2_Source_(_Inout_z_, (), _Prepost_z_)
390 #define _Inout_opt_z_ _SAL2_Source_(_Inout_opt_z_, (), _Prepost_opt_z_)
391 
392 // For modifying buffers with explicit element size
393 #define _Inout_updates_(size) _SAL2_Source_(_Inout_updates_, (size), _Pre_cap_(size) _Pre_valid_impl_ _Post_valid_impl_)
394 #define _Inout_updates_opt_(size) _SAL2_Source_(_Inout_updates_opt_, (size), _Pre_opt_cap_(size) _Pre_valid_impl_ _Post_valid_impl_)
395 #define _Inout_updates_z_(size) _SAL2_Source_(_Inout_updates_z_, (size), _Pre_cap_(size) _Pre_valid_impl_ _Post_valid_impl_ _Pre1_impl_(__zterm_impl) _Post1_impl_(__zterm_impl))
396 #define _Inout_updates_opt_z_(size) _SAL2_Source_(_Inout_updates_opt_z_, (size), _Pre_opt_cap_(size) _Pre_valid_impl_ _Post_valid_impl_ _Pre1_impl_(__zterm_impl) _Post1_impl_(__zterm_impl))
397 
398 #define _Inout_updates_to_(size,count) _SAL2_Source_(_Inout_updates_to_, (size,count), _Out_writes_to_(size,count) _Pre_valid_impl_ _Pre1_impl_(__count_impl(size)))
399 #define _Inout_updates_to_opt_(size,count) _SAL2_Source_(_Inout_updates_to_opt_, (size,count), _Out_writes_to_opt_(size,count) _Pre_valid_impl_ _Pre1_impl_(__count_impl(size)))
400 
401 #define _Inout_updates_all_(size) _SAL2_Source_(_Inout_updates_all_, (size), _Inout_updates_to_(_Old_(size), _Old_(size)))
402 #define _Inout_updates_all_opt_(size) _SAL2_Source_(_Inout_updates_all_opt_, (size), _Inout_updates_to_opt_(_Old_(size), _Old_(size)))
403 
404 // For modifying buffers with explicit byte size
405 #define _Inout_updates_bytes_(size) _SAL2_Source_(_Inout_updates_bytes_, (size), _Pre_bytecap_(size) _Pre_valid_impl_ _Post_valid_impl_)
406 #define _Inout_updates_bytes_opt_(size) _SAL2_Source_(_Inout_updates_bytes_opt_, (size), _Pre_opt_bytecap_(size) _Pre_valid_impl_ _Post_valid_impl_)
407 
408 #define _Inout_updates_bytes_to_(size,count) _SAL2_Source_(_Inout_updates_bytes_to_, (size,count), _Out_writes_bytes_to_(size,count) _Pre_valid_impl_ _Pre1_impl_(__bytecount_impl(size)))
409 #define _Inout_updates_bytes_to_opt_(size,count) _SAL2_Source_(_Inout_updates_bytes_to_opt_, (size,count), _Out_writes_bytes_to_opt_(size,count) _Pre_valid_impl_ _Pre1_impl_(__bytecount_impl(size)))
410 
411 #define _Inout_updates_bytes_all_(size) _SAL2_Source_(_Inout_updates_bytes_all_, (size), _Inout_updates_bytes_to_(_Old_(size), _Old_(size)))
412 #define _Inout_updates_bytes_all_opt_(size) _SAL2_Source_(_Inout_updates_bytes_all_opt_, (size), _Inout_updates_bytes_to_opt_(_Old_(size), _Old_(size)))
413 
414 
415 // Pointer to pointer parameters -------------------------
416 
417 // _Outptr_ - Annotations for output params returning pointers
418 // These describe parameters where the called function provides the buffer:
419 // HRESULT SHStrDupW(_In_ LPCWSTR psz, _Outptr_ LPWSTR *ppwsz);
420 // The caller passes the address of an LPWSTR variable as ppwsz, and SHStrDupW allocates
421 // and initializes memory and returns the pointer to the new LPWSTR in *ppwsz.
422 //
423 // _Outptr_opt_ - describes parameters that are allowed to be NULL.
424 // _Outptr_*_result_maybenull_ - describes parameters where the called function might return NULL to the caller.
425 //
426 // Example:
427 // void MyFunc(_Outptr_opt_ int **ppData1, _Outptr_result_maybenull_ int **ppData2);
428 // Callers:
429 // MyFunc(NULL, NULL); // error: parameter 2, ppData2, should not be NULL
430 // MyFunc(&pData1, &pData2); // ok: both non-NULL
431 // if (*pData1 == *pData2) ... // error: pData2 might be NULL after call
432 
433 #define _Outptr_ _SAL2_Source_(_Outptr_, (), _Out_impl_ _Deref_post2_impl_(__notnull_impl_notref, __count_impl(1)))
434 #define _Outptr_result_maybenull_ _SAL2_Source_(_Outptr_result_maybenull_, (), _Out_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __count_impl(1)))
435 #define _Outptr_opt_ _SAL2_Source_(_Outptr_opt_, (), _Out_opt_impl_ _Deref_post2_impl_(__notnull_impl_notref, __count_impl(1)))
436 #define _Outptr_opt_result_maybenull_ _SAL2_Source_(_Outptr_opt_result_maybenull_, (), _Out_opt_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __count_impl(1)))
437 
438 // Annotations for _Outptr_ parameters returning pointers to null terminated strings.
439 
440 #define _Outptr_result_z_ _SAL2_Source_(_Outptr_result_z_, (), _Out_impl_ _Deref_post_z_)
441 #define _Outptr_opt_result_z_ _SAL2_Source_(_Outptr_opt_result_z_, (), _Out_opt_impl_ _Deref_post_z_)
442 #define _Outptr_result_maybenull_z_ _SAL2_Source_(_Outptr_result_maybenull_z_, (), _Out_impl_ _Deref_post_opt_z_)
443 #define _Outptr_opt_result_maybenull_z_ _SAL2_Source_(_Outptr_opt_result_maybenull_z_, (), _Out_opt_impl_ _Deref_post_opt_z_)
444 
445 // Annotations for _Outptr_ parameters where the output pointer is set to NULL if the function fails.
446 
447 #define _Outptr_result_nullonfailure_ _SAL2_Source_(_Outptr_result_nullonfailure_, (), _Outptr_ _On_failure_(_Deref_post_null_))
448 #define _Outptr_opt_result_nullonfailure_ _SAL2_Source_(_Outptr_opt_result_nullonfailure_, (), _Outptr_opt_ _On_failure_(_Deref_post_null_))
449 
450 // Annotations for _Outptr_ parameters which return a pointer to a ref-counted COM object,
451 // following the COM convention of setting the output to NULL on failure.
452 // The current implementation is identical to _Outptr_result_nullonfailure_.
453 // For pointers to types that are not COM objects, _Outptr_result_nullonfailure_ is preferred.
454 
455 #define _COM_Outptr_ _SAL2_Source_(_COM_Outptr_, (), _Outptr_ _On_failure_(_Deref_post_null_))
456 #define _COM_Outptr_result_maybenull_ _SAL2_Source_(_COM_Outptr_result_maybenull_, (), _Outptr_result_maybenull_ _On_failure_(_Deref_post_null_))
457 #define _COM_Outptr_opt_ _SAL2_Source_(_COM_Outptr_opt_, (), _Outptr_opt_ _On_failure_(_Deref_post_null_))
458 #define _COM_Outptr_opt_result_maybenull_ _SAL2_Source_(_COM_Outptr_opt_result_maybenull_, (), _Outptr_opt_result_maybenull_ _On_failure_(_Deref_post_null_))
459 
460 // Annotations for _Outptr_ parameters returning a pointer to buffer with a specified number of elements/bytes
461 
462 #define _Outptr_result_buffer_(size) _SAL2_Source_(_Outptr_result_buffer_, (size), _Out_impl_ _Deref_post2_impl_(__notnull_impl_notref, __cap_impl(size)))
463 #define _Outptr_opt_result_buffer_(size) _SAL2_Source_(_Outptr_opt_result_buffer_, (size), _Out_opt_impl_ _Deref_post2_impl_(__notnull_impl_notref, __cap_impl(size)))
464 #define _Outptr_result_buffer_to_(size, count) _SAL2_Source_(_Outptr_result_buffer_to_, (size, count), _Out_impl_ _Deref_post3_impl_(__notnull_impl_notref, __cap_impl(size), __count_impl(count)))
465 #define _Outptr_opt_result_buffer_to_(size, count) _SAL2_Source_(_Outptr_opt_result_buffer_to_, (size, count), _Out_opt_impl_ _Deref_post3_impl_(__notnull_impl_notref, __cap_impl(size), __count_impl(count)))
466 
467 #define _Outptr_result_buffer_all_(size) _SAL2_Source_(_Outptr_result_buffer_all_, (size), _Out_impl_ _Deref_post2_impl_(__notnull_impl_notref, __count_impl(size)))
468 #define _Outptr_opt_result_buffer_all_(size) _SAL2_Source_(_Outptr_opt_result_buffer_all_, (size), _Out_opt_impl_ _Deref_post2_impl_(__notnull_impl_notref, __count_impl(size)))
469 
470 #define _Outptr_result_buffer_maybenull_(size) _SAL2_Source_(_Outptr_result_buffer_maybenull_, (size), _Out_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __cap_impl(size)))
471 #define _Outptr_opt_result_buffer_maybenull_(size) _SAL2_Source_(_Outptr_opt_result_buffer_maybenull_, (size), _Out_opt_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __cap_impl(size)))
472 #define _Outptr_result_buffer_to_maybenull_(size, count) _SAL2_Source_(_Outptr_result_buffer_to_maybenull_, (size, count), _Out_impl_ _Deref_post3_impl_(__maybenull_impl_notref, __cap_impl(size), __count_impl(count)))
473 #define _Outptr_opt_result_buffer_to_maybenull_(size, count) _SAL2_Source_(_Outptr_opt_result_buffer_to_maybenull_, (size, count), _Out_opt_impl_ _Deref_post3_impl_(__maybenull_impl_notref, __cap_impl(size), __count_impl(count)))
474 
475 #define _Outptr_result_buffer_all_maybenull_(size) _SAL2_Source_(_Outptr_result_buffer_all_maybenull_, (size), _Out_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __count_impl(size)))
476 #define _Outptr_opt_result_buffer_all_maybenull_(size) _SAL2_Source_(_Outptr_opt_result_buffer_all_maybenull_, (size), _Out_opt_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __count_impl(size)))
477 
478 #define _Outptr_result_bytebuffer_(size) _SAL2_Source_(_Outptr_result_bytebuffer_, (size), _Out_impl_ _Deref_post2_impl_(__notnull_impl_notref, __bytecap_impl(size)))
479 #define _Outptr_opt_result_bytebuffer_(size) _SAL2_Source_(_Outptr_opt_result_bytebuffer_, (size), _Out_opt_impl_ _Deref_post2_impl_(__notnull_impl_notref, __bytecap_impl(size)))
480 #define _Outptr_result_bytebuffer_to_(size, count) _SAL2_Source_(_Outptr_result_bytebuffer_to_, (size, count), _Out_impl_ _Deref_post3_impl_(__notnull_impl_notref, __bytecap_impl(size), __bytecount_impl(count)))
481 #define _Outptr_opt_result_bytebuffer_to_(size, count) _SAL2_Source_(_Outptr_opt_result_bytebuffer_to_, (size, count), _Out_opt_impl_ _Deref_post3_impl_(__notnull_impl_notref, __bytecap_impl(size), __bytecount_impl(count)))
482 
483 #define _Outptr_result_bytebuffer_all_(size) _SAL2_Source_(_Outptr_result_bytebuffer_all_, (size), _Out_impl_ _Deref_post2_impl_(__notnull_impl_notref, __bytecount_impl(size)))
484 #define _Outptr_opt_result_bytebuffer_all_(size) _SAL2_Source_(_Outptr_opt_result_bytebuffer_all_, (size), _Out_opt_impl_ _Deref_post2_impl_(__notnull_impl_notref, __bytecount_impl(size)))
485 
486 #define _Outptr_result_bytebuffer_maybenull_(size) _SAL2_Source_(_Outptr_result_bytebuffer_maybenull_, (size), _Out_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __bytecap_impl(size)))
487 #define _Outptr_opt_result_bytebuffer_maybenull_(size) _SAL2_Source_(_Outptr_opt_result_bytebuffer_maybenull_, (size), _Out_opt_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __bytecap_impl(size)))
488 #define _Outptr_result_bytebuffer_to_maybenull_(size, count) _SAL2_Source_(_Outptr_result_bytebuffer_to_maybenull_, (size, count), _Out_impl_ _Deref_post3_impl_(__maybenull_impl_notref, __bytecap_impl(size), __bytecount_impl(count)))
489 #define _Outptr_opt_result_bytebuffer_to_maybenull_(size, count) _SAL2_Source_(_Outptr_opt_result_bytebuffer_to_maybenull_, (size, count), _Out_opt_impl_ _Deref_post3_impl_(__maybenull_impl_notref, __bytecap_impl(size), __bytecount_impl(count)))
490 
491 #define _Outptr_result_bytebuffer_all_maybenull_(size) _SAL2_Source_(_Outptr_result_bytebuffer_all_maybenull_, (size), _Out_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __bytecount_impl(size)))
492 #define _Outptr_opt_result_bytebuffer_all_maybenull_(size) _SAL2_Source_(_Outptr_opt_result_bytebuffer_all_maybenull_, (size), _Out_opt_impl_ _Deref_post2_impl_(__maybenull_impl_notref, __bytecount_impl(size)))
493 
494 // Annotations for output reference to pointer parameters.
495 
496 #define _Outref_ _SAL2_Source_(_Outref_, (), _Out_impl_ _Post_notnull_)
497 #define _Outref_result_maybenull_ _SAL2_Source_(_Outref_result_maybenull_, (), _Pre2_impl_(__notnull_impl_notref, __cap_c_one_notref_impl) _Post_maybenull_ _Post_valid_impl_)
498 
499 #define _Outref_result_buffer_(size) _SAL2_Source_(_Outref_result_buffer_, (size), _Outref_ _Post1_impl_(__cap_impl(size)))
500 #define _Outref_result_bytebuffer_(size) _SAL2_Source_(_Outref_result_bytebuffer_, (size), _Outref_ _Post1_impl_(__bytecap_impl(size)))
501 #define _Outref_result_buffer_to_(size, count) _SAL2_Source_(_Outref_result_buffer_to_, (size, count), _Outref_result_buffer_(size) _Post1_impl_(__count_impl(count)))
502 #define _Outref_result_bytebuffer_to_(size, count) _SAL2_Source_(_Outref_result_bytebuffer_to_, (size, count), _Outref_result_bytebuffer_(size) _Post1_impl_(__bytecount_impl(count)))
503 #define _Outref_result_buffer_all_(size) _SAL2_Source_(_Outref_result_buffer_all_, (size), _Outref_result_buffer_to_(size, _Old_(size)))
504 #define _Outref_result_bytebuffer_all_(size) _SAL2_Source_(_Outref_result_bytebuffer_all_, (size), _Outref_result_bytebuffer_to_(size, _Old_(size)))
505 
506 #define _Outref_result_buffer_maybenull_(size) _SAL2_Source_(_Outref_result_buffer_maybenull_, (size), _Outref_result_maybenull_ _Post1_impl_(__cap_impl(size)))
507 #define _Outref_result_bytebuffer_maybenull_(size) _SAL2_Source_(_Outref_result_bytebuffer_maybenull_, (size), _Outref_result_maybenull_ _Post1_impl_(__bytecap_impl(size)))
508 #define _Outref_result_buffer_to_maybenull_(size, count) _SAL2_Source_(_Outref_result_buffer_to_maybenull_, (size, count), _Outref_result_buffer_maybenull_(size) _Post1_impl_(__count_impl(count)))
509 #define _Outref_result_bytebuffer_to_maybenull_(size, count) _SAL2_Source_(_Outref_result_bytebuffer_to_maybenull_, (size, count), _Outref_result_bytebuffer_maybenull_(size) _Post1_impl_(__bytecount_impl(count)))
510 #define _Outref_result_buffer_all_maybenull_(size) _SAL2_Source_(_Outref_result_buffer_all_maybenull_, (size), _Outref_result_buffer_to_maybenull_(size, _Old_(size)))
511 #define _Outref_result_bytebuffer_all_maybenull_(size) _SAL2_Source_(_Outref_result_bytebuffer_all_maybenull_, (size), _Outref_result_bytebuffer_to_maybenull_(size, _Old_(size)))
512 
513 // Annotations for output reference to pointer parameters that guarantee
514 // that the pointer is set to NULL on failure.
515 #define _Outref_result_nullonfailure_ _SAL2_Source_(_Outref_result_nullonfailure_, (), _Outref_ _On_failure_(_Post_null_))
516 
517 // Generic annotations to set output value of a by-pointer or by-reference parameter to null/zero on failure.
518 #define _Result_nullonfailure_ _SAL2_Source_(_Result_nullonfailure_, (), _On_failure_(_Notref_impl_ _Deref_impl_ _Post_null_))
519 #define _Result_zeroonfailure_ _SAL2_Source_(_Result_zeroonfailure_, (), _On_failure_(_Notref_impl_ _Deref_impl_ _Out_range_(==, 0)))
520 
521 
522 // return values -------------------------------
523 
524 //
525 // _Ret_ annotations
526 //
527 // describing conditions that hold for return values after the call
528 
529 // e.g. _Ret_z_ CString::operator const wchar_t*() const throw();
530 #define _Ret_z_ _SAL2_Source_(_Ret_z_, (), _Ret2_impl_(__notnull_impl, __zterm_impl) _Ret_valid_impl_)
531 #define _Ret_maybenull_z_ _SAL2_Source_(_Ret_maybenull_z_, (), _Ret2_impl_(__maybenull_impl,__zterm_impl) _Ret_valid_impl_)
532 
533 // used with allocated but not yet initialized objects
534 #define _Ret_notnull_ _SAL2_Source_(_Ret_notnull_, (), _Ret1_impl_(__notnull_impl))
535 #define _Ret_maybenull_ _SAL2_Source_(_Ret_maybenull_, (), _Ret1_impl_(__maybenull_impl))
536 #define _Ret_null_ _SAL2_Source_(_Ret_null_, (), _Ret1_impl_(__null_impl))
537 
538 // used with allocated and initialized objects
539 // returns single valid object
540 #define _Ret_valid_ _SAL2_Source_(_Ret_valid_, (), _Ret1_impl_(__notnull_impl_notref) _Ret_valid_impl_)
541 
542 // returns pointer to initialized buffer of specified size
543 #define _Ret_writes_(size) _SAL2_Source_(_Ret_writes_, (size), _Ret2_impl_(__notnull_impl, __count_impl(size)) _Ret_valid_impl_)
544 #define _Ret_writes_z_(size) _SAL2_Source_(_Ret_writes_z_, (size), _Ret3_impl_(__notnull_impl, __count_impl(size), __zterm_impl) _Ret_valid_impl_)
545 #define _Ret_writes_bytes_(size) _SAL2_Source_(_Ret_writes_bytes_, (size), _Ret2_impl_(__notnull_impl, __bytecount_impl(size)) _Ret_valid_impl_)
546 #define _Ret_writes_maybenull_(size) _SAL2_Source_(_Ret_writes_maybenull_, (size), _Ret2_impl_(__maybenull_impl,__count_impl(size)) _Ret_valid_impl_)
547 #define _Ret_writes_maybenull_z_(size) _SAL2_Source_(_Ret_writes_maybenull_z_, (size), _Ret3_impl_(__maybenull_impl,__count_impl(size),__zterm_impl) _Ret_valid_impl_)
548 #define _Ret_writes_bytes_maybenull_(size) _SAL2_Source_(_Ret_writes_bytes_maybenull_, (size), _Ret2_impl_(__maybenull_impl,__bytecount_impl(size)) _Ret_valid_impl_)
549 
550 // returns pointer to partially initialized buffer, with total size 'size' and initialized size 'count'
551 #define _Ret_writes_to_(size,count) _SAL2_Source_(_Ret_writes_to_, (size,count), _Ret3_impl_(__notnull_impl, __cap_impl(size), __count_impl(count)) _Ret_valid_impl_)
552 #define _Ret_writes_bytes_to_(size,count) _SAL2_Source_(_Ret_writes_bytes_to_, (size,count), _Ret3_impl_(__notnull_impl, __bytecap_impl(size), __bytecount_impl(count)) _Ret_valid_impl_)
553 #define _Ret_writes_to_maybenull_(size,count) _SAL2_Source_(_Ret_writes_to_maybenull_, (size,count), _Ret3_impl_(__maybenull_impl, __cap_impl(size), __count_impl(count)) _Ret_valid_impl_)
554 #define _Ret_writes_bytes_to_maybenull_(size,count) _SAL2_Source_(_Ret_writes_bytes_to_maybenull_, (size,count), _Ret3_impl_(__maybenull_impl, __bytecap_impl(size), __bytecount_impl(count)) _Ret_valid_impl_)
555 
556 
557 // Annotations for strict type checking
558 #define _Points_to_data_ _SAL2_Source_(_Points_to_data_, (), _Pre_ _Points_to_data_impl_)
559 #define _Literal_ _SAL2_Source_(_Literal_, (), _Pre_ _Literal_impl_)
560 #define _Notliteral_ _SAL2_Source_(_Notliteral_, (), _Pre_ _Notliteral_impl_)
561 
562 // Check the return value of a function e.g. _Check_return_ ErrorCode Foo();
563 #define _Check_return_ _SAL2_Source_(_Check_return_, (), _Check_return_impl_)
564 #define _Must_inspect_result_ _SAL2_Source_(_Must_inspect_result_, (), _Must_inspect_impl_ _Check_return_impl_)
565 
566 // e.g. MyPrintF( _Printf_format_string_ const wchar_t* wzFormat, ... );
567 #define _Printf_format_string_ _SAL2_Source_(_Printf_format_string_, (), _Printf_format_string_impl_)
568 #define _Scanf_format_string_ _SAL2_Source_(_Scanf_format_string_, (), _Scanf_format_string_impl_)
569 #define _Scanf_s_format_string_ _SAL2_Source_(_Scanf_s_format_string_, (), _Scanf_s_format_string_impl_)
570 
571 #define _Format_string_impl_(kind,where) _SA_annotes2(SAL_IsFormatString2, kind, where)
572 #define _Printf_format_string_params_(x) _SAL2_Source_(_Printf_format_string_params_, (x), _Format_string_impl_("printf", x))
573 #define _Scanf_format_string_params_(x) _SAL2_Source_(_Scanf_format_string_params_, (x), _Format_string_impl_("scanf", x))
574 #define _Scanf_s_format_string_params_(x) _SAL2_Source_(_Scanf_s_format_string_params_, (x), _Format_string_impl_("scanf_s", x))
575 
576 // annotations to express value of integral or pointer parameter
577 #define _In_range_(lb,ub) _SAL2_Source_(_In_range_, (lb,ub), _In_range_impl_(lb,ub))
578 #define _Out_range_(lb,ub) _SAL2_Source_(_Out_range_, (lb,ub), _Out_range_impl_(lb,ub))
579 #define _Ret_range_(lb,ub) _SAL2_Source_(_Ret_range_, (lb,ub), _Ret_range_impl_(lb,ub))
580 #define _Deref_in_range_(lb,ub) _SAL2_Source_(_Deref_in_range_, (lb,ub), _Deref_in_range_impl_(lb,ub))
581 #define _Deref_out_range_(lb,ub) _SAL2_Source_(_Deref_out_range_, (lb,ub), _Deref_out_range_impl_(lb,ub))
582 #define _Deref_ret_range_(lb,ub) _SAL2_Source_(_Deref_ret_range_, (lb,ub), _Deref_ret_range_impl_(lb,ub))
583 #define _Pre_equal_to_(expr) _SAL2_Source_(_Pre_equal_to_, (expr), _In_range_(==, expr))
584 #define _Post_equal_to_(expr) _SAL2_Source_(_Post_equal_to_, (expr), _Out_range_(==, expr))
585 
586 // annotation to express that a value (usually a field of a mutable class)
587 // is not changed by a function call
588 #define _Unchanged_(e) _SAL2_Source_(_Unchanged_, (e), _At_(e, _Post_equal_to_(_Old_(e)) _Const_))
589 
590 // Annotations to allow expressing generalized pre and post conditions.
591 // 'cond' may be any valid SAL expression that is considered to be true as a precondition
592 // or postcondition (respsectively).
593 #define _Pre_satisfies_(cond) _SAL2_Source_(_Pre_satisfies_, (cond), _Pre_satisfies_impl_(cond))
594 #define _Post_satisfies_(cond) _SAL2_Source_(_Post_satisfies_, (cond), _Post_satisfies_impl_(cond))
595 
596 // Annotations to express struct, class and field invariants
597 #define _Struct_size_bytes_(size) _SAL2_Source_(_Struct_size_bytes_, (size), _Writable_bytes_(size))
598 
599 #define _Field_size_(size) _SAL2_Source_(_Field_size_, (size), _Notnull_ _Writable_elements_(size))
600 #define _Field_size_opt_(size) _SAL2_Source_(_Field_size_opt_, (size), _Maybenull_ _Writable_elements_(size))
601 #define _Field_size_part_(size, count) _SAL2_Source_(_Field_size_part_, (size, count), _Notnull_ _Writable_elements_(size) _Readable_elements_(count))
602 #define _Field_size_part_opt_(size, count) _SAL2_Source_(_Field_size_part_opt_, (size, count), _Maybenull_ _Writable_elements_(size) _Readable_elements_(count))
603 #define _Field_size_full_(size) _SAL2_Source_(_Field_size_full_, (size), _Field_size_part_(size, size))
604 #define _Field_size_full_opt_(size) _SAL2_Source_(_Field_size_full_opt_, (size), _Field_size_part_opt_(size, size))
605 
606 #define _Field_size_bytes_(size) _SAL2_Source_(_Field_size_bytes_, (size), _Notnull_ _Writable_bytes_(size))
607 #define _Field_size_bytes_opt_(size) _SAL2_Source_(_Field_size_bytes_opt_, (size), _Maybenull_ _Writable_bytes_(size))
608 #define _Field_size_bytes_part_(size, count) _SAL2_Source_(_Field_size_bytes_part_, (size, count), _Notnull_ _Writable_bytes_(size) _Readable_bytes_(count))
609 #define _Field_size_bytes_part_opt_(size, count) _SAL2_Source_(_Field_size_bytes_part_opt_, (size, count), _Maybenull_ _Writable_bytes_(size) _Readable_bytes_(count))
610 #define _Field_size_bytes_full_(size) _SAL2_Source_(_Field_size_bytes_full_, (size), _Field_size_bytes_part_(size, size))
611 #define _Field_size_bytes_full_opt_(size) _SAL2_Source_(_Field_size_bytes_full_opt_, (size), _Field_size_bytes_part_opt_(size, size))
612 
613 #define _Field_z_ _SAL2_Source_(_Field_z_, (), _Null_terminated_)
614 
615 #define _Field_range_(min,max) _SAL2_Source_(_Field_range_, (min,max), _Field_range_impl_(min,max))
616 
617 //============================================================================
618 // _Pre_\_Post_ Layer:
619 //============================================================================
620 
621 //
622 // Raw Pre/Post for declaring custom pre/post conditions
623 //
624 
625 #define _Pre_ _Pre_impl_
626 #define _Post_ _Post_impl_
627 
628 //
629 // Validity property
630 //
631 
632 #define _Valid_ _Valid_impl_
633 #define _Notvalid_ _Notvalid_impl_
634 #define _Maybevalid_ _Maybevalid_impl_
635 
636 //
637 // Buffer size properties
638 //
639 
640 // Expressing buffer sizes without specifying pre or post condition
641 #define _Readable_bytes_(size) _SAL2_Source_(_Readable_bytes_, (size), _Readable_bytes_impl_(size))
642 #define _Readable_elements_(size) _SAL2_Source_(_Readable_elements_, (size), _Readable_elements_impl_(size))
643 #define _Writable_bytes_(size) _SAL2_Source_(_Writable_bytes_, (size), _Writable_bytes_impl_(size))
644 #define _Writable_elements_(size) _SAL2_Source_(_Writable_elements_, (size), _Writable_elements_impl_(size))
645 
646 #define _Null_terminated_ _SAL2_Source_(_Null_terminated_, (), _Null_terminated_impl_)
647 #define _NullNull_terminated_ _SAL2_Source_(_NullNull_terminated_, (), _NullNull_terminated_impl_)
648 
649 // Expressing buffer size as pre or post condition
650 #define _Pre_readable_size_(size) _SAL2_Source_(_Pre_readable_size_, (size), _Pre1_impl_(__count_impl(size)) _Pre_valid_impl_)
651 #define _Pre_writable_size_(size) _SAL2_Source_(_Pre_writable_size_, (size), _Pre1_impl_(__cap_impl(size)))
652 #define _Pre_readable_byte_size_(size) _SAL2_Source_(_Pre_readable_byte_size_, (size), _Pre1_impl_(__bytecount_impl(size)) _Pre_valid_impl_)
653 #define _Pre_writable_byte_size_(size) _SAL2_Source_(_Pre_writable_byte_size_, (size), _Pre1_impl_(__bytecap_impl(size)))
654 
655 #define _Post_readable_size_(size) _SAL2_Source_(_Post_readable_size_, (size), _Post1_impl_(__count_impl(size)) _Post_valid_impl_)
656 #define _Post_writable_size_(size) _SAL2_Source_(_Post_writable_size_, (size), _Post1_impl_(__cap_impl(size)))
657 #define _Post_readable_byte_size_(size) _SAL2_Source_(_Post_readable_byte_size_, (size), _Post1_impl_(__bytecount_impl(size)) _Post_valid_impl_)
658 #define _Post_writable_byte_size_(size) _SAL2_Source_(_Post_writable_byte_size_, (size), _Post1_impl_(__bytecap_impl(size)))
659 
660 //
661 // Pointer null-ness properties
662 //
663 #define _Null_ _SAL2_Source_(_Null_, (), _Null_impl_)
664 #define _Notnull_ _SAL2_Source_(_Notnull_, (), _Notnull_impl_)
665 #define _Maybenull_ _SAL2_Source_(_Maybenull_, (), _Maybenull_impl_)
666 
667 //
668 // _Pre_ annotations ---
669 //
670 // describing conditions that must be met before the call of the function
671 
672 // e.g. int strlen( _Pre_z_ const char* sz );
673 // buffer is a zero terminated string
674 #define _Pre_z_ _SAL2_Source_(_Pre_z_, (), _Pre1_impl_(__zterm_impl) _Pre_valid_impl_)
675 
676 // valid size unknown or indicated by type (e.g.:LPSTR)
677 #define _Pre_valid_ _SAL2_Source_(_Pre_valid_, (), _Pre1_impl_(__notnull_impl_notref) _Pre_valid_impl_)
678 #define _Pre_opt_valid_ _SAL2_Source_(_Pre_opt_valid_, (), _Pre1_impl_(__maybenull_impl_notref) _Pre_valid_impl_)
679 
680 #define _Pre_invalid_ _SAL2_Source_(_Pre_invalid_, (), _Deref_pre1_impl_(__notvalid_impl))
681 
682 // Overrides recursive valid when some field is not yet initialized when using _Inout_
683 #define _Pre_unknown_ _SAL2_Source_(_Pre_unknown_, (), _Pre1_impl_(__maybevalid_impl))
684 
685 // used with allocated but not yet initialized objects
686 #define _Pre_notnull_ _SAL2_Source_(_Pre_notnull_, (), _Pre1_impl_(__notnull_impl_notref))
687 #define _Pre_maybenull_ _SAL2_Source_(_Pre_maybenull_, (), _Pre1_impl_(__maybenull_impl_notref))
688 #define _Pre_null_ _SAL2_Source_(_Pre_null_, (), _Pre1_impl_(__null_impl_notref))
689 
690 //
691 // _Post_ annotations ---
692 //
693 // describing conditions that hold after the function call
694 
695 // void CopyStr( _In_z_ const char* szFrom, _Pre_cap_(cch) _Post_z_ char* szFrom, size_t cchFrom );
696 // buffer will be a zero-terminated string after the call
697 #define _Post_z_ _SAL2_Source_(_Post_z_, (), _Post1_impl_(__zterm_impl) _Post_valid_impl_)
698 
699 // e.g. HRESULT InitStruct( _Post_valid_ Struct* pobj );
700 #define _Post_valid_ _SAL2_Source_(_Post_valid_, (), _Post_valid_impl_)
701 #define _Post_invalid_ _SAL2_Source_(_Post_invalid_, (), _Deref_post1_impl_(__notvalid_impl))
702 
703 // e.g. void free( _Post_ptr_invalid_ void* pv );
704 #define _Post_ptr_invalid_ _SAL2_Source_(_Post_ptr_invalid_, (), _Post1_impl_(__notvalid_impl))
705 
706 // e.g. void ThrowExceptionIfNull( _Post_notnull_ const void* pv );
707 #define _Post_notnull_ _SAL2_Source_(_Post_notnull_, (), _Post1_impl_(__notnull_impl))
708 
709 // e.g. HRESULT GetObject(_Outptr_ _On_failure_(_At_(*p, _Post_null_)) T **p);
710 #define _Post_null_ _SAL2_Source_(_Post_null_, (), _Post1_impl_(__null_impl))
711 
712 #define _Post_maybenull_ _SAL2_Source_(_Post_maybenull_, (), _Post1_impl_(__maybenull_impl))
713 
714 #define _Prepost_z_ _SAL2_Source_(_Prepost_z_, (), _Pre_z_ _Post_z_)
715 
716 
717 #pragma region Input Buffer SAL 1 compatibility macros
718 
719 /*==========================================================================
720 
721  This section contains definitions for macros defined for VS2010 and earlier.
722  Usage of these macros is still supported, but the SAL 2 macros defined above
723  are recommended instead. This comment block is retained to assist in
724  understanding SAL that still uses the older syntax.
725 
726  The macros are defined in 3 layers:
727 
728  _In_\_Out_ Layer:
729  ----------------
730  This layer provides the highest abstraction and its macros should be used
731  in most cases. Its macros start with _In_, _Out_ or _Inout_. For the
732  typical case they provide the most concise annotations.
733 
734  _Pre_\_Post_ Layer:
735  ------------------
736  The macros of this layer only should be used when there is no suitable macro
737  in the _In_\_Out_ layer. Its macros start with _Pre_, _Post_, _Ret_,
738  _Deref_pre_ _Deref_post_ and _Deref_ret_. This layer provides the most
739  flexibility for annotations.
740 
741  Implementation Abstraction Layer:
742  --------------------------------
743  Macros from this layer should never be used directly. The layer only exists
744  to hide the implementation of the annotation macros.
745 
746 
747  Annotation Syntax:
748  |--------------|----------|----------------|-----------------------------|
749  | Usage | Nullness | ZeroTerminated | Extent |
750  |--------------|----------|----------------|-----------------------------|
751  | _In_ | <> | <> | <> |
752  | _Out_ | opt_ | z_ | [byte]cap_[c_|x_]( size ) |
753  | _Inout_ | | | [byte]count_[c_|x_]( size ) |
754  | _Deref_out_ | | | ptrdiff_cap_( ptr ) |
755  |--------------| | | ptrdiff_count_( ptr ) |
756  | _Ret_ | | | |
757  | _Deref_ret_ | | | |
758  |--------------| | | |
759  | _Pre_ | | | |
760  | _Post_ | | | |
761  | _Deref_pre_ | | | |
762  | _Deref_post_ | | | |
763  |--------------|----------|----------------|-----------------------------|
764 
765  Usage:
766  -----
767  _In_, _Out_, _Inout_, _Pre_, _Post_, _Deref_pre_, _Deref_post_ are for
768  formal parameters.
769  _Ret_, _Deref_ret_ must be used for return values.
770 
771  Nullness:
772  --------
773  If the pointer can be NULL the annotation contains _opt. If the macro
774  does not contain '_opt' the pointer may not be NULL.
775 
776  String Type:
777  -----------
778  _z: NullTerminated string
779  for _In_ parameters the buffer must have the specified stringtype before the call
780  for _Out_ parameters the buffer must have the specified stringtype after the call
781  for _Inout_ parameters both conditions apply
782 
783  Extent Syntax:
784  |------|---------------|---------------|
785  | Unit | Writ\Readable | Argument Type |
786  |------|---------------|---------------|
787  | <> | cap_ | <> |
788  | byte | count_ | c_ |
789  | | | x_ |
790  |------|---------------|---------------|
791 
792  'cap' (capacity) describes the writable size of the buffer and is typically used
793  with _Out_. The default unit is elements. Use 'bytecap' if the size is given in bytes
794  'count' describes the readable size of the buffer and is typically used with _In_.
795  The default unit is elements. Use 'bytecount' if the size is given in bytes.
796 
797  Argument syntax for cap_, bytecap_, count_, bytecount_:
798  (<parameter>|return)[+n] e.g. cch, return, cb+2
799 
800  If the buffer size is a constant expression use the c_ postfix.
801  E.g. cap_c_(20), count_c_(MAX_PATH), bytecount_c_(16)
802 
803  If the buffer size is given by a limiting pointer use the ptrdiff_ versions
804  of the macros.
805 
806  If the buffer size is neither a parameter nor a constant expression use the x_
807  postfix. e.g. bytecount_x_(num*size) x_ annotations accept any arbitrary string.
808  No analysis can be done for x_ annotations but they at least tell the tool that
809  the buffer has some sort of extent description. x_ annotations might be supported
810  by future compiler versions.
811 
812 ============================================================================*/
813 
814 // e.g. void SetCharRange( _In_count_(cch) const char* rgch, size_t cch )
815 // valid buffer extent described by another parameter
816 #define _In_count_(size) _SAL1_1_Source_(_In_count_, (size), _Pre_count_(size) _Deref_pre_readonly_)
817 #define _In_opt_count_(size) _SAL1_1_Source_(_In_opt_count_, (size), _Pre_opt_count_(size) _Deref_pre_readonly_)
818 #define _In_bytecount_(size) _SAL1_1_Source_(_In_bytecount_, (size), _Pre_bytecount_(size) _Deref_pre_readonly_)
819 #define _In_opt_bytecount_(size) _SAL1_1_Source_(_In_opt_bytecount_, (size), _Pre_opt_bytecount_(size) _Deref_pre_readonly_)
820 
821 // valid buffer extent described by a constant extression
822 #define _In_count_c_(size) _SAL1_1_Source_(_In_count_c_, (size), _Pre_count_c_(size) _Deref_pre_readonly_)
823 #define _In_opt_count_c_(size) _SAL1_1_Source_(_In_opt_count_c_, (size), _Pre_opt_count_c_(size) _Deref_pre_readonly_)
824 #define _In_bytecount_c_(size) _SAL1_1_Source_(_In_bytecount_c_, (size), _Pre_bytecount_c_(size) _Deref_pre_readonly_)
825 #define _In_opt_bytecount_c_(size) _SAL1_1_Source_(_In_opt_bytecount_c_, (size), _Pre_opt_bytecount_c_(size) _Deref_pre_readonly_)
826 
827 // nullterminated 'input' buffers with given size
828 
829 // e.g. void SetCharRange( _In_count_(cch) const char* rgch, size_t cch )
830 // nullterminated valid buffer extent described by another parameter
831 #define _In_z_count_(size) _SAL1_1_Source_(_In_z_count_, (size), _Pre_z_ _Pre_count_(size) _Deref_pre_readonly_)
832 #define _In_opt_z_count_(size) _SAL1_1_Source_(_In_opt_z_count_, (size), _Pre_opt_z_ _Pre_opt_count_(size) _Deref_pre_readonly_)
833 #define _In_z_bytecount_(size) _SAL1_1_Source_(_In_z_bytecount_, (size), _Pre_z_ _Pre_bytecount_(size) _Deref_pre_readonly_)
834 #define _In_opt_z_bytecount_(size) _SAL1_1_Source_(_In_opt_z_bytecount_, (size), _Pre_opt_z_ _Pre_opt_bytecount_(size) _Deref_pre_readonly_)
835 
836 // nullterminated valid buffer extent described by a constant extression
837 #define _In_z_count_c_(size) _SAL1_1_Source_(_In_z_count_c_, (size), _Pre_z_ _Pre_count_c_(size) _Deref_pre_readonly_)
838 #define _In_opt_z_count_c_(size) _SAL1_1_Source_(_In_opt_z_count_c_, (size), _Pre_opt_z_ _Pre_opt_count_c_(size) _Deref_pre_readonly_)
839 #define _In_z_bytecount_c_(size) _SAL1_1_Source_(_In_z_bytecount_c_, (size), _Pre_z_ _Pre_bytecount_c_(size) _Deref_pre_readonly_)
840 #define _In_opt_z_bytecount_c_(size) _SAL1_1_Source_(_In_opt_z_bytecount_c_, (size), _Pre_opt_z_ _Pre_opt_bytecount_c_(size) _Deref_pre_readonly_)
841 
842 // buffer capacity is described by another pointer
843 // e.g. void Foo( _In_ptrdiff_count_(pchMax) const char* pch, const char* pchMax ) { while pch < pchMax ) pch++; }
844 #define _In_ptrdiff_count_(size) _SAL1_1_Source_(_In_ptrdiff_count_, (size), _Pre_ptrdiff_count_(size) _Deref_pre_readonly_)
845 #define _In_opt_ptrdiff_count_(size) _SAL1_1_Source_(_In_opt_ptrdiff_count_, (size), _Pre_opt_ptrdiff_count_(size) _Deref_pre_readonly_)
846 
847 // 'x' version for complex expressions that are not supported by the current compiler version
848 // e.g. void Set3ColMatrix( _In_count_x_(3*cRows) const Elem* matrix, int cRows );
849 #define _In_count_x_(size) _SAL1_1_Source_(_In_count_x_, (size), _Pre_count_x_(size) _Deref_pre_readonly_)
850 #define _In_opt_count_x_(size) _SAL1_1_Source_(_In_opt_count_x_, (size), _Pre_opt_count_x_(size) _Deref_pre_readonly_)
851 #define _In_bytecount_x_(size) _SAL1_1_Source_(_In_bytecount_x_, (size), _Pre_bytecount_x_(size) _Deref_pre_readonly_)
852 #define _In_opt_bytecount_x_(size) _SAL1_1_Source_(_In_opt_bytecount_x_, (size), _Pre_opt_bytecount_x_(size) _Deref_pre_readonly_)
853 
854 
855 // 'out' with buffer size
856 // e.g. void GetIndeces( _Out_cap_(cIndeces) int* rgIndeces, size_t cIndices );
857 // buffer capacity is described by another parameter
858 #define _Out_cap_(size) _SAL1_1_Source_(_Out_cap_, (size), _Pre_cap_(size) _Post_valid_impl_)
859 #define _Out_opt_cap_(size) _SAL1_1_Source_(_Out_opt_cap_, (size), _Pre_opt_cap_(size) _Post_valid_impl_)
860 #define _Out_bytecap_(size) _SAL1_1_Source_(_Out_bytecap_, (size), _Pre_bytecap_(size) _Post_valid_impl_)
861 #define _Out_opt_bytecap_(size) _SAL1_1_Source_(_Out_opt_bytecap_, (size), _Pre_opt_bytecap_(size) _Post_valid_impl_)
862 
863 // buffer capacity is described by a constant expression
864 #define _Out_cap_c_(size) _SAL1_1_Source_(_Out_cap_c_, (size), _Pre_cap_c_(size) _Post_valid_impl_)
865 #define _Out_opt_cap_c_(size) _SAL1_1_Source_(_Out_opt_cap_c_, (size), _Pre_opt_cap_c_(size) _Post_valid_impl_)
866 #define _Out_bytecap_c_(size) _SAL1_1_Source_(_Out_bytecap_c_, (size), _Pre_bytecap_c_(size) _Post_valid_impl_)
867 #define _Out_opt_bytecap_c_(size) _SAL1_1_Source_(_Out_opt_bytecap_c_, (size), _Pre_opt_bytecap_c_(size) _Post_valid_impl_)
868 
869 // buffer capacity is described by another parameter multiplied by a constant expression
870 #define _Out_cap_m_(mult,size) _SAL1_1_Source_(_Out_cap_m_, (mult,size), _Pre_cap_m_(mult,size) _Post_valid_impl_)
871 #define _Out_opt_cap_m_(mult,size) _SAL1_1_Source_(_Out_opt_cap_m_, (mult,size), _Pre_opt_cap_m_(mult,size) _Post_valid_impl_)
872 #define _Out_z_cap_m_(mult,size) _SAL1_1_Source_(_Out_z_cap_m_, (mult,size), _Pre_cap_m_(mult,size) _Post_valid_impl_ _Post_z_)
873 #define _Out_opt_z_cap_m_(mult,size) _SAL1_1_Source_(_Out_opt_z_cap_m_, (mult,size), _Pre_opt_cap_m_(mult,size) _Post_valid_impl_ _Post_z_)
874 
875 // buffer capacity is described by another pointer
876 // e.g. void Foo( _Out_ptrdiff_cap_(pchMax) char* pch, const char* pchMax ) { while pch < pchMax ) pch++; }
877 #define _Out_ptrdiff_cap_(size) _SAL1_1_Source_(_Out_ptrdiff_cap_, (size), _Pre_ptrdiff_cap_(size) _Post_valid_impl_)
878 #define _Out_opt_ptrdiff_cap_(size) _SAL1_1_Source_(_Out_opt_ptrdiff_cap_, (size), _Pre_opt_ptrdiff_cap_(size) _Post_valid_impl_)
879 
880 // buffer capacity is described by a complex expression
881 #define _Out_cap_x_(size) _SAL1_1_Source_(_Out_cap_x_, (size), _Pre_cap_x_(size) _Post_valid_impl_)
882 #define _Out_opt_cap_x_(size) _SAL1_1_Source_(_Out_opt_cap_x_, (size), _Pre_opt_cap_x_(size) _Post_valid_impl_)
883 #define _Out_bytecap_x_(size) _SAL1_1_Source_(_Out_bytecap_x_, (size), _Pre_bytecap_x_(size) _Post_valid_impl_)
884 #define _Out_opt_bytecap_x_(size) _SAL1_1_Source_(_Out_opt_bytecap_x_, (size), _Pre_opt_bytecap_x_(size) _Post_valid_impl_)
885 
886 // a zero terminated string is filled into a buffer of given capacity
887 // e.g. void CopyStr( _In_z_ const char* szFrom, _Out_z_cap_(cchTo) char* szTo, size_t cchTo );
888 // buffer capacity is described by another parameter
889 #define _Out_z_cap_(size) _SAL1_1_Source_(_Out_z_cap_, (size), _Pre_cap_(size) _Post_valid_impl_ _Post_z_)
890 #define _Out_opt_z_cap_(size) _SAL1_1_Source_(_Out_opt_z_cap_, (size), _Pre_opt_cap_(size) _Post_valid_impl_ _Post_z_)
891 #define _Out_z_bytecap_(size) _SAL1_1_Source_(_Out_z_bytecap_, (size), _Pre_bytecap_(size) _Post_valid_impl_ _Post_z_)
892 #define _Out_opt_z_bytecap_(size) _SAL1_1_Source_(_Out_opt_z_bytecap_, (size), _Pre_opt_bytecap_(size) _Post_valid_impl_ _Post_z_)
893 
894 // buffer capacity is described by a constant expression
895 #define _Out_z_cap_c_(size) _SAL1_1_Source_(_Out_z_cap_c_, (size), _Pre_cap_c_(size) _Post_valid_impl_ _Post_z_)
896 #define _Out_opt_z_cap_c_(size) _SAL1_1_Source_(_Out_opt_z_cap_c_, (size), _Pre_opt_cap_c_(size) _Post_valid_impl_ _Post_z_)
897 #define _Out_z_bytecap_c_(size) _SAL1_1_Source_(_Out_z_bytecap_c_, (size), _Pre_bytecap_c_(size) _Post_valid_impl_ _Post_z_)
898 #define _Out_opt_z_bytecap_c_(size) _SAL1_1_Source_(_Out_opt_z_bytecap_c_, (size), _Pre_opt_bytecap_c_(size) _Post_valid_impl_ _Post_z_)
899 
900 // buffer capacity is described by a complex expression
901 #define _Out_z_cap_x_(size) _SAL1_1_Source_(_Out_z_cap_x_, (size), _Pre_cap_x_(size) _Post_valid_impl_ _Post_z_)
902 #define _Out_opt_z_cap_x_(size) _SAL1_1_Source_(_Out_opt_z_cap_x_, (size), _Pre_opt_cap_x_(size) _Post_valid_impl_ _Post_z_)
903 #define _Out_z_bytecap_x_(size) _SAL1_1_Source_(_Out_z_bytecap_x_, (size), _Pre_bytecap_x_(size) _Post_valid_impl_ _Post_z_)
904 #define _Out_opt_z_bytecap_x_(size) _SAL1_1_Source_(_Out_opt_z_bytecap_x_, (size), _Pre_opt_bytecap_x_(size) _Post_valid_impl_ _Post_z_)
905 
906 // a zero terminated string is filled into a buffer of given capacity
907 // e.g. size_t CopyCharRange( _In_count_(cchFrom) const char* rgchFrom, size_t cchFrom, _Out_cap_post_count_(cchTo,return)) char* rgchTo, size_t cchTo );
908 #define _Out_cap_post_count_(cap,count) _SAL1_1_Source_(_Out_cap_post_count_, (cap,count), _Pre_cap_(cap) _Post_valid_impl_ _Post_count_(count))
909 #define _Out_opt_cap_post_count_(cap,count) _SAL1_1_Source_(_Out_opt_cap_post_count_, (cap,count), _Pre_opt_cap_(cap) _Post_valid_impl_ _Post_count_(count))
910 #define _Out_bytecap_post_bytecount_(cap,count) _SAL1_1_Source_(_Out_bytecap_post_bytecount_, (cap,count), _Pre_bytecap_(cap) _Post_valid_impl_ _Post_bytecount_(count))
911 #define _Out_opt_bytecap_post_bytecount_(cap,count) _SAL1_1_Source_(_Out_opt_bytecap_post_bytecount_, (cap,count), _Pre_opt_bytecap_(cap) _Post_valid_impl_ _Post_bytecount_(count))
912 
913 // a zero terminated string is filled into a buffer of given capacity
914 // e.g. size_t CopyStr( _In_z_ const char* szFrom, _Out_z_cap_post_count_(cchTo,return+1) char* szTo, size_t cchTo );
915 #define _Out_z_cap_post_count_(cap,count) _SAL1_1_Source_(_Out_z_cap_post_count_, (cap,count), _Pre_cap_(cap) _Post_valid_impl_ _Post_z_count_(count))
916 #define _Out_opt_z_cap_post_count_(cap,count) _SAL1_1_Source_(_Out_opt_z_cap_post_count_, (cap,count), _Pre_opt_cap_(cap) _Post_valid_impl_ _Post_z_count_(count))
917 #define _Out_z_bytecap_post_bytecount_(cap,count) _SAL1_1_Source_(_Out_z_bytecap_post_bytecount_, (cap,count), _Pre_bytecap_(cap) _Post_valid_impl_ _Post_z_bytecount_(count))
918 #define _Out_opt_z_bytecap_post_bytecount_(cap,count) _SAL1_1_Source_(_Out_opt_z_bytecap_post_bytecount_, (cap,count), _Pre_opt_bytecap_(cap) _Post_valid_impl_ _Post_z_bytecount_(count))
919 
920 // only use with dereferenced arguments e.g. '*pcch'
921 #define _Out_capcount_(capcount) _SAL1_1_Source_(_Out_capcount_, (capcount), _Pre_cap_(capcount) _Post_valid_impl_ _Post_count_(capcount))
922 #define _Out_opt_capcount_(capcount) _SAL1_1_Source_(_Out_opt_capcount_, (capcount), _Pre_opt_cap_(capcount) _Post_valid_impl_ _Post_count_(capcount))
923 #define _Out_bytecapcount_(capcount) _SAL1_1_Source_(_Out_bytecapcount_, (capcount), _Pre_bytecap_(capcount) _Post_valid_impl_ _Post_bytecount_(capcount))
924 #define _Out_opt_bytecapcount_(capcount) _SAL1_1_Source_(_Out_opt_bytecapcount_, (capcount), _Pre_opt_bytecap_(capcount) _Post_valid_impl_ _Post_bytecount_(capcount))
925 
926 #define _Out_capcount_x_(capcount) _SAL1_1_Source_(_Out_capcount_x_, (capcount), _Pre_cap_x_(capcount) _Post_valid_impl_ _Post_count_x_(capcount))
927 #define _Out_opt_capcount_x_(capcount) _SAL1_1_Source_(_Out_opt_capcount_x_, (capcount), _Pre_opt_cap_x_(capcount) _Post_valid_impl_ _Post_count_x_(capcount))
928 #define _Out_bytecapcount_x_(capcount) _SAL1_1_Source_(_Out_bytecapcount_x_, (capcount), _Pre_bytecap_x_(capcount) _Post_valid_impl_ _Post_bytecount_x_(capcount))
929 #define _Out_opt_bytecapcount_x_(capcount) _SAL1_1_Source_(_Out_opt_bytecapcount_x_, (capcount), _Pre_opt_bytecap_x_(capcount) _Post_valid_impl_ _Post_bytecount_x_(capcount))
930 
931 // e.g. GetString( _Out_z_capcount_(*pLen+1) char* sz, size_t* pLen );
932 #define _Out_z_capcount_(capcount) _SAL1_1_Source_(_Out_z_capcount_, (capcount), _Pre_cap_(capcount) _Post_valid_impl_ _Post_z_count_(capcount))
933 #define _Out_opt_z_capcount_(capcount) _SAL1_1_Source_(_Out_opt_z_capcount_, (capcount), _Pre_opt_cap_(capcount) _Post_valid_impl_ _Post_z_count_(capcount))
934 #define _Out_z_bytecapcount_(capcount) _SAL1_1_Source_(_Out_z_bytecapcount_, (capcount), _Pre_bytecap_(capcount) _Post_valid_impl_ _Post_z_bytecount_(capcount))
935 #define _Out_opt_z_bytecapcount_(capcount) _SAL1_1_Source_(_Out_opt_z_bytecapcount_, (capcount), _Pre_opt_bytecap_(capcount) _Post_valid_impl_ _Post_z_bytecount_(capcount))
936 
937 
938 // 'inout' buffers with initialized elements before and after the call
939 // e.g. void ModifyIndices( _Inout_count_(cIndices) int* rgIndeces, size_t cIndices );
940 #define _Inout_count_(size) _SAL1_1_Source_(_Inout_count_, (size), _Prepost_count_(size))
941 #define _Inout_opt_count_(size) _SAL1_1_Source_(_Inout_opt_count_, (size), _Prepost_opt_count_(size))
942 #define _Inout_bytecount_(size) _SAL1_1_Source_(_Inout_bytecount_, (size), _Prepost_bytecount_(size))
943 #define _Inout_opt_bytecount_(size) _SAL1_1_Source_(_Inout_opt_bytecount_, (size), _Prepost_opt_bytecount_(size))
944 
945 #define _Inout_count_c_(size) _SAL1_1_Source_(_Inout_count_c_, (size), _Prepost_count_c_(size))
946 #define _Inout_opt_count_c_(size) _SAL1_1_Source_(_Inout_opt_count_c_, (size), _Prepost_opt_count_c_(size))
947 #define _Inout_bytecount_c_(size) _SAL1_1_Source_(_Inout_bytecount_c_, (size), _Prepost_bytecount_c_(size))
948 #define _Inout_opt_bytecount_c_(size) _SAL1_1_Source_(_Inout_opt_bytecount_c_, (size), _Prepost_opt_bytecount_c_(size))
949 
950 // nullterminated 'inout' buffers with initialized elements before and after the call
951 // e.g. void ModifyIndices( _Inout_count_(cIndices) int* rgIndeces, size_t cIndices );
952 #define _Inout_z_count_(size) _SAL1_1_Source_(_Inout_z_count_, (size), _Prepost_z_ _Prepost_count_(size))
953 #define _Inout_opt_z_count_(size) _SAL1_1_Source_(_Inout_opt_z_count_, (size), _Prepost_z_ _Prepost_opt_count_(size))
954 #define _Inout_z_bytecount_(size) _SAL1_1_Source_(_Inout_z_bytecount_, (size), _Prepost_z_ _Prepost_bytecount_(size))
955 #define _Inout_opt_z_bytecount_(size) _SAL1_1_Source_(_Inout_opt_z_bytecount_, (size), _Prepost_z_ _Prepost_opt_bytecount_(size))
956 
957 #define _Inout_z_count_c_(size) _SAL1_1_Source_(_Inout_z_count_c_, (size), _Prepost_z_ _Prepost_count_c_(size))
958 #define _Inout_opt_z_count_c_(size) _SAL1_1_Source_(_Inout_opt_z_count_c_, (size), _Prepost_z_ _Prepost_opt_count_c_(size))
959 #define _Inout_z_bytecount_c_(size) _SAL1_1_Source_(_Inout_z_bytecount_c_, (size), _Prepost_z_ _Prepost_bytecount_c_(size))
960 #define _Inout_opt_z_bytecount_c_(size) _SAL1_1_Source_(_Inout_opt_z_bytecount_c_, (size), _Prepost_z_ _Prepost_opt_bytecount_c_(size))
961 
962 #define _Inout_ptrdiff_count_(size) _SAL1_1_Source_(_Inout_ptrdiff_count_, (size), _Pre_ptrdiff_count_(size))
963 #define _Inout_opt_ptrdiff_count_(size) _SAL1_1_Source_(_Inout_opt_ptrdiff_count_, (size), _Pre_opt_ptrdiff_count_(size))
964 
965 #define _Inout_count_x_(size) _SAL1_1_Source_(_Inout_count_x_, (size), _Prepost_count_x_(size))
966 #define _Inout_opt_count_x_(size) _SAL1_1_Source_(_Inout_opt_count_x_, (size), _Prepost_opt_count_x_(size))
967 #define _Inout_bytecount_x_(size) _SAL1_1_Source_(_Inout_bytecount_x_, (size), _Prepost_bytecount_x_(size))
968 #define _Inout_opt_bytecount_x_(size) _SAL1_1_Source_(_Inout_opt_bytecount_x_, (size), _Prepost_opt_bytecount_x_(size))
969 
970 // e.g. void AppendToLPSTR( _In_ LPCSTR szFrom, _Inout_cap_(cchTo) LPSTR* szTo, size_t cchTo );
971 #define _Inout_cap_(size) _SAL1_1_Source_(_Inout_cap_, (size), _Pre_valid_cap_(size) _Post_valid_)
972 #define _Inout_opt_cap_(size) _SAL1_1_Source_(_Inout_opt_cap_, (size), _Pre_opt_valid_cap_(size) _Post_valid_)
973 #define _Inout_bytecap_(size) _SAL1_1_Source_(_Inout_bytecap_, (size), _Pre_valid_bytecap_(size) _Post_valid_)
974 #define _Inout_opt_bytecap_(size) _SAL1_1_Source_(_Inout_opt_bytecap_, (size), _Pre_opt_valid_bytecap_(size) _Post_valid_)
975 
976 #define _Inout_cap_c_(size) _SAL1_1_Source_(_Inout_cap_c_, (size), _Pre_valid_cap_c_(size) _Post_valid_)
977 #define _Inout_opt_cap_c_(size) _SAL1_1_Source_(_Inout_opt_cap_c_, (size), _Pre_opt_valid_cap_c_(size) _Post_valid_)
978 #define _Inout_bytecap_c_(size) _SAL1_1_Source_(_Inout_bytecap_c_, (size), _Pre_valid_bytecap_c_(size) _Post_valid_)
979 #define _Inout_opt_bytecap_c_(size) _SAL1_1_Source_(_Inout_opt_bytecap_c_, (size), _Pre_opt_valid_bytecap_c_(size) _Post_valid_)
980 
981 #define _Inout_cap_x_(size) _SAL1_1_Source_(_Inout_cap_x_, (size), _Pre_valid_cap_x_(size) _Post_valid_)
982 #define _Inout_opt_cap_x_(size) _SAL1_1_Source_(_Inout_opt_cap_x_, (size), _Pre_opt_valid_cap_x_(size) _Post_valid_)
983 #define _Inout_bytecap_x_(size) _SAL1_1_Source_(_Inout_bytecap_x_, (size), _Pre_valid_bytecap_x_(size) _Post_valid_)
984 #define _Inout_opt_bytecap_x_(size) _SAL1_1_Source_(_Inout_opt_bytecap_x_, (size), _Pre_opt_valid_bytecap_x_(size) _Post_valid_)
985 
986 // inout string buffers with writable size
987 // e.g. void AppendStr( _In_z_ const char* szFrom, _Inout_z_cap_(cchTo) char* szTo, size_t cchTo );
988 #define _Inout_z_cap_(size) _SAL1_1_Source_(_Inout_z_cap_, (size), _Pre_z_cap_(size) _Post_z_)
989 #define _Inout_opt_z_cap_(size) _SAL1_1_Source_(_Inout_opt_z_cap_, (size), _Pre_opt_z_cap_(size) _Post_z_)
990 #define _Inout_z_bytecap_(size) _SAL1_1_Source_(_Inout_z_bytecap_, (size), _Pre_z_bytecap_(size) _Post_z_)
991 #define _Inout_opt_z_bytecap_(size) _SAL1_1_Source_(_Inout_opt_z_bytecap_, (size), _Pre_opt_z_bytecap_(size) _Post_z_)
992 
993 #define _Inout_z_cap_c_(size) _SAL1_1_Source_(_Inout_z_cap_c_, (size), _Pre_z_cap_c_(size) _Post_z_)
994 #define _Inout_opt_z_cap_c_(size) _SAL1_1_Source_(_Inout_opt_z_cap_c_, (size), _Pre_opt_z_cap_c_(size) _Post_z_)
995 #define _Inout_z_bytecap_c_(size) _SAL1_1_Source_(_Inout_z_bytecap_c_, (size), _Pre_z_bytecap_c_(size) _Post_z_)
996 #define _Inout_opt_z_bytecap_c_(size) _SAL1_1_Source_(_Inout_opt_z_bytecap_c_, (size), _Pre_opt_z_bytecap_c_(size) _Post_z_)
997 
998 #define _Inout_z_cap_x_(size) _SAL1_1_Source_(_Inout_z_cap_x_, (size), _Pre_z_cap_x_(size) _Post_z_)
999 #define _Inout_opt_z_cap_x_(size) _SAL1_1_Source_(_Inout_opt_z_cap_x_, (size), _Pre_opt_z_cap_x_(size) _Post_z_)
1000 #define _Inout_z_bytecap_x_(size) _SAL1_1_Source_(_Inout_z_bytecap_x_, (size), _Pre_z_bytecap_x_(size) _Post_z_)
1001 #define _Inout_opt_z_bytecap_x_(size) _SAL1_1_Source_(_Inout_opt_z_bytecap_x_, (size), _Pre_opt_z_bytecap_x_(size) _Post_z_)
1002 
1003 
1004 // returning pointers to valid objects
1005 #define _Ret_ _SAL1_1_Source_(_Ret_, (), _Ret_valid_)
1006 #define _Ret_opt_ _SAL1_1_Source_(_Ret_opt_, (), _Ret_opt_valid_)
1007 
1008 // annotations to express 'boundedness' of integral value parameter
1009 #define _In_bound_ _SAL1_1_Source_(_In_bound_, (), _In_bound_impl_)
1010 #define _Out_bound_ _SAL1_1_Source_(_Out_bound_, (), _Out_bound_impl_)
1011 #define _Ret_bound_ _SAL1_1_Source_(_Ret_bound_, (), _Ret_bound_impl_)
1012 #define _Deref_in_bound_ _SAL1_1_Source_(_Deref_in_bound_, (), _Deref_in_bound_impl_)
1013 #define _Deref_out_bound_ _SAL1_1_Source_(_Deref_out_bound_, (), _Deref_out_bound_impl_)
1014 #define _Deref_inout_bound_ _SAL1_1_Source_(_Deref_inout_bound_, (), _Deref_in_bound_ _Deref_out_bound_)
1015 #define _Deref_ret_bound_ _SAL1_1_Source_(_Deref_ret_bound_, (), _Deref_ret_bound_impl_)
1016 
1017 // e.g. HRESULT HrCreatePoint( _Deref_out_opt_ POINT** ppPT );
1018 #define _Deref_out_ _SAL1_1_Source_(_Deref_out_, (), _Out_ _Deref_post_valid_)
1019 #define _Deref_out_opt_ _SAL1_1_Source_(_Deref_out_opt_, (), _Out_ _Deref_post_opt_valid_)
1020 #define _Deref_opt_out_ _SAL1_1_Source_(_Deref_opt_out_, (), _Out_opt_ _Deref_post_valid_)
1021 #define _Deref_opt_out_opt_ _SAL1_1_Source_(_Deref_opt_out_opt_, (), _Out_opt_ _Deref_post_opt_valid_)
1022 
1023 // e.g. void CloneString( _In_z_ const wchar_t* wzFrom, _Deref_out_z_ wchar_t** pWzTo );
1024 #define _Deref_out_z_ _SAL1_1_Source_(_Deref_out_z_, (), _Out_ _Deref_post_z_)
1025 #define _Deref_out_opt_z_ _SAL1_1_Source_(_Deref_out_opt_z_, (), _Out_ _Deref_post_opt_z_)
1026 #define _Deref_opt_out_z_ _SAL1_1_Source_(_Deref_opt_out_z_, (), _Out_opt_ _Deref_post_z_)
1027 #define _Deref_opt_out_opt_z_ _SAL1_1_Source_(_Deref_opt_out_opt_z_, (), _Out_opt_ _Deref_post_opt_z_)
1028 
1029 //
1030 // _Deref_pre_ ---
1031 //
1032 // describing conditions for array elements of dereferenced pointer parameters that must be met before the call
1033 
1034 // e.g. void SaveStringArray( _In_count_(cStrings) _Deref_pre_z_ const wchar_t* const rgpwch[] );
1035 #define _Deref_pre_z_ _SAL1_1_Source_(_Deref_pre_z_, (), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__zterm_impl) _Pre_valid_impl_)
1036 #define _Deref_pre_opt_z_ _SAL1_1_Source_(_Deref_pre_opt_z_, (), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__zterm_impl) _Pre_valid_impl_)
1037 
1038 // e.g. void FillInArrayOfStr32( _In_count_(cStrings) _Deref_pre_cap_c_(32) _Deref_post_z_ wchar_t* const rgpwch[] );
1039 // buffer capacity is described by another parameter
1040 #define _Deref_pre_cap_(size) _SAL1_1_Source_(_Deref_pre_cap_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__cap_impl(size)))
1041 #define _Deref_pre_opt_cap_(size) _SAL1_1_Source_(_Deref_pre_opt_cap_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__cap_impl(size)))
1042 #define _Deref_pre_bytecap_(size) _SAL1_1_Source_(_Deref_pre_bytecap_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecap_impl(size)))
1043 #define _Deref_pre_opt_bytecap_(size) _SAL1_1_Source_(_Deref_pre_opt_bytecap_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecap_impl(size)))
1044 
1045 // buffer capacity is described by a constant expression
1046 #define _Deref_pre_cap_c_(size) _SAL1_1_Source_(_Deref_pre_cap_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__cap_c_impl(size)))
1047 #define _Deref_pre_opt_cap_c_(size) _SAL1_1_Source_(_Deref_pre_opt_cap_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__cap_c_impl(size)))
1048 #define _Deref_pre_bytecap_c_(size) _SAL1_1_Source_(_Deref_pre_bytecap_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecap_c_impl(size)))
1049 #define _Deref_pre_opt_bytecap_c_(size) _SAL1_1_Source_(_Deref_pre_opt_bytecap_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecap_c_impl(size)))
1050 
1051 // buffer capacity is described by a complex condition
1052 #define _Deref_pre_cap_x_(size) _SAL1_1_Source_(_Deref_pre_cap_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__cap_x_impl(size)))
1053 #define _Deref_pre_opt_cap_x_(size) _SAL1_1_Source_(_Deref_pre_opt_cap_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__cap_x_impl(size)))
1054 #define _Deref_pre_bytecap_x_(size) _SAL1_1_Source_(_Deref_pre_bytecap_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecap_x_impl(size)))
1055 #define _Deref_pre_opt_bytecap_x_(size) _SAL1_1_Source_(_Deref_pre_opt_bytecap_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecap_x_impl(size)))
1056 
1057 // convenience macros for nullterminated buffers with given capacity
1058 #define _Deref_pre_z_cap_(size) _SAL1_1_Source_(_Deref_pre_z_cap_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__cap_impl(size)) _Pre_valid_impl_)
1059 #define _Deref_pre_opt_z_cap_(size) _SAL1_1_Source_(_Deref_pre_opt_z_cap_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__cap_impl(size)) _Pre_valid_impl_)
1060 #define _Deref_pre_z_bytecap_(size) _SAL1_1_Source_(_Deref_pre_z_bytecap_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__bytecap_impl(size)) _Pre_valid_impl_)
1061 #define _Deref_pre_opt_z_bytecap_(size) _SAL1_1_Source_(_Deref_pre_opt_z_bytecap_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__bytecap_impl(size)) _Pre_valid_impl_)
1062 
1063 #define _Deref_pre_z_cap_c_(size) _SAL1_1_Source_(_Deref_pre_z_cap_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__cap_c_impl(size)) _Pre_valid_impl_)
1064 #define _Deref_pre_opt_z_cap_c_(size) _SAL1_1_Source_(_Deref_pre_opt_z_cap_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__cap_c_impl(size)) _Pre_valid_impl_)
1065 #define _Deref_pre_z_bytecap_c_(size) _SAL1_1_Source_(_Deref_pre_z_bytecap_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__bytecap_c_impl(size)) _Pre_valid_impl_)
1066 #define _Deref_pre_opt_z_bytecap_c_(size) _SAL1_1_Source_(_Deref_pre_opt_z_bytecap_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__bytecap_c_impl(size)) _Pre_valid_impl_)
1067 
1068 #define _Deref_pre_z_cap_x_(size) _SAL1_1_Source_(_Deref_pre_z_cap_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__cap_x_impl(size)) _Pre_valid_impl_)
1069 #define _Deref_pre_opt_z_cap_x_(size) _SAL1_1_Source_(_Deref_pre_opt_z_cap_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__cap_x_impl(size)) _Pre_valid_impl_)
1070 #define _Deref_pre_z_bytecap_x_(size) _SAL1_1_Source_(_Deref_pre_z_bytecap_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__bytecap_x_impl(size)) _Pre_valid_impl_)
1071 #define _Deref_pre_opt_z_bytecap_x_(size) _SAL1_1_Source_(_Deref_pre_opt_z_bytecap_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre2_impl_(__zterm_impl,__bytecap_x_impl(size)) _Pre_valid_impl_)
1072 
1073 // known capacity and valid but unknown readable extent
1074 #define _Deref_pre_valid_cap_(size) _SAL1_1_Source_(_Deref_pre_valid_cap_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__cap_impl(size)) _Pre_valid_impl_)
1075 #define _Deref_pre_opt_valid_cap_(size) _SAL1_1_Source_(_Deref_pre_opt_valid_cap_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__cap_impl(size)) _Pre_valid_impl_)
1076 #define _Deref_pre_valid_bytecap_(size) _SAL1_1_Source_(_Deref_pre_valid_bytecap_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecap_impl(size)) _Pre_valid_impl_)
1077 #define _Deref_pre_opt_valid_bytecap_(size) _SAL1_1_Source_(_Deref_pre_opt_valid_bytecap_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecap_impl(size)) _Pre_valid_impl_)
1078 
1079 #define _Deref_pre_valid_cap_c_(size) _SAL1_1_Source_(_Deref_pre_valid_cap_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__cap_c_impl(size)) _Pre_valid_impl_)
1080 #define _Deref_pre_opt_valid_cap_c_(size) _SAL1_1_Source_(_Deref_pre_opt_valid_cap_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__cap_c_impl(size)) _Pre_valid_impl_)
1081 #define _Deref_pre_valid_bytecap_c_(size) _SAL1_1_Source_(_Deref_pre_valid_bytecap_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecap_c_impl(size)) _Pre_valid_impl_)
1082 #define _Deref_pre_opt_valid_bytecap_c_(size) _SAL1_1_Source_(_Deref_pre_opt_valid_bytecap_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecap_c_impl(size)) _Pre_valid_impl_)
1083 
1084 #define _Deref_pre_valid_cap_x_(size) _SAL1_1_Source_(_Deref_pre_valid_cap_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__cap_x_impl(size)) _Pre_valid_impl_)
1085 #define _Deref_pre_opt_valid_cap_x_(size) _SAL1_1_Source_(_Deref_pre_opt_valid_cap_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__cap_x_impl(size)) _Pre_valid_impl_)
1086 #define _Deref_pre_valid_bytecap_x_(size) _SAL1_1_Source_(_Deref_pre_valid_bytecap_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecap_x_impl(size)) _Pre_valid_impl_)
1087 #define _Deref_pre_opt_valid_bytecap_x_(size) _SAL1_1_Source_(_Deref_pre_opt_valid_bytecap_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecap_x_impl(size)) _Pre_valid_impl_)
1088 
1089 // e.g. void SaveMatrix( _In_count_(n) _Deref_pre_count_(n) const Elem** matrix, size_t n );
1090 // valid buffer extent is described by another parameter
1091 #define _Deref_pre_count_(size) _SAL1_1_Source_(_Deref_pre_count_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__count_impl(size)) _Pre_valid_impl_)
1092 #define _Deref_pre_opt_count_(size) _SAL1_1_Source_(_Deref_pre_opt_count_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__count_impl(size)) _Pre_valid_impl_)
1093 #define _Deref_pre_bytecount_(size) _SAL1_1_Source_(_Deref_pre_bytecount_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecount_impl(size)) _Pre_valid_impl_)
1094 #define _Deref_pre_opt_bytecount_(size) _SAL1_1_Source_(_Deref_pre_opt_bytecount_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecount_impl(size)) _Pre_valid_impl_)
1095 
1096 // valid buffer extent is described by a constant expression
1097 #define _Deref_pre_count_c_(size) _SAL1_1_Source_(_Deref_pre_count_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__count_c_impl(size)) _Pre_valid_impl_)
1098 #define _Deref_pre_opt_count_c_(size) _SAL1_1_Source_(_Deref_pre_opt_count_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__count_c_impl(size)) _Pre_valid_impl_)
1099 #define _Deref_pre_bytecount_c_(size) _SAL1_1_Source_(_Deref_pre_bytecount_c_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecount_c_impl(size)) _Pre_valid_impl_)
1100 #define _Deref_pre_opt_bytecount_c_(size) _SAL1_1_Source_(_Deref_pre_opt_bytecount_c_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecount_c_impl(size)) _Pre_valid_impl_)
1101 
1102 // valid buffer extent is described by a complex expression
1103 #define _Deref_pre_count_x_(size) _SAL1_1_Source_(_Deref_pre_count_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__count_x_impl(size)) _Pre_valid_impl_)
1104 #define _Deref_pre_opt_count_x_(size) _SAL1_1_Source_(_Deref_pre_opt_count_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__count_x_impl(size)) _Pre_valid_impl_)
1105 #define _Deref_pre_bytecount_x_(size) _SAL1_1_Source_(_Deref_pre_bytecount_x_, (size), _Deref_pre1_impl_(__notnull_impl_notref) _Deref_pre1_impl_(__bytecount_x_impl(size)) _Pre_valid_impl_)
1106 #define _Deref_pre_opt_bytecount_x_(size) _SAL1_1_Source_(_Deref_pre_opt_bytecount_x_, (size), _Deref_pre1_impl_(__maybenull_impl_notref) _Deref_pre1_impl_(__bytecount_x_impl(size)) _Pre_valid_impl_)
1107 
1108 // e.g. void PrintStringArray( _In_count_(cElems) _Deref_pre_valid_ LPCSTR rgStr[], size_t cElems );
1109 #define _Deref_pre_valid_ _SAL1_1_Source_(_Deref_pre_valid_, (), _Deref_pre1_impl_(__notnull_impl_notref) _Pre_valid_impl_)
1110 #define _Deref_pre_opt_valid_ _SAL1_1_Source_(_Deref_pre_opt_valid_, (), _Deref_pre1_impl_(__maybenull_impl_notref) _Pre_valid_impl_)
1111 #define _Deref_pre_invalid_ _SAL1_1_Source_(_Deref_pre_invalid_, (), _Deref_pre1_impl_(__notvalid_impl))
1112 
1113 #define _Deref_pre_notnull_ _SAL1_1_Source_(_Deref_pre_notnull_, (), _Deref_pre1_impl_(__notnull_impl_notref))
1114 #define _Deref_pre_maybenull_ _SAL1_1_Source_(_Deref_pre_maybenull_, (), _Deref_pre1_impl_(__maybenull_impl_notref))
1115 #define _Deref_pre_null_ _SAL1_1_Source_(_Deref_pre_null_, (), _Deref_pre1_impl_(__null_impl_notref))
1116 
1117 // restrict access rights
1118 #define _Deref_pre_readonly_ _SAL1_1_Source_(_Deref_pre_readonly_, (), _Deref_pre1_impl_(__readaccess_impl_notref))
1119 #define _Deref_pre_writeonly_ _SAL1_1_Source_(_Deref_pre_writeonly_, (), _Deref_pre1_impl_(__writeaccess_impl_notref))
1120 
1121 //
1122 // _Deref_post_ ---
1123 //
1124 // describing conditions for array elements or dereferenced pointer parameters that hold after the call
1125 
1126 // e.g. void CloneString( _In_z_ const Wchar_t* wzIn _Out_ _Deref_post_z_ wchar_t** pWzOut );
1127 #define _Deref_post_z_ _SAL1_1_Source_(_Deref_post_z_, (), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__zterm_impl) _Post_valid_impl_)
1128 #define _Deref_post_opt_z_ _SAL1_1_Source_(_Deref_post_opt_z_, (), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__zterm_impl) _Post_valid_impl_)
1129 
1130 // e.g. HRESULT HrAllocateMemory( size_t cb, _Out_ _Deref_post_bytecap_(cb) void** ppv );
1131 // buffer capacity is described by another parameter
1132 #define _Deref_post_cap_(size) _SAL1_1_Source_(_Deref_post_cap_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__cap_impl(size)))
1133 #define _Deref_post_opt_cap_(size) _SAL1_1_Source_(_Deref_post_opt_cap_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__cap_impl(size)))
1134 #define _Deref_post_bytecap_(size) _SAL1_1_Source_(_Deref_post_bytecap_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecap_impl(size)))
1135 #define _Deref_post_opt_bytecap_(size) _SAL1_1_Source_(_Deref_post_opt_bytecap_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecap_impl(size)))
1136 
1137 // buffer capacity is described by a constant expression
1138 #define _Deref_post_cap_c_(size) _SAL1_1_Source_(_Deref_post_cap_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__cap_c_impl(size)))
1139 #define _Deref_post_opt_cap_c_(size) _SAL1_1_Source_(_Deref_post_opt_cap_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__cap_c_impl(size)))
1140 #define _Deref_post_bytecap_c_(size) _SAL1_1_Source_(_Deref_post_bytecap_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecap_c_impl(size)))
1141 #define _Deref_post_opt_bytecap_c_(size) _SAL1_1_Source_(_Deref_post_opt_bytecap_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecap_c_impl(size)))
1142 
1143 // buffer capacity is described by a complex expression
1144 #define _Deref_post_cap_x_(size) _SAL1_1_Source_(_Deref_post_cap_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__cap_x_impl(size)))
1145 #define _Deref_post_opt_cap_x_(size) _SAL1_1_Source_(_Deref_post_opt_cap_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__cap_x_impl(size)))
1146 #define _Deref_post_bytecap_x_(size) _SAL1_1_Source_(_Deref_post_bytecap_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecap_x_impl(size)))
1147 #define _Deref_post_opt_bytecap_x_(size) _SAL1_1_Source_(_Deref_post_opt_bytecap_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecap_x_impl(size)))
1148 
1149 // convenience macros for nullterminated buffers with given capacity
1150 #define _Deref_post_z_cap_(size) _SAL1_1_Source_(_Deref_post_z_cap_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post2_impl_(__zterm_impl,__cap_impl(size)) _Post_valid_impl_)
1151 #define _Deref_post_opt_z_cap_(size) _SAL1_1_Source_(_Deref_post_opt_z_cap_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post2_impl_(__zterm_impl,__cap_impl(size)) _Post_valid_impl_)
1152 #define _Deref_post_z_bytecap_(size) _SAL1_1_Source_(_Deref_post_z_bytecap_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post2_impl_(__zterm_impl,__bytecap_impl(size)) _Post_valid_impl_)
1153 #define _Deref_post_opt_z_bytecap_(size) _SAL1_1_Source_(_Deref_post_opt_z_bytecap_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post2_impl_(__zterm_impl,__bytecap_impl(size)) _Post_valid_impl_)
1154 
1155 #define _Deref_post_z_cap_c_(size) _SAL1_1_Source_(_Deref_post_z_cap_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post2_impl_(__zterm_impl,__cap_c_impl(size)) _Post_valid_impl_)
1156 #define _Deref_post_opt_z_cap_c_(size) _SAL1_1_Source_(_Deref_post_opt_z_cap_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post2_impl_(__zterm_impl,__cap_c_impl(size)) _Post_valid_impl_)
1157 #define _Deref_post_z_bytecap_c_(size) _SAL1_1_Source_(_Deref_post_z_bytecap_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post2_impl_(__zterm_impl,__bytecap_c_impl(size)) _Post_valid_impl_)
1158 #define _Deref_post_opt_z_bytecap_c_(size) _SAL1_1_Source_(_Deref_post_opt_z_bytecap_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post2_impl_(__zterm_impl,__bytecap_c_impl(size)) _Post_valid_impl_)
1159 
1160 #define _Deref_post_z_cap_x_(size) _SAL1_1_Source_(_Deref_post_z_cap_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post2_impl_(__zterm_impl,__cap_x_impl(size)) _Post_valid_impl_)
1161 #define _Deref_post_opt_z_cap_x_(size) _SAL1_1_Source_(_Deref_post_opt_z_cap_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post2_impl_(__zterm_impl,__cap_x_impl(size)) _Post_valid_impl_)
1162 #define _Deref_post_z_bytecap_x_(size) _SAL1_1_Source_(_Deref_post_z_bytecap_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post2_impl_(__zterm_impl,__bytecap_x_impl(size)) _Post_valid_impl_)
1163 #define _Deref_post_opt_z_bytecap_x_(size) _SAL1_1_Source_(_Deref_post_opt_z_bytecap_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post2_impl_(__zterm_impl,__bytecap_x_impl(size)) _Post_valid_impl_)
1164 
1165 // known capacity and valid but unknown readable extent
1166 #define _Deref_post_valid_cap_(size) _SAL1_1_Source_(_Deref_post_valid_cap_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__cap_impl(size)) _Post_valid_impl_)
1167 #define _Deref_post_opt_valid_cap_(size) _SAL1_1_Source_(_Deref_post_opt_valid_cap_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__cap_impl(size)) _Post_valid_impl_)
1168 #define _Deref_post_valid_bytecap_(size) _SAL1_1_Source_(_Deref_post_valid_bytecap_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecap_impl(size)) _Post_valid_impl_)
1169 #define _Deref_post_opt_valid_bytecap_(size) _SAL1_1_Source_(_Deref_post_opt_valid_bytecap_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecap_impl(size)) _Post_valid_impl_)
1170 
1171 #define _Deref_post_valid_cap_c_(size) _SAL1_1_Source_(_Deref_post_valid_cap_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__cap_c_impl(size)) _Post_valid_impl_)
1172 #define _Deref_post_opt_valid_cap_c_(size) _SAL1_1_Source_(_Deref_post_opt_valid_cap_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__cap_c_impl(size)) _Post_valid_impl_)
1173 #define _Deref_post_valid_bytecap_c_(size) _SAL1_1_Source_(_Deref_post_valid_bytecap_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecap_c_impl(size)) _Post_valid_impl_)
1174 #define _Deref_post_opt_valid_bytecap_c_(size) _SAL1_1_Source_(_Deref_post_opt_valid_bytecap_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecap_c_impl(size)) _Post_valid_impl_)
1175 
1176 #define _Deref_post_valid_cap_x_(size) _SAL1_1_Source_(_Deref_post_valid_cap_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__cap_x_impl(size)) _Post_valid_impl_)
1177 #define _Deref_post_opt_valid_cap_x_(size) _SAL1_1_Source_(_Deref_post_opt_valid_cap_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__cap_x_impl(size)) _Post_valid_impl_)
1178 #define _Deref_post_valid_bytecap_x_(size) _SAL1_1_Source_(_Deref_post_valid_bytecap_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecap_x_impl(size)) _Post_valid_impl_)
1179 #define _Deref_post_opt_valid_bytecap_x_(size) _SAL1_1_Source_(_Deref_post_opt_valid_bytecap_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecap_x_impl(size)) _Post_valid_impl_)
1180 
1181 // e.g. HRESULT HrAllocateZeroInitializedMemory( size_t cb, _Out_ _Deref_post_bytecount_(cb) void** ppv );
1182 // valid buffer extent is described by another parameter
1183 #define _Deref_post_count_(size) _SAL1_1_Source_(_Deref_post_count_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__count_impl(size)) _Post_valid_impl_)
1184 #define _Deref_post_opt_count_(size) _SAL1_1_Source_(_Deref_post_opt_count_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__count_impl(size)) _Post_valid_impl_)
1185 #define _Deref_post_bytecount_(size) _SAL1_1_Source_(_Deref_post_bytecount_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecount_impl(size)) _Post_valid_impl_)
1186 #define _Deref_post_opt_bytecount_(size) _SAL1_1_Source_(_Deref_post_opt_bytecount_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecount_impl(size)) _Post_valid_impl_)
1187 
1188 // buffer capacity is described by a constant expression
1189 #define _Deref_post_count_c_(size) _SAL1_1_Source_(_Deref_post_count_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__count_c_impl(size)) _Post_valid_impl_)
1190 #define _Deref_post_opt_count_c_(size) _SAL1_1_Source_(_Deref_post_opt_count_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__count_c_impl(size)) _Post_valid_impl_)
1191 #define _Deref_post_bytecount_c_(size) _SAL1_1_Source_(_Deref_post_bytecount_c_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecount_c_impl(size)) _Post_valid_impl_)
1192 #define _Deref_post_opt_bytecount_c_(size) _SAL1_1_Source_(_Deref_post_opt_bytecount_c_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecount_c_impl(size)) _Post_valid_impl_)
1193 
1194 // buffer capacity is described by a complex expression
1195 #define _Deref_post_count_x_(size) _SAL1_1_Source_(_Deref_post_count_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__count_x_impl(size)) _Post_valid_impl_)
1196 #define _Deref_post_opt_count_x_(size) _SAL1_1_Source_(_Deref_post_opt_count_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__count_x_impl(size)) _Post_valid_impl_)
1197 #define _Deref_post_bytecount_x_(size) _SAL1_1_Source_(_Deref_post_bytecount_x_, (size), _Deref_post1_impl_(__notnull_impl_notref) _Deref_post1_impl_(__bytecount_x_impl(size)) _Post_valid_impl_)
1198 #define _Deref_post_opt_bytecount_x_(size) _SAL1_1_Source_(_Deref_post_opt_bytecount_x_, (size), _Deref_post1_impl_(__maybenull_impl_notref) _Deref_post1_impl_(__bytecount_x_impl(size)) _Post_valid_impl_)
1199 
1200 // e.g. void GetStrings( _Out_count_(cElems) _Deref_post_valid_ LPSTR const rgStr[], size_t cElems );
1201 #define _Deref_post_valid_ _SAL1_1_Source_(_Deref_post_valid_, (), _Deref_post1_impl_(__notnull_impl_notref) _Post_valid_impl_)
1202 #define _Deref_post_opt_valid_ _SAL1_1_Source_(_Deref_post_opt_valid_, (), _Deref_post1_impl_(__maybenull_impl_notref) _Post_valid_impl_)
1203 
1204 #define _Deref_post_notnull_ _SAL1_1_Source_(_Deref_post_notnull_, (), _Deref_post1_impl_(__notnull_impl_notref))
1205 #define _Deref_post_maybenull_ _SAL1_1_Source_(_Deref_post_maybenull_, (), _Deref_post1_impl_(__maybenull_impl_notref))
1206 #define _Deref_post_null_ _SAL1_1_Source_(_Deref_post_null_, (), _Deref_post1_impl_(__null_impl_notref))
1207 
1208 //
1209 // _Deref_ret_ ---
1210 //
1211 
1212 #define _Deref_ret_z_ _SAL1_1_Source_(_Deref_ret_z_, (), _Deref_ret1_impl_(__notnull_impl_notref) _Deref_ret1_impl_(__zterm_impl))
1213 #define _Deref_ret_opt_z_ _SAL1_1_Source_(_Deref_ret_opt_z_, (), _Deref_ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__zterm_impl))
1214 
1215 //
1216 // special _Deref_ ---
1217 //
1218 #define _Deref2_pre_readonly_ _SAL1_1_Source_(_Deref2_pre_readonly_, (), _Deref2_pre1_impl_(__readaccess_impl_notref))
1219 
1220 //
1221 // _Ret_ ---
1222 //
1223 
1224 // e.g. _Ret_opt_valid_ LPSTR void* CloneSTR( _Pre_valid_ LPSTR src );
1225 #define _Ret_opt_valid_ _SAL1_1_Source_(_Ret_opt_valid_, (), _Ret1_impl_(__maybenull_impl_notref) _Ret_valid_impl_)
1226 #define _Ret_opt_z_ _SAL1_1_Source_(_Ret_opt_z_, (), _Ret2_impl_(__maybenull_impl,__zterm_impl) _Ret_valid_impl_)
1227 
1228 // e.g. _Ret_opt_bytecap_(cb) void* AllocateMemory( size_t cb );
1229 // Buffer capacity is described by another parameter
1230 #define _Ret_cap_(size) _SAL1_1_Source_(_Ret_cap_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__cap_impl(size)))
1231 #define _Ret_opt_cap_(size) _SAL1_1_Source_(_Ret_opt_cap_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__cap_impl(size)))
1232 #define _Ret_bytecap_(size) _SAL1_1_Source_(_Ret_bytecap_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__bytecap_impl(size)))
1233 #define _Ret_opt_bytecap_(size) _SAL1_1_Source_(_Ret_opt_bytecap_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__bytecap_impl(size)))
1234 
1235 // Buffer capacity is described by a constant expression
1236 #define _Ret_cap_c_(size) _SAL1_1_Source_(_Ret_cap_c_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__cap_c_impl(size)))
1237 #define _Ret_opt_cap_c_(size) _SAL1_1_Source_(_Ret_opt_cap_c_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__cap_c_impl(size)))
1238 #define _Ret_bytecap_c_(size) _SAL1_1_Source_(_Ret_bytecap_c_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__bytecap_c_impl(size)))
1239 #define _Ret_opt_bytecap_c_(size) _SAL1_1_Source_(_Ret_opt_bytecap_c_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__bytecap_c_impl(size)))
1240 
1241 // Buffer capacity is described by a complex condition
1242 #define _Ret_cap_x_(size) _SAL1_1_Source_(_Ret_cap_x_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__cap_x_impl(size)))
1243 #define _Ret_opt_cap_x_(size) _SAL1_1_Source_(_Ret_opt_cap_x_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__cap_x_impl(size)))
1244 #define _Ret_bytecap_x_(size) _SAL1_1_Source_(_Ret_bytecap_x_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__bytecap_x_impl(size)))
1245 #define _Ret_opt_bytecap_x_(size) _SAL1_1_Source_(_Ret_opt_bytecap_x_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__bytecap_x_impl(size)))
1246 
1247 // return value is nullterminated and capacity is given by another parameter
1248 #define _Ret_z_cap_(size) _SAL1_1_Source_(_Ret_z_cap_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret2_impl_(__zterm_impl,__cap_impl(size)) _Ret_valid_impl_)
1249 #define _Ret_opt_z_cap_(size) _SAL1_1_Source_(_Ret_opt_z_cap_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret2_impl_(__zterm_impl,__cap_impl(size)) _Ret_valid_impl_)
1250 #define _Ret_z_bytecap_(size) _SAL1_1_Source_(_Ret_z_bytecap_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret2_impl_(__zterm_impl,__bytecap_impl(size)) _Ret_valid_impl_)
1251 #define _Ret_opt_z_bytecap_(size) _SAL1_1_Source_(_Ret_opt_z_bytecap_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret2_impl_(__zterm_impl,__bytecap_impl(size)) _Ret_valid_impl_)
1252 
1253 // e.g. _Ret_opt_bytecount_(cb) void* AllocateZeroInitializedMemory( size_t cb );
1254 // Valid Buffer extent is described by another parameter
1255 #define _Ret_count_(size) _SAL1_1_Source_(_Ret_count_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__count_impl(size)) _Ret_valid_impl_)
1256 #define _Ret_opt_count_(size) _SAL1_1_Source_(_Ret_opt_count_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__count_impl(size)) _Ret_valid_impl_)
1257 #define _Ret_bytecount_(size) _SAL1_1_Source_(_Ret_bytecount_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__bytecount_impl(size)) _Ret_valid_impl_)
1258 #define _Ret_opt_bytecount_(size) _SAL1_1_Source_(_Ret_opt_bytecount_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__bytecount_impl(size)) _Ret_valid_impl_)
1259 
1260 // Valid Buffer extent is described by a constant expression
1261 #define _Ret_count_c_(size) _SAL1_1_Source_(_Ret_count_c_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__count_c_impl(size)) _Ret_valid_impl_)
1262 #define _Ret_opt_count_c_(size) _SAL1_1_Source_(_Ret_opt_count_c_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__count_c_impl(size)) _Ret_valid_impl_)
1263 #define _Ret_bytecount_c_(size) _SAL1_1_Source_(_Ret_bytecount_c_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__bytecount_c_impl(size)) _Ret_valid_impl_)
1264 #define _Ret_opt_bytecount_c_(size) _SAL1_1_Source_(_Ret_opt_bytecount_c_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__bytecount_c_impl(size)) _Ret_valid_impl_)
1265 
1266 // Valid Buffer extent is described by a complex expression
1267 #define _Ret_count_x_(size) _SAL1_1_Source_(_Ret_count_x_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__count_x_impl(size)) _Ret_valid_impl_)
1268 #define _Ret_opt_count_x_(size) _SAL1_1_Source_(_Ret_opt_count_x_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__count_x_impl(size)) _Ret_valid_impl_)
1269 #define _Ret_bytecount_x_(size) _SAL1_1_Source_(_Ret_bytecount_x_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret1_impl_(__bytecount_x_impl(size)) _Ret_valid_impl_)
1270 #define _Ret_opt_bytecount_x_(size) _SAL1_1_Source_(_Ret_opt_bytecount_x_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret1_impl_(__bytecount_x_impl(size)) _Ret_valid_impl_)
1271 
1272 // return value is nullterminated and length is given by another parameter
1273 #define _Ret_z_count_(size) _SAL1_1_Source_(_Ret_z_count_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret2_impl_(__zterm_impl,__count_impl(size)) _Ret_valid_impl_)
1274 #define _Ret_opt_z_count_(size) _SAL1_1_Source_(_Ret_opt_z_count_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret2_impl_(__zterm_impl,__count_impl(size)) _Ret_valid_impl_)
1275 #define _Ret_z_bytecount_(size) _SAL1_1_Source_(_Ret_z_bytecount_, (size), _Ret1_impl_(__notnull_impl_notref) _Ret2_impl_(__zterm_impl,__bytecount_impl(size)) _Ret_valid_impl_)
1276 #define _Ret_opt_z_bytecount_(size) _SAL1_1_Source_(_Ret_opt_z_bytecount_, (size), _Ret1_impl_(__maybenull_impl_notref) _Ret2_impl_(__zterm_impl,__bytecount_impl(size)) _Ret_valid_impl_)
1277 
1278 
1279 // _Pre_ annotations ---
1280 #define _Pre_opt_z_ _SAL1_1_Source_(_Pre_opt_z_, (), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__zterm_impl) _Pre_valid_impl_)
1281 
1282 // restrict access rights
1283 #define _Pre_readonly_ _SAL1_1_Source_(_Pre_readonly_, (), _Pre1_impl_(__readaccess_impl_notref))
1284 #define _Pre_writeonly_ _SAL1_1_Source_(_Pre_writeonly_, (), _Pre1_impl_(__writeaccess_impl_notref))
1285 
1286 // e.g. void FreeMemory( _Pre_bytecap_(cb) _Post_ptr_invalid_ void* pv, size_t cb );
1287 // buffer capacity described by another parameter
1288 #define _Pre_cap_(size) _SAL1_1_Source_(_Pre_cap_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_impl(size)))
1289 #define _Pre_opt_cap_(size) _SAL1_1_Source_(_Pre_opt_cap_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_impl(size)))
1290 #define _Pre_bytecap_(size) _SAL1_1_Source_(_Pre_bytecap_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecap_impl(size)))
1291 #define _Pre_opt_bytecap_(size) _SAL1_1_Source_(_Pre_opt_bytecap_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecap_impl(size)))
1292 
1293 // buffer capacity described by a constant expression
1294 #define _Pre_cap_c_(size) _SAL1_1_Source_(_Pre_cap_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_c_impl(size)))
1295 #define _Pre_opt_cap_c_(size) _SAL1_1_Source_(_Pre_opt_cap_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_c_impl(size)))
1296 #define _Pre_bytecap_c_(size) _SAL1_1_Source_(_Pre_bytecap_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecap_c_impl(size)))
1297 #define _Pre_opt_bytecap_c_(size) _SAL1_1_Source_(_Pre_opt_bytecap_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecap_c_impl(size)))
1298 #define _Pre_cap_c_one_ _SAL1_1_Source_(_Pre_cap_c_one_, (), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_c_one_notref_impl))
1299 #define _Pre_opt_cap_c_one_ _SAL1_1_Source_(_Pre_opt_cap_c_one_, (), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_c_one_notref_impl))
1300 
1301 // buffer capacity is described by another parameter multiplied by a constant expression
1302 #define _Pre_cap_m_(mult,size) _SAL1_1_Source_(_Pre_cap_m_, (mult,size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__mult_impl(mult,size)))
1303 #define _Pre_opt_cap_m_(mult,size) _SAL1_1_Source_(_Pre_opt_cap_m_, (mult,size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__mult_impl(mult,size)))
1304 
1305 // buffer capacity described by size of other buffer, only used by dangerous legacy APIs
1306 // e.g. int strcpy(_Pre_cap_for_(src) char* dst, const char* src);
1307 #define _Pre_cap_for_(param) _SAL1_1_Source_(_Pre_cap_for_, (param), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_for_impl(param)))
1308 #define _Pre_opt_cap_for_(param) _SAL1_1_Source_(_Pre_opt_cap_for_, (param), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_for_impl(param)))
1309 
1310 // buffer capacity described by a complex condition
1311 #define _Pre_cap_x_(size) _SAL1_1_Source_(_Pre_cap_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_x_impl(size)))
1312 #define _Pre_opt_cap_x_(size) _SAL1_1_Source_(_Pre_opt_cap_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_x_impl(size)))
1313 #define _Pre_bytecap_x_(size) _SAL1_1_Source_(_Pre_bytecap_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecap_x_impl(size)))
1314 #define _Pre_opt_bytecap_x_(size) _SAL1_1_Source_(_Pre_opt_bytecap_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecap_x_impl(size)))
1315 
1316 // buffer capacity described by the difference to another pointer parameter
1317 #define _Pre_ptrdiff_cap_(ptr) _SAL1_1_Source_(_Pre_ptrdiff_cap_, (ptr), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_x_impl(__ptrdiff(ptr))))
1318 #define _Pre_opt_ptrdiff_cap_(ptr) _SAL1_1_Source_(_Pre_opt_ptrdiff_cap_, (ptr), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_x_impl(__ptrdiff(ptr))))
1319 
1320 // e.g. void AppendStr( _Pre_z_ const char* szFrom, _Pre_z_cap_(cchTo) _Post_z_ char* szTo, size_t cchTo );
1321 #define _Pre_z_cap_(size) _SAL1_1_Source_(_Pre_z_cap_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre2_impl_(__zterm_impl,__cap_impl(size)) _Pre_valid_impl_)
1322 #define _Pre_opt_z_cap_(size) _SAL1_1_Source_(_Pre_opt_z_cap_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre2_impl_(__zterm_impl,__cap_impl(size)) _Pre_valid_impl_)
1323 #define _Pre_z_bytecap_(size) _SAL1_1_Source_(_Pre_z_bytecap_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre2_impl_(__zterm_impl,__bytecap_impl(size)) _Pre_valid_impl_)
1324 #define _Pre_opt_z_bytecap_(size) _SAL1_1_Source_(_Pre_opt_z_bytecap_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre2_impl_(__zterm_impl,__bytecap_impl(size)) _Pre_valid_impl_)
1325 
1326 #define _Pre_z_cap_c_(size) _SAL1_1_Source_(_Pre_z_cap_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre2_impl_(__zterm_impl,__cap_c_impl(size)) _Pre_valid_impl_)
1327 #define _Pre_opt_z_cap_c_(size) _SAL1_1_Source_(_Pre_opt_z_cap_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre2_impl_(__zterm_impl,__cap_c_impl(size)) _Pre_valid_impl_)
1328 #define _Pre_z_bytecap_c_(size) _SAL1_1_Source_(_Pre_z_bytecap_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre2_impl_(__zterm_impl,__bytecap_c_impl(size)) _Pre_valid_impl_)
1329 #define _Pre_opt_z_bytecap_c_(size) _SAL1_1_Source_(_Pre_opt_z_bytecap_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre2_impl_(__zterm_impl,__bytecap_c_impl(size)) _Pre_valid_impl_)
1330 
1331 #define _Pre_z_cap_x_(size) _SAL1_1_Source_(_Pre_z_cap_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre2_impl_(__zterm_impl,__cap_x_impl(size)) _Pre_valid_impl_)
1332 #define _Pre_opt_z_cap_x_(size) _SAL1_1_Source_(_Pre_opt_z_cap_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre2_impl_(__zterm_impl,__cap_x_impl(size)) _Pre_valid_impl_)
1333 #define _Pre_z_bytecap_x_(size) _SAL1_1_Source_(_Pre_z_bytecap_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre2_impl_(__zterm_impl,__bytecap_x_impl(size)) _Pre_valid_impl_)
1334 #define _Pre_opt_z_bytecap_x_(size) _SAL1_1_Source_(_Pre_opt_z_bytecap_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre2_impl_(__zterm_impl,__bytecap_x_impl(size)) _Pre_valid_impl_)
1335 
1336 // known capacity and valid but unknown readable extent
1337 #define _Pre_valid_cap_(size) _SAL1_1_Source_(_Pre_valid_cap_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_impl(size)) _Pre_valid_impl_)
1338 #define _Pre_opt_valid_cap_(size) _SAL1_1_Source_(_Pre_opt_valid_cap_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_impl(size)) _Pre_valid_impl_)
1339 #define _Pre_valid_bytecap_(size) _SAL1_1_Source_(_Pre_valid_bytecap_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecap_impl(size)) _Pre_valid_impl_)
1340 #define _Pre_opt_valid_bytecap_(size) _SAL1_1_Source_(_Pre_opt_valid_bytecap_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecap_impl(size)) _Pre_valid_impl_)
1341 
1342 #define _Pre_valid_cap_c_(size) _SAL1_1_Source_(_Pre_valid_cap_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_c_impl(size)) _Pre_valid_impl_)
1343 #define _Pre_opt_valid_cap_c_(size) _SAL1_1_Source_(_Pre_opt_valid_cap_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_c_impl(size)) _Pre_valid_impl_)
1344 #define _Pre_valid_bytecap_c_(size) _SAL1_1_Source_(_Pre_valid_bytecap_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecap_c_impl(size)) _Pre_valid_impl_)
1345 #define _Pre_opt_valid_bytecap_c_(size) _SAL1_1_Source_(_Pre_opt_valid_bytecap_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecap_c_impl(size)) _Pre_valid_impl_)
1346 
1347 #define _Pre_valid_cap_x_(size) _SAL1_1_Source_(_Pre_valid_cap_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_x_impl(size)) _Pre_valid_impl_)
1348 #define _Pre_opt_valid_cap_x_(size) _SAL1_1_Source_(_Pre_opt_valid_cap_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_x_impl(size)) _Pre_valid_impl_)
1349 #define _Pre_valid_bytecap_x_(size) _SAL1_1_Source_(_Pre_valid_bytecap_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecap_x_impl(size)) _Pre_valid_impl_)
1350 #define _Pre_opt_valid_bytecap_x_(size) _SAL1_1_Source_(_Pre_opt_valid_bytecap_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecap_x_impl(size)) _Pre_valid_impl_)
1351 
1352 // e.g. void AppendCharRange( _Pre_count_(cchFrom) const char* rgFrom, size_t cchFrom, _Out_z_cap_(cchTo) char* szTo, size_t cchTo );
1353 // Valid buffer extent described by another parameter
1354 #define _Pre_count_(size) _SAL1_1_Source_(_Pre_count_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__count_impl(size)) _Pre_valid_impl_)
1355 #define _Pre_opt_count_(size) _SAL1_1_Source_(_Pre_opt_count_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__count_impl(size)) _Pre_valid_impl_)
1356 #define _Pre_bytecount_(size) _SAL1_1_Source_(_Pre_bytecount_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecount_impl(size)) _Pre_valid_impl_)
1357 #define _Pre_opt_bytecount_(size) _SAL1_1_Source_(_Pre_opt_bytecount_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecount_impl(size)) _Pre_valid_impl_)
1358 
1359 // Valid buffer extent described by a constant expression
1360 #define _Pre_count_c_(size) _SAL1_1_Source_(_Pre_count_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__count_c_impl(size)) _Pre_valid_impl_)
1361 #define _Pre_opt_count_c_(size) _SAL1_1_Source_(_Pre_opt_count_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__count_c_impl(size)) _Pre_valid_impl_)
1362 #define _Pre_bytecount_c_(size) _SAL1_1_Source_(_Pre_bytecount_c_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecount_c_impl(size)) _Pre_valid_impl_)
1363 #define _Pre_opt_bytecount_c_(size) _SAL1_1_Source_(_Pre_opt_bytecount_c_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecount_c_impl(size)) _Pre_valid_impl_)
1364 
1365 // Valid buffer extent described by a complex expression
1366 #define _Pre_count_x_(size) _SAL1_1_Source_(_Pre_count_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__count_x_impl(size)) _Pre_valid_impl_)
1367 #define _Pre_opt_count_x_(size) _SAL1_1_Source_(_Pre_opt_count_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__count_x_impl(size)) _Pre_valid_impl_)
1368 #define _Pre_bytecount_x_(size) _SAL1_1_Source_(_Pre_bytecount_x_, (size), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__bytecount_x_impl(size)) _Pre_valid_impl_)
1369 #define _Pre_opt_bytecount_x_(size) _SAL1_1_Source_(_Pre_opt_bytecount_x_, (size), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__bytecount_x_impl(size)) _Pre_valid_impl_)
1370 
1371 // Valid buffer extent described by the difference to another pointer parameter
1372 #define _Pre_ptrdiff_count_(ptr) _SAL1_1_Source_(_Pre_ptrdiff_count_, (ptr), _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__count_x_impl(__ptrdiff(ptr))) _Pre_valid_impl_)
1373 #define _Pre_opt_ptrdiff_count_(ptr) _SAL1_1_Source_(_Pre_opt_ptrdiff_count_, (ptr), _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__count_x_impl(__ptrdiff(ptr))) _Pre_valid_impl_)
1374 
1375 
1376 // char * strncpy(_Out_cap_(_Count) _Post_maybez_ char * _Dest, _In_z_ const char * _Source, _In_ size_t _Count)
1377 // buffer maybe zero-terminated after the call
1378 #define _Post_maybez_ _SAL_L_Source_(_Post_maybez_, (), _Post1_impl_(__maybezterm_impl))
1379 
1380 // e.g. SIZE_T HeapSize( _In_ HANDLE hHeap, DWORD dwFlags, _Pre_notnull_ _Post_bytecap_(return) LPCVOID lpMem );
1381 #define _Post_cap_(size) _SAL1_1_Source_(_Post_cap_, (size), _Post1_impl_(__cap_impl(size)))
1382 #define _Post_bytecap_(size) _SAL1_1_Source_(_Post_bytecap_, (size), _Post1_impl_(__bytecap_impl(size)))
1383 
1384 // e.g. int strlen( _In_z_ _Post_count_(return+1) const char* sz );
1385 #define _Post_count_(size) _SAL1_1_Source_(_Post_count_, (size), _Post1_impl_(__count_impl(size)) _Post_valid_impl_)
1386 #define _Post_bytecount_(size) _SAL1_1_Source_(_Post_bytecount_, (size), _Post1_impl_(__bytecount_impl(size)) _Post_valid_impl_)
1387 #define _Post_count_c_(size) _SAL1_1_Source_(_Post_count_c_, (size), _Post1_impl_(__count_c_impl(size)) _Post_valid_impl_)
1388 #define _Post_bytecount_c_(size) _SAL1_1_Source_(_Post_bytecount_c_, (size), _Post1_impl_(__bytecount_c_impl(size)) _Post_valid_impl_)
1389 #define _Post_count_x_(size) _SAL1_1_Source_(_Post_count_x_, (size), _Post1_impl_(__count_x_impl(size)) _Post_valid_impl_)
1390 #define _Post_bytecount_x_(size) _SAL1_1_Source_(_Post_bytecount_x_, (size), _Post1_impl_(__bytecount_x_impl(size)) _Post_valid_impl_)
1391 
1392 // e.g. size_t CopyStr( _In_z_ const char* szFrom, _Pre_cap_(cch) _Post_z_count_(return+1) char* szFrom, size_t cchFrom );
1393 #define _Post_z_count_(size) _SAL1_1_Source_(_Post_z_count_, (size), _Post2_impl_(__zterm_impl,__count_impl(size)) _Post_valid_impl_)
1394 #define _Post_z_bytecount_(size) _SAL1_1_Source_(_Post_z_bytecount_, (size), _Post2_impl_(__zterm_impl,__bytecount_impl(size)) _Post_valid_impl_)
1395 #define _Post_z_count_c_(size) _SAL1_1_Source_(_Post_z_count_c_, (size), _Post2_impl_(__zterm_impl,__count_c_impl(size)) _Post_valid_impl_)
1396 #define _Post_z_bytecount_c_(size) _SAL1_1_Source_(_Post_z_bytecount_c_, (size), _Post2_impl_(__zterm_impl,__bytecount_c_impl(size)) _Post_valid_impl_)
1397 #define _Post_z_count_x_(size) _SAL1_1_Source_(_Post_z_count_x_, (size), _Post2_impl_(__zterm_impl,__count_x_impl(size)) _Post_valid_impl_)
1398 #define _Post_z_bytecount_x_(size) _SAL1_1_Source_(_Post_z_bytecount_x_, (size), _Post2_impl_(__zterm_impl,__bytecount_x_impl(size)) _Post_valid_impl_)
1399 
1400 //
1401 // _Prepost_ ---
1402 //
1403 // describing conditions that hold before and after the function call
1404 
1405 #define _Prepost_opt_z_ _SAL1_1_Source_(_Prepost_opt_z_, (), _Pre_opt_z_ _Post_z_)
1406 
1407 #define _Prepost_count_(size) _SAL1_1_Source_(_Prepost_count_, (size), _Pre_count_(size) _Post_count_(size))
1408 #define _Prepost_opt_count_(size) _SAL1_1_Source_(_Prepost_opt_count_, (size), _Pre_opt_count_(size) _Post_count_(size))
1409 #define _Prepost_bytecount_(size) _SAL1_1_Source_(_Prepost_bytecount_, (size), _Pre_bytecount_(size) _Post_bytecount_(size))
1410 #define _Prepost_opt_bytecount_(size) _SAL1_1_Source_(_Prepost_opt_bytecount_, (size), _Pre_opt_bytecount_(size) _Post_bytecount_(size))
1411 #define _Prepost_count_c_(size) _SAL1_1_Source_(_Prepost_count_c_, (size), _Pre_count_c_(size) _Post_count_c_(size))
1412 #define _Prepost_opt_count_c_(size) _SAL1_1_Source_(_Prepost_opt_count_c_, (size), _Pre_opt_count_c_(size) _Post_count_c_(size))
1413 #define _Prepost_bytecount_c_(size) _SAL1_1_Source_(_Prepost_bytecount_c_, (size), _Pre_bytecount_c_(size) _Post_bytecount_c_(size))
1414 #define _Prepost_opt_bytecount_c_(size) _SAL1_1_Source_(_Prepost_opt_bytecount_c_, (size), _Pre_opt_bytecount_c_(size) _Post_bytecount_c_(size))
1415 #define _Prepost_count_x_(size) _SAL1_1_Source_(_Prepost_count_x_, (size), _Pre_count_x_(size) _Post_count_x_(size))
1416 #define _Prepost_opt_count_x_(size) _SAL1_1_Source_(_Prepost_opt_count_x_, (size), _Pre_opt_count_x_(size) _Post_count_x_(size))
1417 #define _Prepost_bytecount_x_(size) _SAL1_1_Source_(_Prepost_bytecount_x_, (size), _Pre_bytecount_x_(size) _Post_bytecount_x_(size))
1418 #define _Prepost_opt_bytecount_x_(size) _SAL1_1_Source_(_Prepost_opt_bytecount_x_, (size), _Pre_opt_bytecount_x_(size) _Post_bytecount_x_(size))
1419 
1420 #define _Prepost_valid_ _SAL1_1_Source_(_Prepost_valid_, (), _Pre_valid_ _Post_valid_)
1421 #define _Prepost_opt_valid_ _SAL1_1_Source_(_Prepost_opt_valid_, (), _Pre_opt_valid_ _Post_valid_)
1422 
1423 //
1424 // _Deref_<both> ---
1425 //
1426 // short version for _Deref_pre_<ann> _Deref_post_<ann>
1427 // describing conditions for array elements or dereferenced pointer parameters that hold before and after the call
1428 
1429 #define _Deref_prepost_z_ _SAL1_1_Source_(_Deref_prepost_z_, (), _Deref_pre_z_ _Deref_post_z_)
1430 #define _Deref_prepost_opt_z_ _SAL1_1_Source_(_Deref_prepost_opt_z_, (), _Deref_pre_opt_z_ _Deref_post_opt_z_)
1431 
1432 #define _Deref_prepost_cap_(size) _SAL1_1_Source_(_Deref_prepost_cap_, (size), _Deref_pre_cap_(size) _Deref_post_cap_(size))
1433 #define _Deref_prepost_opt_cap_(size) _SAL1_1_Source_(_Deref_prepost_opt_cap_, (size), _Deref_pre_opt_cap_(size) _Deref_post_opt_cap_(size))
1434 #define _Deref_prepost_bytecap_(size) _SAL1_1_Source_(_Deref_prepost_bytecap_, (size), _Deref_pre_bytecap_(size) _Deref_post_bytecap_(size))
1435 #define _Deref_prepost_opt_bytecap_(size) _SAL1_1_Source_(_Deref_prepost_opt_bytecap_, (size), _Deref_pre_opt_bytecap_(size) _Deref_post_opt_bytecap_(size))
1436 
1437 #define _Deref_prepost_cap_x_(size) _SAL1_1_Source_(_Deref_prepost_cap_x_, (size), _Deref_pre_cap_x_(size) _Deref_post_cap_x_(size))
1438 #define _Deref_prepost_opt_cap_x_(size) _SAL1_1_Source_(_Deref_prepost_opt_cap_x_, (size), _Deref_pre_opt_cap_x_(size) _Deref_post_opt_cap_x_(size))
1439 #define _Deref_prepost_bytecap_x_(size) _SAL1_1_Source_(_Deref_prepost_bytecap_x_, (size), _Deref_pre_bytecap_x_(size) _Deref_post_bytecap_x_(size))
1440 #define _Deref_prepost_opt_bytecap_x_(size) _SAL1_1_Source_(_Deref_prepost_opt_bytecap_x_, (size), _Deref_pre_opt_bytecap_x_(size) _Deref_post_opt_bytecap_x_(size))
1441 
1442 #define _Deref_prepost_z_cap_(size) _SAL1_1_Source_(_Deref_prepost_z_cap_, (size), _Deref_pre_z_cap_(size) _Deref_post_z_cap_(size))
1443 #define _Deref_prepost_opt_z_cap_(size) _SAL1_1_Source_(_Deref_prepost_opt_z_cap_, (size), _Deref_pre_opt_z_cap_(size) _Deref_post_opt_z_cap_(size))
1444 #define _Deref_prepost_z_bytecap_(size) _SAL1_1_Source_(_Deref_prepost_z_bytecap_, (size), _Deref_pre_z_bytecap_(size) _Deref_post_z_bytecap_(size))
1445 #define _Deref_prepost_opt_z_bytecap_(size) _SAL1_1_Source_(_Deref_prepost_opt_z_bytecap_, (size), _Deref_pre_opt_z_bytecap_(size) _Deref_post_opt_z_bytecap_(size))
1446 
1447 #define _Deref_prepost_valid_cap_(size) _SAL1_1_Source_(_Deref_prepost_valid_cap_, (size), _Deref_pre_valid_cap_(size) _Deref_post_valid_cap_(size))
1448 #define _Deref_prepost_opt_valid_cap_(size) _SAL1_1_Source_(_Deref_prepost_opt_valid_cap_, (size), _Deref_pre_opt_valid_cap_(size) _Deref_post_opt_valid_cap_(size))
1449 #define _Deref_prepost_valid_bytecap_(size) _SAL1_1_Source_(_Deref_prepost_valid_bytecap_, (size), _Deref_pre_valid_bytecap_(size) _Deref_post_valid_bytecap_(size))
1450 #define _Deref_prepost_opt_valid_bytecap_(size) _SAL1_1_Source_(_Deref_prepost_opt_valid_bytecap_, (size), _Deref_pre_opt_valid_bytecap_(size) _Deref_post_opt_valid_bytecap_(size))
1451 
1452 #define _Deref_prepost_valid_cap_x_(size) _SAL1_1_Source_(_Deref_prepost_valid_cap_x_, (size), _Deref_pre_valid_cap_x_(size) _Deref_post_valid_cap_x_(size))
1453 #define _Deref_prepost_opt_valid_cap_x_(size) _SAL1_1_Source_(_Deref_prepost_opt_valid_cap_x_, (size), _Deref_pre_opt_valid_cap_x_(size) _Deref_post_opt_valid_cap_x_(size))
1454 #define _Deref_prepost_valid_bytecap_x_(size) _SAL1_1_Source_(_Deref_prepost_valid_bytecap_x_, (size), _Deref_pre_valid_bytecap_x_(size) _Deref_post_valid_bytecap_x_(size))
1455 #define _Deref_prepost_opt_valid_bytecap_x_(size) _SAL1_1_Source_(_Deref_prepost_opt_valid_bytecap_x_, (size), _Deref_pre_opt_valid_bytecap_x_(size) _Deref_post_opt_valid_bytecap_x_(size))
1456 
1457 #define _Deref_prepost_count_(size) _SAL1_1_Source_(_Deref_prepost_count_, (size), _Deref_pre_count_(size) _Deref_post_count_(size))
1458 #define _Deref_prepost_opt_count_(size) _SAL1_1_Source_(_Deref_prepost_opt_count_, (size), _Deref_pre_opt_count_(size) _Deref_post_opt_count_(size))
1459 #define _Deref_prepost_bytecount_(size) _SAL1_1_Source_(_Deref_prepost_bytecount_, (size), _Deref_pre_bytecount_(size) _Deref_post_bytecount_(size))
1460 #define _Deref_prepost_opt_bytecount_(size) _SAL1_1_Source_(_Deref_prepost_opt_bytecount_, (size), _Deref_pre_opt_bytecount_(size) _Deref_post_opt_bytecount_(size))
1461 
1462 #define _Deref_prepost_count_x_(size) _SAL1_1_Source_(_Deref_prepost_count_x_, (size), _Deref_pre_count_x_(size) _Deref_post_count_x_(size))
1463 #define _Deref_prepost_opt_count_x_(size) _SAL1_1_Source_(_Deref_prepost_opt_count_x_, (size), _Deref_pre_opt_count_x_(size) _Deref_post_opt_count_x_(size))
1464 #define _Deref_prepost_bytecount_x_(size) _SAL1_1_Source_(_Deref_prepost_bytecount_x_, (size), _Deref_pre_bytecount_x_(size) _Deref_post_bytecount_x_(size))
1465 #define _Deref_prepost_opt_bytecount_x_(size) _SAL1_1_Source_(_Deref_prepost_opt_bytecount_x_, (size), _Deref_pre_opt_bytecount_x_(size) _Deref_post_opt_bytecount_x_(size))
1466 
1467 #define _Deref_prepost_valid_ _SAL1_1_Source_(_Deref_prepost_valid_, (), _Deref_pre_valid_ _Deref_post_valid_)
1468 #define _Deref_prepost_opt_valid_ _SAL1_1_Source_(_Deref_prepost_opt_valid_, (), _Deref_pre_opt_valid_ _Deref_post_opt_valid_)
1469 
1470 //
1471 // _Deref_<miscellaneous>
1472 //
1473 // used with references to arrays
1474 
1475 #define _Deref_out_z_cap_c_(size) _SAL1_1_Source_(_Deref_out_z_cap_c_, (size), _Deref_pre_cap_c_(size) _Deref_post_z_)
1476 #define _Deref_inout_z_cap_c_(size) _SAL1_1_Source_(_Deref_inout_z_cap_c_, (size), _Deref_pre_z_cap_c_(size) _Deref_post_z_)
1477 #define _Deref_out_z_bytecap_c_(size) _SAL1_1_Source_(_Deref_out_z_bytecap_c_, (size), _Deref_pre_bytecap_c_(size) _Deref_post_z_)
1478 #define _Deref_inout_z_bytecap_c_(size) _SAL1_1_Source_(_Deref_inout_z_bytecap_c_, (size), _Deref_pre_z_bytecap_c_(size) _Deref_post_z_)
1479 #define _Deref_inout_z_ _SAL1_1_Source_(_Deref_inout_z_, (), _Deref_prepost_z_)
1480 
1481 #pragma endregion Input Buffer SAL 1 compatibility macros
1482 
1483 
1484 //============================================================================
1485 // Implementation Layer:
1486 //============================================================================
1487 
1488 
1489 // Naming conventions:
1490 // A symbol the begins with _SA_ is for the machinery of creating any
1491 // annotations; many of those come from sourceannotations.h in the case
1492 // of attributes.
1493 
1494 // A symbol that ends with _impl is the very lowest level macro. It is
1495 // not required to be a legal standalone annotation, and in the case
1496 // of attribute annotations, usually is not. (In the case of some declspec
1497 // annotations, it might be, but it should not be assumed so.) Those
1498 // symols will be used in the _PreN..., _PostN... and _RetN... annotations
1499 // to build up more complete annotations.
1500 
1501 // A symbol ending in _impl_ is reserved to the implementation as well,
1502 // but it does form a complete annotation; usually they are used to build
1503 // up even higher level annotations.
1504 
1505 
1506 #if _USE_ATTRIBUTES_FOR_SAL || _USE_DECLSPECS_FOR_SAL // [
1507 // Sharable "_impl" macros: these can be shared between the various annotation
1508 // forms but are part of the implementation of the macros. These are collected
1509 // here to assure that only necessary differences in the annotations
1510 // exist.
1511 
1512 #define _Always_impl_(annos) _Group_(annos _SAL_nop_impl_) _On_failure_impl_(annos _SAL_nop_impl_)
1513 #define _Bound_impl_ _SA_annotes0(SAL_bound)
1514 #define _Field_range_impl_(min,max) _Range_impl_(min,max)
1515 #define _Literal_impl_ _SA_annotes1(SAL_constant, __yes)
1516 #define _Maybenull_impl_ _SA_annotes1(SAL_null, __maybe)
1517 #define _Maybevalid_impl_ _SA_annotes1(SAL_valid, __maybe)
1518 #define _Must_inspect_impl_ _Post_impl_ _SA_annotes0(SAL_mustInspect)
1519 #define _Notliteral_impl_ _SA_annotes1(SAL_constant, __no)
1520 #define _Notnull_impl_ _SA_annotes1(SAL_null, __no)
1521 #define _Notvalid_impl_ _SA_annotes1(SAL_valid, __no)
1522 #define _NullNull_terminated_impl_ _Group_(_SA_annotes1(SAL_nullTerminated, __yes) _SA_annotes1(SAL_readableTo,inexpressibleCount("NullNull terminated string")))
1523 #define _Null_impl_ _SA_annotes1(SAL_null, __yes)
1524 #define _Null_terminated_impl_ _SA_annotes1(SAL_nullTerminated, __yes)
1525 #define _Out_impl_ _Pre1_impl_(__notnull_impl_notref) _Pre1_impl_(__cap_c_one_notref_impl) _Post_valid_impl_
1526 #define _Out_opt_impl_ _Pre1_impl_(__maybenull_impl_notref) _Pre1_impl_(__cap_c_one_notref_impl) _Post_valid_impl_
1527 #define _Points_to_data_impl_ _At_(*_Curr_, _SA_annotes1(SAL_mayBePointer, __no))
1528 #define _Post_satisfies_impl_(cond) _Post_impl_ _Satisfies_impl_(cond)
1529 #define _Post_valid_impl_ _Post1_impl_(__valid_impl)
1530 #define _Pre_satisfies_impl_(cond) _Pre_impl_ _Satisfies_impl_(cond)
1531 #define _Pre_valid_impl_ _Pre1_impl_(__valid_impl)
1532 #define _Range_impl_(min,max) _SA_annotes2(SAL_range, min, max)
1533 #define _Readable_bytes_impl_(size) _SA_annotes1(SAL_readableTo, byteCount(size))
1534 #define _Readable_elements_impl_(size) _SA_annotes1(SAL_readableTo, elementCount(size))
1535 #define _Ret_valid_impl_ _Ret1_impl_(__valid_impl)
1536 #define _Satisfies_impl_(cond) _SA_annotes1(SAL_satisfies, cond)
1537 #define _Valid_impl_ _SA_annotes1(SAL_valid, __yes)
1538 #define _Writable_bytes_impl_(size) _SA_annotes1(SAL_writableTo, byteCount(size))
1539 #define _Writable_elements_impl_(size) _SA_annotes1(SAL_writableTo, elementCount(size))
1540 
1541 #define _In_range_impl_(min,max) _Pre_impl_ _Range_impl_(min,max)
1542 #define _Out_range_impl_(min,max) _Post_impl_ _Range_impl_(min,max)
1543 #define _Ret_range_impl_(min,max) _Post_impl_ _Range_impl_(min,max)
1544 #define _Deref_in_range_impl_(min,max) _Deref_pre_impl_ _Range_impl_(min,max)
1545 #define _Deref_out_range_impl_(min,max) _Deref_post_impl_ _Range_impl_(min,max)
1546 #define _Deref_ret_range_impl_(min,max) _Deref_post_impl_ _Range_impl_(min,max)
1547 
1548 #define _Deref_pre_impl_ _Pre_impl_ _Notref_impl_ _Deref_impl_
1549 #define _Deref_post_impl_ _Post_impl_ _Notref_impl_ _Deref_impl_
1550 
1551 // The following are for the implementation machinery, and are not
1552 // suitable for annotating general code.
1553 // We're tying to phase this out, someday. The parser quotes the param.
1554 #define __AuToQuOtE _SA_annotes0(SAL_AuToQuOtE)
1555 
1556 // Normally the parser does some simple type checking of annotation params,
1557 // defer that check to the plugin.
1558 #define __deferTypecheck _SA_annotes0(SAL_deferTypecheck)
1559 
1560 #define _SA_SPECSTRIZE( x ) #x
1561 #define _SAL_nop_impl_ /* nothing */
1562 #define __nop_impl(x) x
1563 #endif
1564 
1565 
1566 #if _USE_ATTRIBUTES_FOR_SAL // [
1567 
1568 // Using attributes for sal
1569 
1571 
1572 
1573 #define _SA_annotes0(n) [SAL_annotes(Name=#n)]
1574 #define _SA_annotes1(n,pp1) [SAL_annotes(Name=#n, p1=_SA_SPECSTRIZE(pp1))]
1575 #define _SA_annotes2(n,pp1,pp2) [SAL_annotes(Name=#n, p1=_SA_SPECSTRIZE(pp1), p2=_SA_SPECSTRIZE(pp2))]
1576 #define _SA_annotes3(n,pp1,pp2,pp3) [SAL_annotes(Name=#n, p1=_SA_SPECSTRIZE(pp1), p2=_SA_SPECSTRIZE(pp2), p3=_SA_SPECSTRIZE(pp3))]
1577 
1578 #define _Pre_impl_ [SAL_pre]
1579 #define _Post_impl_ [SAL_post]
1580 #define _Deref_impl_ [SAL_deref]
1581 #define _Notref_impl_ [SAL_notref]
1582 
1583 
1584 // Declare a function to be an annotation or primop (respectively).
1585 // Done this way so that they don't appear in the regular compiler's
1586 // namespace.
1587 #define __ANNOTATION(fun) _SA_annotes0(SAL_annotation) void __SA_##fun;
1588 #define __PRIMOP(type, fun) _SA_annotes0(SAL_primop) type __SA_##fun;
1589 #define __QUALIFIER(fun) _SA_annotes0(SAL_qualifier) void __SA_##fun;
1590 
1591 // Benign declspec needed here for WindowsPREfast
1592 #define __In_impl_ [SA_Pre(Valid=SA_Yes)] [SA_Pre(Deref=1, Notref=1, Access=SA_Read)] __declspec("SAL_pre SAL_valid")
1593 
1594 #elif _USE_DECLSPECS_FOR_SAL // ][
1595 
1596 // Using declspecs for sal
1597 
1598 #define _SA_annotes0(n) __declspec(#n)
1599 #define _SA_annotes1(n,pp1) __declspec(#n "(" _SA_SPECSTRIZE(pp1) ")" )
1600 #define _SA_annotes2(n,pp1,pp2) __declspec(#n "(" _SA_SPECSTRIZE(pp1) "," _SA_SPECSTRIZE(pp2) ")")
1601 #define _SA_annotes3(n,pp1,pp2,pp3) __declspec(#n "(" _SA_SPECSTRIZE(pp1) "," _SA_SPECSTRIZE(pp2) "," _SA_SPECSTRIZE(pp3) ")")
1602 
1603 #define _Pre_impl_ _SA_annotes0(SAL_pre)
1604 #define _Post_impl_ _SA_annotes0(SAL_post)
1605 #define _Deref_impl_ _SA_annotes0(SAL_deref)
1606 #define _Notref_impl_ _SA_annotes0(SAL_notref)
1607 
1608 // Declare a function to be an annotation or primop (respectively).
1609 // Done this way so that they don't appear in the regular compiler's
1610 // namespace.
1611 #define __ANNOTATION(fun) _SA_annotes0(SAL_annotation) void __SA_##fun
1612 
1613 #define __PRIMOP(type, fun) _SA_annotes0(SAL_primop) type __SA_##fun
1614 
1615 #define __QUALIFIER(fun) _SA_annotes0(SAL_qualifier) void __SA_##fun;
1616 
1617 #define __In_impl_ _Pre_impl_ _SA_annotes0(SAL_valid) _Pre_impl_ _Deref_impl_ _Notref_impl_ _SA_annotes0(SAL_readonly)
1618 
1619 #else // ][
1620 
1621 // Using "nothing" for sal
1622 
1623 #define _SA_annotes0(n)
1624 #define _SA_annotes1(n,pp1)
1625 #define _SA_annotes2(n,pp1,pp2)
1626 #define _SA_annotes3(n,pp1,pp2,pp3)
1627 
1628 #define __ANNOTATION(fun)
1629 #define __PRIMOP(type, fun)
1630 #define __QUALIFIER(type, fun)
1631 
1632 #endif // ]
1633 
1634 #if _USE_ATTRIBUTES_FOR_SAL || _USE_DECLSPECS_FOR_SAL // [
1635 
1636 // Declare annotations that need to be declared.
1637 __ANNOTATION(SAL_useHeader(void));
1638 __ANNOTATION(SAL_bound(void));
1639 __ANNOTATION(SAL_allocator(void)); //??? resolve with PFD
1640 __ANNOTATION(SAL_file_parser(__AuToQuOtE __In_impl_ char *, __In_impl_ char *));
1641 __ANNOTATION(SAL_source_code_content(__In_impl_ char *));
1642 __ANNOTATION(SAL_analysisHint(__AuToQuOtE __In_impl_ char *));
1643 __ANNOTATION(SAL_untrusted_data_source(__AuToQuOtE __In_impl_ char *));
1644 __ANNOTATION(SAL_untrusted_data_source_this(__AuToQuOtE __In_impl_ char *));
1645 __ANNOTATION(SAL_validated(__AuToQuOtE __In_impl_ char *));
1646 __ANNOTATION(SAL_validated_this(__AuToQuOtE __In_impl_ char *));
1647 __ANNOTATION(SAL_encoded(void));
1648 __ANNOTATION(SAL_adt(__AuToQuOtE __In_impl_ char *, __AuToQuOtE __In_impl_ char *));
1649 __ANNOTATION(SAL_add_adt_property(__AuToQuOtE __In_impl_ char *, __AuToQuOtE __In_impl_ char *));
1650 __ANNOTATION(SAL_remove_adt_property(__AuToQuOtE __In_impl_ char *, __AuToQuOtE __In_impl_ char *));
1651 __ANNOTATION(SAL_transfer_adt_property_from(__AuToQuOtE __In_impl_ char *));
1652 __ANNOTATION(SAL_post_type(__AuToQuOtE __In_impl_ char *));
1653 __ANNOTATION(SAL_volatile(void));
1654 __ANNOTATION(SAL_nonvolatile(void));
1655 __ANNOTATION(SAL_entrypoint(__AuToQuOtE __In_impl_ char *, __AuToQuOtE __In_impl_ char *));
1656 __ANNOTATION(SAL_blocksOn(__In_impl_ void*));
1657 __ANNOTATION(SAL_mustInspect(void));
1658 
1659 // Only appears in model files, but needs to be declared.
1660 __ANNOTATION(SAL_TypeName(__AuToQuOtE __In_impl_ char *));
1661 
1662 // To be declared well-known soon.
1663 __ANNOTATION(SAL_interlocked(void);)
1664 
1665 __QUALIFIER(SAL_name(__In_impl_ char *, __In_impl_ char *, __In_impl_ char *);)
1666 
1667 __PRIMOP(char *, _Macro_value_(__In_impl_ char *));
1668 __PRIMOP(int, _Macro_defined_(__In_impl_ char *));
1669 __PRIMOP(char *, _Strstr_(__In_impl_ char *, __In_impl_ char *));
1670 
1671 #endif // ]
1672 
1673 #if _USE_ATTRIBUTES_FOR_SAL // [
1674 
1675 #define _Check_return_impl_ [SA_Post(MustCheck=SA_Yes)]
1676 
1677 #define _Success_impl_(expr) [SA_Success(Condition=#expr)]
1678 #define _On_failure_impl_(annos) [SAL_context(p1="SAL_failed")] _Group_(_Post_impl_ _Group_(annos _SAL_nop_impl_))
1679 
1680 #define _Printf_format_string_impl_ [SA_FormatString(Style="printf")]
1681 #define _Scanf_format_string_impl_ [SA_FormatString(Style="scanf")]
1682 #define _Scanf_s_format_string_impl_ [SA_FormatString(Style="scanf_s")]
1683 
1684 #define _In_bound_impl_ [SA_PreBound(Deref=0)]
1685 #define _Out_bound_impl_ [SA_PostBound(Deref=0)]
1686 #define _Ret_bound_impl_ [SA_PostBound(Deref=0)]
1687 #define _Deref_in_bound_impl_ [SA_PreBound(Deref=1)]
1688 #define _Deref_out_bound_impl_ [SA_PostBound(Deref=1)]
1689 #define _Deref_ret_bound_impl_ [SA_PostBound(Deref=1)]
1690 
1691 #define __valid_impl Valid=SA_Yes
1692 #define __maybevalid_impl Valid=SA_Maybe
1693 #define __notvalid_impl Valid=SA_No
1694 
1695 #define __null_impl Null=SA_Yes
1696 #define __maybenull_impl Null=SA_Maybe
1697 #define __notnull_impl Null=SA_No
1698 
1699 #define __null_impl_notref Null=SA_Yes,Notref=1
1700 #define __maybenull_impl_notref Null=SA_Maybe,Notref=1
1701 #define __notnull_impl_notref Null=SA_No,Notref=1
1702 
1703 #define __zterm_impl NullTerminated=SA_Yes
1704 #define __maybezterm_impl NullTerminated=SA_Maybe
1705 #define __maybzterm_impl NullTerminated=SA_Maybe
1706 #define __notzterm_impl NullTerminated=SA_No
1707 
1708 #define __readaccess_impl Access=SA_Read
1709 #define __writeaccess_impl Access=SA_Write
1710 #define __allaccess_impl Access=SA_ReadWrite
1711 
1712 #define __readaccess_impl_notref Access=SA_Read,Notref=1
1713 #define __writeaccess_impl_notref Access=SA_Write,Notref=1
1714 #define __allaccess_impl_notref Access=SA_ReadWrite,Notref=1
1715 
1716 #if _MSC_VER >= 1610 // [
1717 
1718 // For SAL2, we need to expect general expressions.
1719 
1720 #define __cap_impl(size) WritableElements="\n"#size
1721 #define __bytecap_impl(size) WritableBytes="\n"#size
1722 #define __bytecount_impl(size) ValidBytes="\n"#size
1723 #define __count_impl(size) ValidElements="\n"#size
1724 
1725 #else // ][
1726 
1727 #define __cap_impl(size) WritableElements=#size
1728 #define __bytecap_impl(size) WritableBytes=#size
1729 #define __bytecount_impl(size) ValidBytes=#size
1730 #define __count_impl(size) ValidElements=#size
1731 
1732 #endif // ]
1733 
1734 #define __cap_c_impl(size) WritableElementsConst=size
1735 #define __cap_c_one_notref_impl WritableElementsConst=1,Notref=1
1736 #define __cap_for_impl(param) WritableElementsLength=#param
1737 #define __cap_x_impl(size) WritableElements="\n@"#size
1738 
1739 #define __bytecap_c_impl(size) WritableBytesConst=size
1740 #define __bytecap_x_impl(size) WritableBytes="\n@"#size
1741 
1742 #define __mult_impl(mult,size) __cap_impl((mult)*(size))
1743 
1744 #define __count_c_impl(size) ValidElementsConst=size
1745 #define __count_x_impl(size) ValidElements="\n@"#size
1746 
1747 #define __bytecount_c_impl(size) ValidBytesConst=size
1748 #define __bytecount_x_impl(size) ValidBytes="\n@"#size
1749 
1750 
1751 #define _At_impl_(target, annos) [SAL_at(p1=#target)] _Group_(annos)
1752 #define _At_buffer_impl_(target, iter, bound, annos) [SAL_at_buffer(p1=#target, p2=#iter, p3=#bound)] _Group_(annos)
1753 #define _When_impl_(expr, annos) [SAL_when(p1=#expr)] _Group_(annos)
1754 
1755 #define _Group_impl_(annos) [SAL_begin] annos [SAL_end]
1756 #define _GrouP_impl_(annos) [SAL_BEGIN] annos [SAL_END]
1757 
1758 #define _Use_decl_anno_impl_ _SA_annotes0(SAL_useHeader) // this is a special case!
1759 
1760 #define _Pre1_impl_(p1) [SA_Pre(p1)]
1761 #define _Pre2_impl_(p1,p2) [SA_Pre(p1,p2)]
1762 #define _Pre3_impl_(p1,p2,p3) [SA_Pre(p1,p2,p3)]
1763 
1764 #define _Post1_impl_(p1) [SA_Post(p1)]
1765 #define _Post2_impl_(p1,p2) [SA_Post(p1,p2)]
1766 #define _Post3_impl_(p1,p2,p3) [SA_Post(p1,p2,p3)]
1767 
1768 #define _Ret1_impl_(p1) [SA_Post(p1)]
1769 #define _Ret2_impl_(p1,p2) [SA_Post(p1,p2)]
1770 #define _Ret3_impl_(p1,p2,p3) [SA_Post(p1,p2,p3)]
1771 
1772 #define _Deref_pre1_impl_(p1) [SA_Pre(Deref=1,p1)]
1773 #define _Deref_pre2_impl_(p1,p2) [SA_Pre(Deref=1,p1,p2)]
1774 #define _Deref_pre3_impl_(p1,p2,p3) [SA_Pre(Deref=1,p1,p2,p3)]
1775 
1776 
1777 #define _Deref_post1_impl_(p1) [SA_Post(Deref=1,p1)]
1778 #define _Deref_post2_impl_(p1,p2) [SA_Post(Deref=1,p1,p2)]
1779 #define _Deref_post3_impl_(p1,p2,p3) [SA_Post(Deref=1,p1,p2,p3)]
1780 
1781 #define _Deref_ret1_impl_(p1) [SA_Post(Deref=1,p1)]
1782 #define _Deref_ret2_impl_(p1,p2) [SA_Post(Deref=1,p1,p2)]
1783 #define _Deref_ret3_impl_(p1,p2,p3) [SA_Post(Deref=1,p1,p2,p3)]
1784 
1785 #define _Deref2_pre1_impl_(p1) [SA_Pre(Deref=2,Notref=1,p1)]
1786 #define _Deref2_post1_impl_(p1) [SA_Post(Deref=2,Notref=1,p1)]
1787 #define _Deref2_ret1_impl_(p1) [SA_Post(Deref=2,Notref=1,p1)]
1788 
1789 // Obsolete -- may be needed for transition to attributes.
1790 #define __inner_typefix(ctype) [SAL_typefix(p1=_SA_SPECSTRIZE(ctype))]
1791 #define __inner_exceptthat [SAL_except]
1792 
1793 
1794 #elif _USE_DECLSPECS_FOR_SAL // ][
1795 
1796 #define _Check_return_impl_ __post _SA_annotes0(SAL_checkReturn)
1797 
1798 #define _Success_impl_(expr) _SA_annotes1(SAL_success, expr)
1799 #define _On_failure_impl_(annos) _SA_annotes1(SAL_context, SAL_failed) _Group_(_Post_impl_ _Group_(_SAL_nop_impl_ annos))
1800 
1801 #define _Printf_format_string_impl_ _SA_annotes1(SAL_IsFormatString, "printf")
1802 #define _Scanf_format_string_impl_ _SA_annotes1(SAL_IsFormatString, "scanf")
1803 #define _Scanf_s_format_string_impl_ _SA_annotes1(SAL_IsFormatString, "scanf_s")
1804 
1805 #define _In_bound_impl_ _Pre_impl_ _Bound_impl_
1806 #define _Out_bound_impl_ _Post_impl_ _Bound_impl_
1807 #define _Ret_bound_impl_ _Post_impl_ _Bound_impl_
1808 #define _Deref_in_bound_impl_ _Deref_pre_impl_ _Bound_impl_
1809 #define _Deref_out_bound_impl_ _Deref_post_impl_ _Bound_impl_
1810 #define _Deref_ret_bound_impl_ _Deref_post_impl_ _Bound_impl_
1811 
1812 
1813 #define __null_impl _SA_annotes0(SAL_null) // _SA_annotes1(SAL_null, __yes)
1814 #define __notnull_impl _SA_annotes0(SAL_notnull) // _SA_annotes1(SAL_null, __no)
1815 #define __maybenull_impl _SA_annotes0(SAL_maybenull) // _SA_annotes1(SAL_null, __maybe)
1816 
1817 #define __valid_impl _SA_annotes0(SAL_valid) // _SA_annotes1(SAL_valid, __yes)
1818 #define __notvalid_impl _SA_annotes0(SAL_notvalid) // _SA_annotes1(SAL_valid, __no)
1819 #define __maybevalid_impl _SA_annotes0(SAL_maybevalid) // _SA_annotes1(SAL_valid, __maybe)
1820 
1821 #define __null_impl_notref _Notref_ _Null_impl_
1822 #define __maybenull_impl_notref _Notref_ _Maybenull_impl_
1823 #define __notnull_impl_notref _Notref_ _Notnull_impl_
1824 
1825 #define __zterm_impl _SA_annotes1(SAL_nullTerminated, __yes)
1826 #define __maybezterm_impl _SA_annotes1(SAL_nullTerminated, __maybe)
1827 #define __maybzterm_impl _SA_annotes1(SAL_nullTerminated, __maybe)
1828 #define __notzterm_impl _SA_annotes1(SAL_nullTerminated, __no)
1829 
1830 #define __readaccess_impl _SA_annotes1(SAL_access, 0x1)
1831 #define __writeaccess_impl _SA_annotes1(SAL_access, 0x2)
1832 #define __allaccess_impl _SA_annotes1(SAL_access, 0x3)
1833 
1834 #define __readaccess_impl_notref _Notref_ _SA_annotes1(SAL_access, 0x1)
1835 #define __writeaccess_impl_notref _Notref_ _SA_annotes1(SAL_access, 0x2)
1836 #define __allaccess_impl_notref _Notref_ _SA_annotes1(SAL_access, 0x3)
1837 
1838 #define __cap_impl(size) _SA_annotes1(SAL_writableTo,elementCount(size))
1839 #define __cap_c_impl(size) _SA_annotes1(SAL_writableTo,elementCount(size))
1840 #define __cap_c_one_notref_impl _Notref_ _SA_annotes1(SAL_writableTo,elementCount(1))
1841 #define __cap_for_impl(param) _SA_annotes1(SAL_writableTo,inexpressibleCount(sizeof(param)))
1842 #define __cap_x_impl(size) _SA_annotes1(SAL_writableTo,inexpressibleCount(#size))
1843 
1844 #define __bytecap_impl(size) _SA_annotes1(SAL_writableTo,byteCount(size))
1845 #define __bytecap_c_impl(size) _SA_annotes1(SAL_writableTo,byteCount(size))
1846 #define __bytecap_x_impl(size) _SA_annotes1(SAL_writableTo,inexpressibleCount(#size))
1847 
1848 #define __mult_impl(mult,size) _SA_annotes1(SAL_writableTo,(mult)*(size))
1849 
1850 #define __count_impl(size) _SA_annotes1(SAL_readableTo,elementCount(size))
1851 #define __count_c_impl(size) _SA_annotes1(SAL_readableTo,elementCount(size))
1852 #define __count_x_impl(size) _SA_annotes1(SAL_readableTo,inexpressibleCount(#size))
1853 
1854 #define __bytecount_impl(size) _SA_annotes1(SAL_readableTo,byteCount(size))
1855 #define __bytecount_c_impl(size) _SA_annotes1(SAL_readableTo,byteCount(size))
1856 #define __bytecount_x_impl(size) _SA_annotes1(SAL_readableTo,inexpressibleCount(#size))
1857 
1858 #define _At_impl_(target, annos) _SA_annotes0(SAL_at(target)) _Group_(annos)
1859 #define _At_buffer_impl_(target, iter, bound, annos) _SA_annotes3(SAL_at_buffer, target, iter, bound) _Group_(annos)
1860 #define _Group_impl_(annos) _SA_annotes0(SAL_begin) annos _SA_annotes0(SAL_end)
1861 #define _GrouP_impl_(annos) _SA_annotes0(SAL_BEGIN) annos _SA_annotes0(SAL_END)
1862 #define _When_impl_(expr, annos) _SA_annotes0(SAL_when(expr)) _Group_(annos)
1863 
1864 #define _Use_decl_anno_impl_ __declspec("SAL_useHeader()") // this is a special case!
1865 
1866 #define _Pre1_impl_(p1) _Pre_impl_ p1
1867 #define _Pre2_impl_(p1,p2) _Pre_impl_ p1 _Pre_impl_ p2
1868 #define _Pre3_impl_(p1,p2,p3) _Pre_impl_ p1 _Pre_impl_ p2 _Pre_impl_ p3
1869 
1870 #define _Post1_impl_(p1) _Post_impl_ p1
1871 #define _Post2_impl_(p1,p2) _Post_impl_ p1 _Post_impl_ p2
1872 #define _Post3_impl_(p1,p2,p3) _Post_impl_ p1 _Post_impl_ p2 _Post_impl_ p3
1873 
1874 #define _Ret1_impl_(p1) _Post_impl_ p1
1875 #define _Ret2_impl_(p1,p2) _Post_impl_ p1 _Post_impl_ p2
1876 #define _Ret3_impl_(p1,p2,p3) _Post_impl_ p1 _Post_impl_ p2 _Post_impl_ p3
1877 
1878 #define _Deref_pre1_impl_(p1) _Deref_pre_impl_ p1
1879 #define _Deref_pre2_impl_(p1,p2) _Deref_pre_impl_ p1 _Deref_pre_impl_ p2
1880 #define _Deref_pre3_impl_(p1,p2,p3) _Deref_pre_impl_ p1 _Deref_pre_impl_ p2 _Deref_pre_impl_ p3
1881 
1882 #define _Deref_post1_impl_(p1) _Deref_post_impl_ p1
1883 #define _Deref_post2_impl_(p1,p2) _Deref_post_impl_ p1 _Deref_post_impl_ p2
1884 #define _Deref_post3_impl_(p1,p2,p3) _Deref_post_impl_ p1 _Deref_post_impl_ p2 _Deref_post_impl_ p3
1885 
1886 #define _Deref_ret1_impl_(p1) _Deref_post_impl_ p1
1887 #define _Deref_ret2_impl_(p1,p2) _Deref_post_impl_ p1 _Deref_post_impl_ p2
1888 #define _Deref_ret3_impl_(p1,p2,p3) _Deref_post_impl_ p1 _Deref_post_impl_ p2 _Deref_post_impl_ p3
1889 
1890 #define _Deref2_pre1_impl_(p1) _Deref_pre_impl_ _Notref_impl_ _Deref_impl_ p1
1891 #define _Deref2_post1_impl_(p1) _Deref_post_impl_ _Notref_impl_ _Deref_impl_ p1
1892 #define _Deref2_ret1_impl_(p1) _Deref_post_impl_ _Notref_impl_ _Deref_impl_ p1
1893 
1894 #define __inner_typefix(ctype) _SA_annotes1(SAL_typefix, ctype)
1895 #define __inner_exceptthat _SA_annotes0(SAL_except)
1896 
1897 #elif defined(_MSC_EXTENSIONS) && !defined( MIDL_PASS ) && !defined(__midl) && !defined(RC_INVOKED) && defined(_PFT_VER) && _MSC_VER >= 1400 // ][
1898 
1899 // minimum attribute expansion for foreground build
1900 
1901 #pragma push_macro( "SA" )
1902 #pragma push_macro( "REPEATABLE" )
1903 
1904 #ifdef __cplusplus // [
1905 #define SA( id ) id
1906 #define REPEATABLE [repeatable]
1907 #else // !__cplusplus // ][
1908 #define SA( id ) SA_##id
1909 #define REPEATABLE
1910 #endif // !__cplusplus // ]
1911 
1912 REPEATABLE
1913 [source_annotation_attribute( SA( Parameter ) )]
1914 struct __P_impl
1915 {
1916 #ifdef __cplusplus // [
1917  __P_impl();
1918 #endif // ]
1919  int __d_;
1920 };
1921 typedef struct __P_impl __P_impl;
1922 
1923 REPEATABLE
1924 [source_annotation_attribute( SA( ReturnValue ) )]
1925 struct __R_impl
1926 {
1927 #ifdef __cplusplus // [
1928  __R_impl();
1929 #endif // ]
1930  int __d_;
1931 };
1932 typedef struct __R_impl __R_impl;
1933 
1934 [source_annotation_attribute( SA( Method ) )]
1935 struct __M_
1936 {
1937 #ifdef __cplusplus // [
1938  __M_();
1939 #endif // ]
1940  int __d_;
1941 };
1942 typedef struct __M_ __M_;
1943 
1944 [source_annotation_attribute( SA( All ) )]
1945 struct __A_
1946 {
1947 #ifdef __cplusplus // [
1948  __A_();
1949 #endif // ]
1950  int __d_;
1951 };
1952 typedef struct __A_ __A_;
1953 
1954 [source_annotation_attribute( SA( Field ) )]
1955 struct __F_
1956 {
1957 #ifdef __cplusplus // [
1958  __F_();
1959 #endif // ]
1960  int __d_;
1961 };
1962 typedef struct __F_ __F_;
1963 
1964 #pragma pop_macro( "REPEATABLE" )
1965 #pragma pop_macro( "SA" )
1966 
1967 
1968 #define _SAL_nop_impl_
1969 
1970 #define _At_impl_(target, annos) [__A_(__d_=0)]
1971 #define _At_buffer_impl_(target, iter, bound, annos) [__A_(__d_=0)]
1972 #define _When_impl_(expr, annos) annos
1973 #define _Group_impl_(annos) annos
1974 #define _GrouP_impl_(annos) annos
1975 #define _Use_decl_anno_impl_ [__M_(__d_=0)]
1976 
1977 #define _Points_to_data_impl_ [__P_impl(__d_=0)]
1978 #define _Literal_impl_ [__P_impl(__d_=0)]
1979 #define _Notliteral_impl_ [__P_impl(__d_=0)]
1980 
1981 #define _Pre_valid_impl_ [__P_impl(__d_=0)]
1982 #define _Post_valid_impl_ [__P_impl(__d_=0)]
1983 #define _Ret_valid_impl_ [__R_impl(__d_=0)]
1984 
1985 #define _Check_return_impl_ [__R_impl(__d_=0)]
1986 #define _Must_inspect_impl_ [__R_impl(__d_=0)]
1987 
1988 #define _Success_impl_(expr) [__M_(__d_=0)]
1989 #define _On_failure_impl_(expr) [__M_(__d_=0)]
1990 #define _Always_impl_(expr) [__M_(__d_=0)]
1991 
1992 #define _Printf_format_string_impl_ [__P_impl(__d_=0)]
1993 #define _Scanf_format_string_impl_ [__P_impl(__d_=0)]
1994 #define _Scanf_s_format_string_impl_ [__P_impl(__d_=0)]
1995 
1996 #define _Raises_SEH_exception_impl_ [__M_(__d_=0)]
1997 #define _Maybe_raises_SEH_exception_impl_ [__M_(__d_=0)]
1998 
1999 #define _In_bound_impl_ [__P_impl(__d_=0)]
2000 #define _Out_bound_impl_ [__P_impl(__d_=0)]
2001 #define _Ret_bound_impl_ [__R_impl(__d_=0)]
2002 #define _Deref_in_bound_impl_ [__P_impl(__d_=0)]
2003 #define _Deref_out_bound_impl_ [__P_impl(__d_=0)]
2004 #define _Deref_ret_bound_impl_ [__R_impl(__d_=0)]
2005 
2006 #define _Range_impl_(min,max) [__P_impl(__d_=0)]
2007 #define _In_range_impl_(min,max) [__P_impl(__d_=0)]
2008 #define _Out_range_impl_(min,max) [__P_impl(__d_=0)]
2009 #define _Ret_range_impl_(min,max) [__R_impl(__d_=0)]
2010 #define _Deref_in_range_impl_(min,max) [__P_impl(__d_=0)]
2011 #define _Deref_out_range_impl_(min,max) [__P_impl(__d_=0)]
2012 #define _Deref_ret_range_impl_(min,max) [__R_impl(__d_=0)]
2013 
2014 #define _Field_range_impl_(min,max) [__F_(__d_=0)]
2015 
2016 #define _Pre_satisfies_impl_(cond) [__A_(__d_=0)]
2017 #define _Post_satisfies_impl_(cond) [__A_(__d_=0)]
2018 #define _Satisfies_impl_(cond) [__A_(__d_=0)]
2019 
2020 #define _Null_impl_ [__A_(__d_=0)]
2021 #define _Notnull_impl_ [__A_(__d_=0)]
2022 #define _Maybenull_impl_ [__A_(__d_=0)]
2023 
2024 #define _Valid_impl_ [__A_(__d_=0)]
2025 #define _Notvalid_impl_ [__A_(__d_=0)]
2026 #define _Maybevalid_impl_ [__A_(__d_=0)]
2027 
2028 #define _Readable_bytes_impl_(size) [__A_(__d_=0)]
2029 #define _Readable_elements_impl_(size) [__A_(__d_=0)]
2030 #define _Writable_bytes_impl_(size) [__A_(__d_=0)]
2031 #define _Writable_elements_impl_(size) [__A_(__d_=0)]
2032 
2033 #define _Null_terminated_impl_ [__A_(__d_=0)]
2034 #define _NullNull_terminated_impl_ [__A_(__d_=0)]
2035 
2036 #define _Pre_impl_ [__P_impl(__d_=0)]
2037 #define _Pre1_impl_(p1) [__P_impl(__d_=0)]
2038 #define _Pre2_impl_(p1,p2) [__P_impl(__d_=0)]
2039 #define _Pre3_impl_(p1,p2,p3) [__P_impl(__d_=0)]
2040 
2041 #define _Post_impl_ [__P_impl(__d_=0)]
2042 #define _Post1_impl_(p1) [__P_impl(__d_=0)]
2043 #define _Post2_impl_(p1,p2) [__P_impl(__d_=0)]
2044 #define _Post3_impl_(p1,p2,p3) [__P_impl(__d_=0)]
2045 
2046 #define _Ret1_impl_(p1) [__R_impl(__d_=0)]
2047 #define _Ret2_impl_(p1,p2) [__R_impl(__d_=0)]
2048 #define _Ret3_impl_(p1,p2,p3) [__R_impl(__d_=0)]
2049 
2050 #define _Deref_pre1_impl_(p1) [__P_impl(__d_=0)]
2051 #define _Deref_pre2_impl_(p1,p2) [__P_impl(__d_=0)]
2052 #define _Deref_pre3_impl_(p1,p2,p3) [__P_impl(__d_=0)]
2053 
2054 #define _Deref_post1_impl_(p1) [__P_impl(__d_=0)]
2055 #define _Deref_post2_impl_(p1,p2) [__P_impl(__d_=0)]
2056 #define _Deref_post3_impl_(p1,p2,p3) [__P_impl(__d_=0)]
2057 
2058 #define _Deref_ret1_impl_(p1) [__R_impl(__d_=0)]
2059 #define _Deref_ret2_impl_(p1,p2) [__R_impl(__d_=0)]
2060 #define _Deref_ret3_impl_(p1,p2,p3) [__R_impl(__d_=0)]
2061 
2062 #define _Deref2_pre1_impl_(p1) //[__P_impl(__d_=0)]
2063 #define _Deref2_post1_impl_(p1) //[__P_impl(__d_=0)]
2064 #define _Deref2_ret1_impl_(p1) //[__P_impl(__d_=0)]
2065 
2066 #else // ][
2067 
2068 
2069 #define _SAL_nop_impl_ X
2070 
2071 #define _At_impl_(target, annos)
2072 #define _When_impl_(expr, annos)
2073 #define _Group_impl_(annos)
2074 #define _GrouP_impl_(annos)
2075 #define _At_buffer_impl_(target, iter, bound, annos)
2076 #define _Use_decl_anno_impl_
2077 #define _Points_to_data_impl_
2078 #define _Literal_impl_
2079 #define _Notliteral_impl_
2080 #define _Notref_impl_
2081 
2082 #define _Pre_valid_impl_
2083 #define _Post_valid_impl_
2084 #define _Ret_valid_impl_
2085 
2086 #define _Check_return_impl_
2087 #define _Must_inspect_impl_
2088 
2089 #define _Success_impl_(expr)
2090 #define _On_failure_impl_(annos)
2091 #define _Always_impl_(annos)
2092 
2093 #define _Printf_format_string_impl_
2094 #define _Scanf_format_string_impl_
2095 #define _Scanf_s_format_string_impl_
2096 
2097 #define _In_bound_impl_
2098 #define _Out_bound_impl_
2099 #define _Ret_bound_impl_
2100 #define _Deref_in_bound_impl_
2101 #define _Deref_out_bound_impl_
2102 #define _Deref_ret_bound_impl_
2103 
2104 #define _Range_impl_(min,max)
2105 #define _In_range_impl_(min,max)
2106 #define _Out_range_impl_(min,max)
2107 #define _Ret_range_impl_(min,max)
2108 #define _Deref_in_range_impl_(min,max)
2109 #define _Deref_out_range_impl_(min,max)
2110 #define _Deref_ret_range_impl_(min,max)
2111 
2112 #define _Satisfies_impl_(expr)
2113 #define _Pre_satisfies_impl_(expr)
2114 #define _Post_satisfies_impl_(expr)
2115 
2116 #define _Null_impl_
2117 #define _Notnull_impl_
2118 #define _Maybenull_impl_
2119 
2120 #define _Valid_impl_
2121 #define _Notvalid_impl_
2122 #define _Maybevalid_impl_
2123 
2124 #define _Field_range_impl_(min,max)
2125 
2126 #define _Pre_impl_
2127 #define _Pre1_impl_(p1)
2128 #define _Pre2_impl_(p1,p2)
2129 #define _Pre3_impl_(p1,p2,p3)
2130 
2131 #define _Post_impl_
2132 #define _Post1_impl_(p1)
2133 #define _Post2_impl_(p1,p2)
2134 #define _Post3_impl_(p1,p2,p3)
2135 
2136 #define _Ret1_impl_(p1)
2137 #define _Ret2_impl_(p1,p2)
2138 #define _Ret3_impl_(p1,p2,p3)
2139 
2140 #define _Deref_pre1_impl_(p1)
2141 #define _Deref_pre2_impl_(p1,p2)
2142 #define _Deref_pre3_impl_(p1,p2,p3)
2143 
2144 #define _Deref_post1_impl_(p1)
2145 #define _Deref_post2_impl_(p1,p2)
2146 #define _Deref_post3_impl_(p1,p2,p3)
2147 
2148 #define _Deref_ret1_impl_(p1)
2149 #define _Deref_ret2_impl_(p1,p2)
2150 #define _Deref_ret3_impl_(p1,p2,p3)
2151 
2152 #define _Deref2_pre1_impl_(p1)
2153 #define _Deref2_post1_impl_(p1)
2154 #define _Deref2_ret1_impl_(p1)
2155 
2156 #define _Readable_bytes_impl_(size)
2157 #define _Readable_elements_impl_(size)
2158 #define _Writable_bytes_impl_(size)
2159 #define _Writable_elements_impl_(size)
2160 
2161 #define _Null_terminated_impl_
2162 #define _NullNull_terminated_impl_
2163 
2164 // Obsolete -- may be needed for transition to attributes.
2165 #define __inner_typefix(ctype)
2166 #define __inner_exceptthat
2167 
2168 #endif // ]
2169 
2170 // This section contains the deprecated annotations
2171 
2172 /*
2173  -------------------------------------------------------------------------------
2174  Introduction
2175 
2176  sal.h provides a set of annotations to describe how a function uses its
2177  parameters - the assumptions it makes about them, and the guarantees it makes
2178  upon finishing.
2179 
2180  Annotations may be placed before either a function parameter's type or its return
2181  type, and describe the function's behavior regarding the parameter or return value.
2182  There are two classes of annotations: buffer annotations and advanced annotations.
2183  Buffer annotations describe how functions use their pointer parameters, and
2184  advanced annotations either describe complex/unusual buffer behavior, or provide
2185  additional information about a parameter that is not otherwise expressible.
2186 
2187  -------------------------------------------------------------------------------
2188  Buffer Annotations
2189 
2190  The most important annotations in sal.h provide a consistent way to annotate
2191  buffer parameters or return values for a function. Each of these annotations describes
2192  a single buffer (which could be a string, a fixed-length or variable-length array,
2193  or just a pointer) that the function interacts with: where it is, how large it is,
2194  how much is initialized, and what the function does with it.
2195 
2196  The appropriate macro for a given buffer can be constructed using the table below.
2197  Just pick the appropriate values from each category, and combine them together
2198  with a leading underscore. Some combinations of values do not make sense as buffer
2199  annotations. Only meaningful annotations can be added to your code; for a list of
2200  these, see the buffer annotation definitions section.
2201 
2202  Only a single buffer annotation should be used for each parameter.
2203 
2204  |------------|------------|---------|--------|----------|----------|---------------|
2205  | Level | Usage | Size | Output | NullTerm | Optional | Parameters |
2206  |------------|------------|---------|--------|----------|----------|---------------|
2207  | <> | <> | <> | <> | _z | <> | <> |
2208  | _deref | _in | _ecount | _full | _nz | _opt | (size) |
2209  | _deref_opt | _out | _bcount | _part | | | (size,length) |
2210  | | _inout | | | | | |
2211  | | | | | | | |
2212  |------------|------------|---------|--------|----------|----------|---------------|
2213 
2214  Level: Describes the buffer pointer's level of indirection from the parameter or
2215  return value 'p'.
2216 
2217  <> : p is the buffer pointer.
2218  _deref : *p is the buffer pointer. p must not be NULL.
2219  _deref_opt : *p may be the buffer pointer. p may be NULL, in which case the rest of
2220  the annotation is ignored.
2221 
2222  Usage: Describes how the function uses the buffer.
2223 
2224  <> : The buffer is not accessed. If used on the return value or with _deref, the
2225  function will provide the buffer, and it will be uninitialized at exit.
2226  Otherwise, the caller must provide the buffer. This should only be used
2227  for alloc and free functions.
2228  _in : The function will only read from the buffer. The caller must provide the
2229  buffer and initialize it. Cannot be used with _deref.
2230  _out : The function will only write to the buffer. If used on the return value or
2231  with _deref, the function will provide the buffer and initialize it.
2232  Otherwise, the caller must provide the buffer, and the function will
2233  initialize it.
2234  _inout : The function may freely read from and write to the buffer. The caller must
2235  provide the buffer and initialize it. If used with _deref, the buffer may
2236  be reallocated by the function.
2237 
2238  Size: Describes the total size of the buffer. This may be less than the space actually
2239  allocated for the buffer, in which case it describes the accessible amount.
2240 
2241  <> : No buffer size is given. If the type specifies the buffer size (such as
2242  with LPSTR and LPWSTR), that amount is used. Otherwise, the buffer is one
2243  element long. Must be used with _in, _out, or _inout.
2244  _ecount : The buffer size is an explicit element count.
2245  _bcount : The buffer size is an explicit byte count.
2246 
2247  Output: Describes how much of the buffer will be initialized by the function. For
2248  _inout buffers, this also describes how much is initialized at entry. Omit this
2249  category for _in buffers; they must be fully initialized by the caller.
2250 
2251  <> : The type specifies how much is initialized. For instance, a function initializing
2252  an LPWSTR must NULL-terminate the string.
2253  _full : The function initializes the entire buffer.
2254  _part : The function initializes part of the buffer, and explicitly indicates how much.
2255 
2256  NullTerm: States if the present of a '\0' marks the end of valid elements in the buffer.
2257  _z : A '\0' indicated the end of the buffer
2258  _nz : The buffer may not be null terminated and a '\0' does not indicate the end of the
2259  buffer.
2260  Optional: Describes if the buffer itself is optional.
2261 
2262  <> : The pointer to the buffer must not be NULL.
2263  _opt : The pointer to the buffer might be NULL. It will be checked before being dereferenced.
2264 
2265  Parameters: Gives explicit counts for the size and length of the buffer.
2266 
2267  <> : There is no explicit count. Use when neither _ecount nor _bcount is used.
2268  (size) : Only the buffer's total size is given. Use with _ecount or _bcount but not _part.
2269  (size,length) : The buffer's total size and initialized length are given. Use with _ecount_part
2270  and _bcount_part.
2271 
2272  -------------------------------------------------------------------------------
2273  Buffer Annotation Examples
2274 
2275  LWSTDAPI_(BOOL) StrToIntExA(
2276  __in LPCSTR pszString,
2277  DWORD dwFlags,
2278  __out int *piRet -- A pointer whose dereference will be filled in.
2279  );
2280 
2281  void MyPaintingFunction(
2282  __in HWND hwndControl, -- An initialized read-only parameter.
2283  __in_opt HDC hdcOptional, -- An initialized read-only parameter that might be NULL.
2284  __inout IPropertyStore *ppsStore -- An initialized parameter that may be freely used
2285  -- and modified.
2286  );
2287 
2288  LWSTDAPI_(BOOL) PathCompactPathExA(
2289  __out_ecount(cchMax) LPSTR pszOut, -- A string buffer with cch elements that will
2290  -- be NULL terminated on exit.
2291  __in LPCSTR pszSrc,
2292  UINT cchMax,
2293  DWORD dwFlags
2294  );
2295 
2296  HRESULT SHLocalAllocBytes(
2297  size_t cb,
2298  __deref_bcount(cb) T **ppv -- A pointer whose dereference will be set to an
2299  -- uninitialized buffer with cb bytes.
2300  );
2301 
2302  __inout_bcount_full(cb) : A buffer with cb elements that is fully initialized at
2303  entry and exit, and may be written to by this function.
2304 
2305  __out_ecount_part(count, *countOut) : A buffer with count elements that will be
2306  partially initialized by this function. The function indicates how much it
2307  initialized by setting *countOut.
2308 
2309  -------------------------------------------------------------------------------
2310  Advanced Annotations
2311 
2312  Advanced annotations describe behavior that is not expressible with the regular
2313  buffer macros. These may be used either to annotate buffer parameters that involve
2314  complex or conditional behavior, or to enrich existing annotations with additional
2315  information.
2316 
2317  __success(expr) f :
2318  <expr> indicates whether function f succeeded or not. If <expr> is true at exit,
2319  all the function's guarantees (as given by other annotations) must hold. If <expr>
2320  is false at exit, the caller should not expect any of the function's guarantees
2321  to hold. If not used, the function must always satisfy its guarantees. Added
2322  automatically to functions that indicate success in standard ways, such as by
2323  returning an HRESULT.
2324 
2325  __nullterminated p :
2326  Pointer p is a buffer that may be read or written up to and including the first
2327  NULL character or pointer. May be used on typedefs, which marks valid (properly
2328  initialized) instances of that type as being NULL-terminated.
2329 
2330  __nullnullterminated p :
2331  Pointer p is a buffer that may be read or written up to and including the first
2332  sequence of two NULL characters or pointers. May be used on typedefs, which marks
2333  valid instances of that type as being double-NULL terminated.
2334 
2335  __reserved v :
2336  Value v must be 0/NULL, reserved for future use.
2337 
2338  __checkReturn v :
2339  Return value v must not be ignored by callers of this function.
2340 
2341  __typefix(ctype) v :
2342  Value v should be treated as an instance of ctype, rather than its declared type.
2343 
2344  __override f :
2345  Specify C#-style 'override' behaviour for overriding virtual methods.
2346 
2347  __callback f :
2348  Function f can be used as a function pointer.
2349 
2350  __format_string p :
2351  Pointer p is a string that contains % markers in the style of printf.
2352 
2353  __blocksOn(resource) f :
2354  Function f blocks on the resource 'resource'.
2355 
2356  __fallthrough :
2357  Annotates switch statement labels where fall-through is desired, to distinguish
2358  from forgotten break statements.
2359 
2360  -------------------------------------------------------------------------------
2361  Advanced Annotation Examples
2362 
2363  __success(return != FALSE) LWSTDAPI_(BOOL)
2364  PathCanonicalizeA(__out_ecount(MAX_PATH) LPSTR pszBuf, LPCSTR pszPath) :
2365  pszBuf is only guaranteed to be NULL-terminated when TRUE is returned.
2366 
2367  typedef __nullterminated WCHAR* LPWSTR : Initialized LPWSTRs are NULL-terminated strings.
2368 
2369  __out_ecount(cch) __typefix(LPWSTR) void *psz : psz is a buffer parameter which will be
2370  a NULL-terminated WCHAR string at exit, and which initially contains cch WCHARs.
2371 
2372  -------------------------------------------------------------------------------
2373 */
2374 
2375 #define __specstrings
2376 
2377 #ifdef __cplusplus // [
2378 #ifndef __nothrow // [
2379 # define __nothrow __declspec(nothrow)
2380 #endif // ]
2381 extern "C" {
2382 #else // ][
2383 #ifndef __nothrow // [
2384 # define __nothrow
2385 #endif // ]
2386 #endif /* __cplusplus */ // ]
2387 
2388 
2389 /*
2390  -------------------------------------------------------------------------------
2391  Helper Macro Definitions
2392 
2393  These express behavior common to many of the high-level annotations.
2394  DO NOT USE THESE IN YOUR CODE.
2395  -------------------------------------------------------------------------------
2396 */
2397 
2398 /*
2399  The helper annotations are only understood by the compiler version used by
2400  various defect detection tools. When the regular compiler is running, they
2401  are defined into nothing, and do not affect the compiled code.
2402 */
2403 
2404 #if !defined(__midl) && defined(_PREFAST_) // [
2405 
2406  /*
2407  In the primitive "SAL_*" annotations "SAL" stands for Standard
2408  Annotation Language. These "SAL_*" annotations are the
2409  primitives the compiler understands and high-level MACROs
2410  will decompose into these primivates.
2411  */
2412 
2413  #define _SA_SPECSTRIZE( x ) #x
2414 
2415  /*
2416  __null p
2417  __notnull p
2418  __maybenull p
2419 
2420  Annotates a pointer p. States that pointer p is null. Commonly used
2421  in the negated form __notnull or the possibly null form __maybenull.
2422  */
2423 
2424  #define __null _Null_impl_
2425  #define __notnull _Notnull_impl_
2426  #define __maybenull _Maybenull_impl_
2427 
2428  /*
2429  __readonly l
2430  __notreadonly l
2431  __mabyereadonly l
2432 
2433  Annotates a location l. States that location l is not modified after
2434  this point. If the annotation is placed on the precondition state of
2435  a function, the restriction only applies until the postcondition state
2436  of the function. __maybereadonly states that the annotated location
2437  may be modified, whereas __notreadonly states that a location must be
2438  modified.
2439  */
2440 
2441  #define __readonly _Pre1_impl_(__readaccess_impl)
2442  #define __notreadonly _Pre1_impl_(__allaccess_impl)
2443  #define __maybereadonly _Pre1_impl_(__readaccess_impl)
2444 
2445  /*
2446  __valid v
2447  __notvalid v
2448  __maybevalid v
2449 
2450  Annotates any value v. States that the value satisfies all properties of
2451  valid values of its type. For example, for a string buffer, valid means
2452  that the buffer pointer is either NULL or points to a NULL-terminated string.
2453  */
2454 
2455  #define __valid _Valid_impl_
2456  #define __notvalid _Notvalid_impl_
2457  #define __maybevalid _Maybevalid_impl_
2458 
2459  /*
2460  __readableTo(extent) p
2461 
2462  Annotates a buffer pointer p. If the buffer can be read, extent describes
2463  how much of the buffer is readable. For a reader of the buffer, this is
2464  an explicit permission to read up to that amount, rather than a restriction to
2465  read only up to it.
2466  */
2467 
2468  #define __readableTo(extent) _SA_annotes1(SAL_readableTo, extent)
2469 
2470  /*
2471 
2472  __elem_readableTo(size)
2473 
2474  Annotates a buffer pointer p as being readable to size elements.
2475  */
2476 
2477  #define __elem_readableTo(size) _SA_annotes1(SAL_readableTo, elementCount( size ))
2478 
2479  /*
2480  __byte_readableTo(size)
2481 
2482  Annotates a buffer pointer p as being readable to size bytes.
2483  */
2484  #define __byte_readableTo(size) _SA_annotes1(SAL_readableTo, byteCount(size))
2485 
2486  /*
2487  __writableTo(extent) p
2488 
2489  Annotates a buffer pointer p. If the buffer can be modified, extent
2490  describes how much of the buffer is writable (usually the allocation
2491  size). For a writer of the buffer, this is an explicit permission to
2492  write up to that amount, rather than a restriction to write only up to it.
2493  */
2494  #define __writableTo(size) _SA_annotes1(SAL_writableTo, size)
2495 
2496  /*
2497  __elem_writableTo(size)
2498 
2499  Annotates a buffer pointer p as being writable to size elements.
2500  */
2501  #define __elem_writableTo(size) _SA_annotes1(SAL_writableTo, elementCount( size ))
2502 
2503  /*
2504  __byte_writableTo(size)
2505 
2506  Annotates a buffer pointer p as being writable to size bytes.
2507  */
2508  #define __byte_writableTo(size) _SA_annotes1(SAL_writableTo, byteCount( size))
2509 
2510  /*
2511  __deref p
2512 
2513  Annotates a pointer p. The next annotation applies one dereference down
2514  in the type. If readableTo(p, size) then the next annotation applies to
2515  all elements *(p+i) for which i satisfies the size. If p is a pointer
2516  to a struct, the next annotation applies to all fields of the struct.
2517  */
2518  #define __deref _Deref_impl_
2519 
2520  /*
2521  __pre __next_annotation
2522 
2523  The next annotation applies in the precondition state
2524  */
2525  #define __pre _Pre_impl_
2526 
2527  /*
2528  __post __next_annotation
2529 
2530  The next annotation applies in the postcondition state
2531  */
2532  #define __post _Post_impl_
2533 
2534  /*
2535  __precond(<expr>)
2536 
2537  When <expr> is true, the next annotation applies in the precondition state
2538  (currently not enabled)
2539  */
2540  #define __precond(expr) __pre
2541 
2542  /*
2543  __postcond(<expr>)
2544 
2545  When <expr> is true, the next annotation applies in the postcondition state
2546  (currently not enabled)
2547  */
2548  #define __postcond(expr) __post
2549 
2550  /*
2551  __exceptthat
2552 
2553  Given a set of annotations Q containing __exceptthat maybeP, the effect of
2554  the except clause is to erase any P or notP annotations (explicit or
2555  implied) within Q at the same level of dereferencing that the except
2556  clause appears, and to replace it with maybeP.
2557 
2558  Example 1: __valid __pre_except_maybenull on a pointer p means that the
2559  pointer may be null, and is otherwise valid, thus overriding
2560  the implicit notnull annotation implied by __valid on
2561  pointers.
2562 
2563  Example 2: __valid __deref __pre_except_maybenull on an int **p means
2564  that p is not null (implied by valid), but the elements
2565  pointed to by p could be null, and are otherwise valid.
2566  */
2567  #define __exceptthat __inner_exceptthat
2568 
2569  /*
2570  _refparam
2571 
2572  Added to all out parameter macros to indicate that they are all reference
2573  parameters.
2574  */
2575  #define __refparam _Notref_ __deref __notreadonly
2576 
2577  /*
2578  __inner_*
2579 
2580  Helper macros that directly correspond to certain high-level annotations.
2581 
2582  */
2583 
2584  /*
2585  Macros to classify the entrypoints and indicate their category.
2586 
2587  Pre-defined control point categories include: RPC, LPC, DeviceDriver, UserToKernel, ISAPI, COM.
2588 
2589  */
2590  #define __inner_control_entrypoint(category) _SA_annotes2(SAL_entrypoint, controlEntry, category)
2591 
2592 
2593  /*
2594  Pre-defined data entry point categories include: Registry, File, Network.
2595  */
2596  #define __inner_data_entrypoint(category) _SA_annotes2(SAL_entrypoint, dataEntry, category)
2597 
2598  #define __inner_override _SA_annotes0(__override)
2599  #define __inner_callback _SA_annotes0(__callback)
2600  #define __inner_blocksOn(resource) _SA_annotes1(SAL_blocksOn, resource)
2601  #define __inner_fallthrough_dec __inline __nothrow void __FallThrough() {}
2602  #define __inner_fallthrough __FallThrough();
2603 
2604  #define __post_except_maybenull __post __inner_exceptthat _Maybenull_impl_
2605  #define __pre_except_maybenull __pre __inner_exceptthat _Maybenull_impl_
2606 
2607  #define __post_deref_except_maybenull __post __deref __inner_exceptthat _Maybenull_impl_
2608  #define __pre_deref_except_maybenull __pre __deref __inner_exceptthat _Maybenull_impl_
2609 
2610  #define __inexpressible_readableTo(size) _Readable_elements_impl_(_Inexpressible_(size))
2611  #define __inexpressible_writableTo(size) _Writable_elements_impl_(_Inexpressible_(size))
2612 
2613 
2614 #else // ][
2615  #define __null
2616  #define __notnull
2617  #define __maybenull
2618  #define __readonly
2619  #define __notreadonly
2620  #define __maybereadonly
2621  #define __valid
2622  #define __notvalid
2623  #define __maybevalid
2624  #define __readableTo(extent)
2625  #define __elem_readableTo(size)
2626  #define __byte_readableTo(size)
2627  #define __writableTo(size)
2628  #define __elem_writableTo(size)
2629  #define __byte_writableTo(size)
2630  #define __deref
2631  #define __pre
2632  #define __post
2633  #define __precond(expr)
2634  #define __postcond(expr)
2635  #define __exceptthat
2636  #define __inner_override
2637  #define __inner_callback
2638  #define __inner_blocksOn(resource)
2639  #define __inner_fallthrough_dec
2640  #define __inner_fallthrough
2641  #define __refparam
2642  #define __inner_control_entrypoint(category)
2643  #define __inner_data_entrypoint(category)
2644 
2645  #define __post_except_maybenull
2646  #define __pre_except_maybenull
2647  #define __post_deref_except_maybenull
2648  #define __pre_deref_except_maybenull
2649 
2650  #define __inexpressible_readableTo(size)
2651  #define __inexpressible_writableTo(size)
2652 
2653 #endif /* !defined(__midl) && defined(_PREFAST_) */ // ]
2654 
2655 /*
2656 -------------------------------------------------------------------------------
2657 Buffer Annotation Definitions
2658 
2659 Any of these may be used to directly annotate functions, but only one should
2660 be used for each parameter. To determine which annotation to use for a given
2661 buffer, use the table in the buffer annotations section.
2662 -------------------------------------------------------------------------------
2663 */
2664 
2665 #define __ecount(size) _SAL1_Source_(__ecount, (size), __notnull __elem_writableTo(size))
2666 #define __bcount(size) _SAL1_Source_(__bcount, (size), __notnull __byte_writableTo(size))
2667 #define __in _SAL1_Source_(__in, (), _In_)
2668 #define __in_ecount(size) _SAL1_Source_(__in_ecount, (size), _In_reads_(size))
2669 #define __in_bcount(size) _SAL1_Source_(__in_bcount, (size), _In_reads_bytes_(size))
2670 #define __in_z _SAL1_Source_(__in_z, (), _In_z_)
2671 #define __in_ecount_z(size) _SAL1_Source_(__in_ecount_z, (size), _In_reads_z_(size))
2672 #define __in_bcount_z(size) _SAL1_Source_(__in_bcount_z, (size), __in_bcount(size) __pre __nullterminated)
2673 #define __in_nz _SAL1_Source_(__in_nz, (), __in)
2674 #define __in_ecount_nz(size) _SAL1_Source_(__in_ecount_nz, (size), __in_ecount(size))
2675 #define __in_bcount_nz(size) _SAL1_Source_(__in_bcount_nz, (size), __in_bcount(size))
2676 #define __out _SAL1_Source_(__out, (), _Out_)
2677 #define __out_ecount(size) _SAL1_Source_(__out_ecount, (size), _Out_writes_(size))
2678 #define __out_bcount(size) _SAL1_Source_(__out_bcount, (size), _Out_writes_bytes_(size))
2679 #define __out_ecount_part(size,length) _SAL1_Source_(__out_ecount_part, (size,length), _Out_writes_to_(size,length))
2680 #define __out_bcount_part(size,length) _SAL1_Source_(__out_bcount_part, (size,length), _Out_writes_bytes_to_(size,length))
2681 #define __out_ecount_full(size) _SAL1_Source_(__out_ecount_full, (size), _Out_writes_all_(size))
2682 #define __out_bcount_full(size) _SAL1_Source_(__out_bcount_full, (size), _Out_writes_bytes_all_(size))
2683 #define __out_z _SAL1_Source_(__out_z, (), __post __valid __refparam __post __nullterminated)
2684 #define __out_z_opt _SAL1_Source_(__out_z_opt, (), __post __valid __refparam __post __nullterminated __pre_except_maybenull)
2685 #define __out_ecount_z(size) _SAL1_Source_(__out_ecount_z, (size), __ecount(size) __post __valid __refparam __post __nullterminated)
2686 #define __out_bcount_z(size) _SAL1_Source_(__out_bcount_z, (size), __bcount(size) __post __valid __refparam __post __nullterminated)
2687 #define __out_ecount_part_z(size,length) _SAL1_Source_(__out_ecount_part_z, (size,length), __out_ecount_part(size,length) __post __nullterminated)
2688 #define __out_bcount_part_z(size,length) _SAL1_Source_(__out_bcount_part_z, (size,length), __out_bcount_part(size,length) __post __nullterminated)
2689 #define __out_ecount_full_z(size) _SAL1_Source_(__out_ecount_full_z, (size), __out_ecount_full(size) __post __nullterminated)
2690 #define __out_bcount_full_z(size) _SAL1_Source_(__out_bcount_full_z, (size), __out_bcount_full(size) __post __nullterminated)
2691 #define __out_nz _SAL1_Source_(__out_nz, (), __post __valid __refparam)
2692 #define __out_nz_opt _SAL1_Source_(__out_nz_opt, (), __post __valid __refparam __post_except_maybenull_)
2693 #define __out_ecount_nz(size) _SAL1_Source_(__out_ecount_nz, (size), __ecount(size) __post __valid __refparam)
2694 #define __out_bcount_nz(size) _SAL1_Source_(__out_bcount_nz, (size), __bcount(size) __post __valid __refparam)
2695 #define __inout _SAL1_Source_(__inout, (), _Inout_)
2696 #define __inout_ecount(size) _SAL1_Source_(__inout_ecount, (size), _Inout_updates_(size))
2697 #define __inout_bcount(size) _SAL1_Source_(__inout_bcount, (size), _Inout_updates_bytes_(size))
2698 #define __inout_ecount_part(size,length) _SAL1_Source_(__inout_ecount_part, (size,length), _Inout_updates_to_(size,length))
2699 #define __inout_bcount_part(size,length) _SAL1_Source_(__inout_bcount_part, (size,length), _Inout_updates_bytes_to_(size,length))
2700 #define __inout_ecount_full(size) _SAL1_Source_(__inout_ecount_full, (size), _Inout_updates_all_(size))
2701 #define __inout_bcount_full(size) _SAL1_Source_(__inout_bcount_full, (size), _Inout_updates_bytes_all_(size))
2702 #define __inout_z _SAL1_Source_(__inout_z, (), _Inout_z_)
2703 #define __inout_ecount_z(size) _SAL1_Source_(__inout_ecount_z, (size), _Inout_updates_z_(size))
2704 #define __inout_bcount_z(size) _SAL1_Source_(__inout_bcount_z, (size), __inout_bcount(size) __pre __nullterminated __post __nullterminated)
2705 #define __inout_nz _SAL1_Source_(__inout_nz, (), __inout)
2706 #define __inout_ecount_nz(size) _SAL1_Source_(__inout_ecount_nz, (size), __inout_ecount(size))
2707 #define __inout_bcount_nz(size) _SAL1_Source_(__inout_bcount_nz, (size), __inout_bcount(size))
2708 #define __ecount_opt(size) _SAL1_Source_(__ecount_opt, (size), __ecount(size) __pre_except_maybenull)
2709 #define __bcount_opt(size) _SAL1_Source_(__bcount_opt, (size), __bcount(size) __pre_except_maybenull)
2710 #define __in_opt _SAL1_Source_(__in_opt, (), _In_opt_)
2711 #define __in_ecount_opt(size) _SAL1_Source_(__in_ecount_opt, (size), _In_reads_opt_(size))
2712 #define __in_bcount_opt(size) _SAL1_Source_(__in_bcount_opt, (size), _In_reads_bytes_opt_(size))
2713 #define __in_z_opt _SAL1_Source_(__in_z_opt, (), _In_opt_z_)
2714 #define __in_ecount_z_opt(size) _SAL1_Source_(__in_ecount_z_opt, (size), __in_ecount_opt(size) __pre __nullterminated)
2715 #define __in_bcount_z_opt(size) _SAL1_Source_(__in_bcount_z_opt, (size), __in_bcount_opt(size) __pre __nullterminated)
2716 #define __in_nz_opt _SAL1_Source_(__in_nz_opt, (), __in_opt)
2717 #define __in_ecount_nz_opt(size) _SAL1_Source_(__in_ecount_nz_opt, (size), __in_ecount_opt(size))
2718 #define __in_bcount_nz_opt(size) _SAL1_Source_(__in_bcount_nz_opt, (size), __in_bcount_opt(size))
2719 #define __out_opt _SAL1_Source_(__out_opt, (), _Out_opt_)
2720 #define __out_ecount_opt(size) _SAL1_Source_(__out_ecount_opt, (size), _Out_writes_opt_(size))
2721 #define __out_bcount_opt(size) _SAL1_Source_(__out_bcount_opt, (size), _Out_writes_bytes_opt_(size))
2722 #define __out_ecount_part_opt(size,length) _SAL1_Source_(__out_ecount_part_opt, (size,length), __out_ecount_part(size,length) __pre_except_maybenull)
2723 #define __out_bcount_part_opt(size,length) _SAL1_Source_(__out_bcount_part_opt, (size,length), __out_bcount_part(size,length) __pre_except_maybenull)
2724 #define __out_ecount_full_opt(size) _SAL1_Source_(__out_ecount_full_opt, (size), __out_ecount_full(size) __pre_except_maybenull)
2725 #define __out_bcount_full_opt(size) _SAL1_Source_(__out_bcount_full_opt, (size), __out_bcount_full(size) __pre_except_maybenull)
2726 #define __out_ecount_z_opt(size) _SAL1_Source_(__out_ecount_z_opt, (size), __out_ecount_opt(size) __post __nullterminated)
2727 #define __out_bcount_z_opt(size) _SAL1_Source_(__out_bcount_z_opt, (size), __out_bcount_opt(size) __post __nullterminated)
2728 #define __out_ecount_part_z_opt(size,length) _SAL1_Source_(__out_ecount_part_z_opt, (size,length), __out_ecount_part_opt(size,length) __post __nullterminated)
2729 #define __out_bcount_part_z_opt(size,length) _SAL1_Source_(__out_bcount_part_z_opt, (size,length), __out_bcount_part_opt(size,length) __post __nullterminated)
2730 #define __out_ecount_full_z_opt(size) _SAL1_Source_(__out_ecount_full_z_opt, (size), __out_ecount_full_opt(size) __post __nullterminated)
2731 #define __out_bcount_full_z_opt(size) _SAL1_Source_(__out_bcount_full_z_opt, (size), __out_bcount_full_opt(size) __post __nullterminated)
2732 #define __out_ecount_nz_opt(size) _SAL1_Source_(__out_ecount_nz_opt, (size), __out_ecount_opt(size) __post __nullterminated)
2733 #define __out_bcount_nz_opt(size) _SAL1_Source_(__out_bcount_nz_opt, (size), __out_bcount_opt(size) __post __nullterminated)
2734 #define __inout_opt _SAL1_Source_(__inout_opt, (), _Inout_opt_)
2735 #define __inout_ecount_opt(size) _SAL1_Source_(__inout_ecount_opt, (size), __inout_ecount(size) __pre_except_maybenull)
2736 #define __inout_bcount_opt(size) _SAL1_Source_(__inout_bcount_opt, (size), __inout_bcount(size) __pre_except_maybenull)
2737 #define __inout_ecount_part_opt(size,length) _SAL1_Source_(__inout_ecount_part_opt, (size,length), __inout_ecount_part(size,length) __pre_except_maybenull)
2738 #define __inout_bcount_part_opt(size,length) _SAL1_Source_(__inout_bcount_part_opt, (size,length), __inout_bcount_part(size,length) __pre_except_maybenull)
2739 #define __inout_ecount_full_opt(size) _SAL1_Source_(__inout_ecount_full_opt, (size), __inout_ecount_full(size) __pre_except_maybenull)
2740 #define __inout_bcount_full_opt(size) _SAL1_Source_(__inout_bcount_full_opt, (size), __inout_bcount_full(size) __pre_except_maybenull)
2741 #define __inout_z_opt _SAL1_Source_(__inout_z_opt, (), __inout_opt __pre __nullterminated __post __nullterminated)
2742 #define __inout_ecount_z_opt(size) _SAL1_Source_(__inout_ecount_z_opt, (size), __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated)
2743 #define __inout_ecount_z_opt(size) _SAL1_Source_(__inout_ecount_z_opt, (size), __inout_ecount_opt(size) __pre __nullterminated __post __nullterminated)
2744 #define __inout_bcount_z_opt(size) _SAL1_Source_(__inout_bcount_z_opt, (size), __inout_bcount_opt(size))
2745 #define __inout_nz_opt _SAL1_Source_(__inout_nz_opt, (), __inout_opt)
2746 #define __inout_ecount_nz_opt(size) _SAL1_Source_(__inout_ecount_nz_opt, (size), __inout_ecount_opt(size))
2747 #define __inout_bcount_nz_opt(size) _SAL1_Source_(__inout_bcount_nz_opt, (size), __inout_bcount_opt(size))
2748 #define __deref_ecount(size) _SAL1_Source_(__deref_ecount, (size), _Notref_ __ecount(1) __post _Notref_ __elem_readableTo(1) __post _Notref_ __deref _Notref_ __notnull __post __deref __elem_writableTo(size))
2749 #define __deref_bcount(size) _SAL1_Source_(__deref_bcount, (size), _Notref_ __ecount(1) __post _Notref_ __elem_readableTo(1) __post _Notref_ __deref _Notref_ __notnull __post __deref __byte_writableTo(size))
2750 #define __deref_out _SAL1_Source_(__deref_out, (), _Outptr_)
2751 #define __deref_out_ecount(size) _SAL1_Source_(__deref_out_ecount, (size), _Outptr_result_buffer_(size))
2752 #define __deref_out_bcount(size) _SAL1_Source_(__deref_out_bcount, (size), _Outptr_result_bytebuffer_(size))
2753 #define __deref_out_ecount_part(size,length) _SAL1_Source_(__deref_out_ecount_part, (size,length), _Outptr_result_buffer_to_(size,length))
2754 #define __deref_out_bcount_part(size,length) _SAL1_Source_(__deref_out_bcount_part, (size,length), _Outptr_result_bytebuffer_to_(size,length))
2755 #define __deref_out_ecount_full(size) _SAL1_Source_(__deref_out_ecount_full, (size), __deref_out_ecount_part(size,size))
2756 #define __deref_out_bcount_full(size) _SAL1_Source_(__deref_out_bcount_full, (size), __deref_out_bcount_part(size,size))
2757 #define __deref_out_z _SAL1_Source_(__deref_out_z, (), _Outptr_result_z_)
2758 #define __deref_out_ecount_z(size) _SAL1_Source_(__deref_out_ecount_z, (size), __deref_out_ecount(size) __post __deref __nullterminated)
2759 #define __deref_out_bcount_z(size) _SAL1_Source_(__deref_out_bcount_z, (size), __deref_out_bcount(size) __post __deref __nullterminated)
2760 #define __deref_out_nz _SAL1_Source_(__deref_out_nz, (), __deref_out)
2761 #define __deref_out_ecount_nz(size) _SAL1_Source_(__deref_out_ecount_nz, (size), __deref_out_ecount(size))
2762 #define __deref_out_bcount_nz(size) _SAL1_Source_(__deref_out_bcount_nz, (size), __deref_out_ecount(size))
2763 #define __deref_inout _SAL1_Source_(__deref_inout, (), _Notref_ __notnull _Notref_ __elem_readableTo(1) __pre __deref __valid __post _Notref_ __deref __valid __refparam)
2764 #define __deref_inout_z _SAL1_Source_(__deref_inout_z, (), __deref_inout __pre __deref __nullterminated __post _Notref_ __deref __nullterminated)
2765 #define __deref_inout_ecount(size) _SAL1_Source_(__deref_inout_ecount, (size), __deref_inout __pre __deref __elem_writableTo(size) __post _Notref_ __deref __elem_writableTo(size))
2766 #define __deref_inout_bcount(size) _SAL1_Source_(__deref_inout_bcount, (size), __deref_inout __pre __deref __byte_writableTo(size) __post _Notref_ __deref __byte_writableTo(size))
2767 #define __deref_inout_ecount_part(size,length) _SAL1_Source_(__deref_inout_ecount_part, (size,length), __deref_inout_ecount(size) __pre __deref __elem_readableTo(length) __post __deref __elem_readableTo(length))
2768 #define __deref_inout_bcount_part(size,length) _SAL1_Source_(__deref_inout_bcount_part, (size,length), __deref_inout_bcount(size) __pre __deref __byte_readableTo(length) __post __deref __byte_readableTo(length))
2769 #define __deref_inout_ecount_full(size) _SAL1_Source_(__deref_inout_ecount_full, (size), __deref_inout_ecount_part(size,size))
2770 #define __deref_inout_bcount_full(size) _SAL1_Source_(__deref_inout_bcount_full, (size), __deref_inout_bcount_part(size,size))
2771 #define __deref_inout_ecount_z(size) _SAL1_Source_(__deref_inout_ecount_z, (size), __deref_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated)
2772 #define __deref_inout_bcount_z(size) _SAL1_Source_(__deref_inout_bcount_z, (size), __deref_inout_bcount(size) __pre __deref __nullterminated __post __deref __nullterminated)
2773 #define __deref_inout_nz _SAL1_Source_(__deref_inout_nz, (), __deref_inout)
2774 #define __deref_inout_ecount_nz(size) _SAL1_Source_(__deref_inout_ecount_nz, (size), __deref_inout_ecount(size))
2775 #define __deref_inout_bcount_nz(size) _SAL1_Source_(__deref_inout_bcount_nz, (size), __deref_inout_ecount(size))
2776 #define __deref_ecount_opt(size) _SAL1_Source_(__deref_ecount_opt, (size), __deref_ecount(size) __post_deref_except_maybenull)
2777 #define __deref_bcount_opt(size) _SAL1_Source_(__deref_bcount_opt, (size), __deref_bcount(size) __post_deref_except_maybenull)
2778 #define __deref_out_opt _SAL1_Source_(__deref_out_opt, (), __deref_out __post_deref_except_maybenull)
2779 #define __deref_out_ecount_opt(size) _SAL1_Source_(__deref_out_ecount_opt, (size), __deref_out_ecount(size) __post_deref_except_maybenull)
2780 #define __deref_out_bcount_opt(size) _SAL1_Source_(__deref_out_bcount_opt, (size), __deref_out_bcount(size) __post_deref_except_maybenull)
2781 #define __deref_out_ecount_part_opt(size,length) _SAL1_Source_(__deref_out_ecount_part_opt, (size,length), __deref_out_ecount_part(size,length) __post_deref_except_maybenull)
2782 #define __deref_out_bcount_part_opt(size,length) _SAL1_Source_(__deref_out_bcount_part_opt, (size,length), __deref_out_bcount_part(size,length) __post_deref_except_maybenull)
2783 #define __deref_out_ecount_full_opt(size) _SAL1_Source_(__deref_out_ecount_full_opt, (size), __deref_out_ecount_full(size) __post_deref_except_maybenull)
2784 #define __deref_out_bcount_full_opt(size) _SAL1_Source_(__deref_out_bcount_full_opt, (size), __deref_out_bcount_full(size) __post_deref_except_maybenull)
2785 #define __deref_out_z_opt _SAL1_Source_(__deref_out_z_opt, (), _Outptr_result_maybenull_z_)
2786 #define __deref_out_ecount_z_opt(size) _SAL1_Source_(__deref_out_ecount_z_opt, (size), __deref_out_ecount_opt(size) __post __deref __nullterminated)
2787 #define __deref_out_bcount_z_opt(size) _SAL1_Source_(__deref_out_bcount_z_opt, (size), __deref_out_bcount_opt(size) __post __deref __nullterminated)
2788 #define __deref_out_nz_opt _SAL1_Source_(__deref_out_nz_opt, (), __deref_out_opt)
2789 #define __deref_out_ecount_nz_opt(size) _SAL1_Source_(__deref_out_ecount_nz_opt, (size), __deref_out_ecount_opt(size))
2790 #define __deref_out_bcount_nz_opt(size) _SAL1_Source_(__deref_out_bcount_nz_opt, (size), __deref_out_bcount_opt(size))
2791 #define __deref_inout_opt _SAL1_Source_(__deref_inout_opt, (), __deref_inout __pre_deref_except_maybenull __post_deref_except_maybenull)
2792 #define __deref_inout_ecount_opt(size) _SAL1_Source_(__deref_inout_ecount_opt, (size), __deref_inout_ecount(size) __pre_deref_except_maybenull __post_deref_except_maybenull)
2793 #define __deref_inout_bcount_opt(size) _SAL1_Source_(__deref_inout_bcount_opt, (size), __deref_inout_bcount(size) __pre_deref_except_maybenull __post_deref_except_maybenull)
2794 #define __deref_inout_ecount_part_opt(size,length) _SAL1_Source_(__deref_inout_ecount_part_opt, (size,length), __deref_inout_ecount_part(size,length) __pre_deref_except_maybenull __post_deref_except_maybenull)
2795 #define __deref_inout_bcount_part_opt(size,length) _SAL1_Source_(__deref_inout_bcount_part_opt, (size,length), __deref_inout_bcount_part(size,length) __pre_deref_except_maybenull __post_deref_except_maybenull)
2796 #define __deref_inout_ecount_full_opt(size) _SAL1_Source_(__deref_inout_ecount_full_opt, (size), __deref_inout_ecount_full(size) __pre_deref_except_maybenull __post_deref_except_maybenull)
2797 #define __deref_inout_bcount_full_opt(size) _SAL1_Source_(__deref_inout_bcount_full_opt, (size), __deref_inout_bcount_full(size) __pre_deref_except_maybenull __post_deref_except_maybenull)
2798 #define __deref_inout_z_opt _SAL1_Source_(__deref_inout_z_opt, (), __deref_inout_opt __pre __deref __nullterminated __post __deref __nullterminated)
2799 #define __deref_inout_ecount_z_opt(size) _SAL1_Source_(__deref_inout_ecount_z_opt, (size), __deref_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated)
2800 #define __deref_inout_bcount_z_opt(size) _SAL1_Source_(__deref_inout_bcount_z_opt, (size), __deref_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated)
2801 #define __deref_inout_nz_opt _SAL1_Source_(__deref_inout_nz_opt, (), __deref_inout_opt)
2802 #define __deref_inout_ecount_nz_opt(size) _SAL1_Source_(__deref_inout_ecount_nz_opt, (size), __deref_inout_ecount_opt(size))
2803 #define __deref_inout_bcount_nz_opt(size) _SAL1_Source_(__deref_inout_bcount_nz_opt, (size), __deref_inout_bcount_opt(size))
2804 #define __deref_opt_ecount(size) _SAL1_Source_(__deref_opt_ecount, (size), __deref_ecount(size) __pre_except_maybenull)
2805 #define __deref_opt_bcount(size) _SAL1_Source_(__deref_opt_bcount, (size), __deref_bcount(size) __pre_except_maybenull)
2806 #define __deref_opt_out _SAL1_Source_(__deref_opt_out, (), _Outptr_opt_)
2807 #define __deref_opt_out_z _SAL1_Source_(__deref_opt_out_z, (), _Outptr_opt_result_z_)
2808 #define __deref_opt_out_ecount(size) _SAL1_Source_(__deref_opt_out_ecount, (size), __deref_out_ecount(size) __pre_except_maybenull)
2809 #define __deref_opt_out_bcount(size) _SAL1_Source_(__deref_opt_out_bcount, (size), __deref_out_bcount(size) __pre_except_maybenull)
2810 #define __deref_opt_out_ecount_part(size,length) _SAL1_Source_(__deref_opt_out_ecount_part, (size,length), __deref_out_ecount_part(size,length) __pre_except_maybenull)
2811 #define __deref_opt_out_bcount_part(size,length) _SAL1_Source_(__deref_opt_out_bcount_part, (size,length), __deref_out_bcount_part(size,length) __pre_except_maybenull)
2812 #define __deref_opt_out_ecount_full(size) _SAL1_Source_(__deref_opt_out_ecount_full, (size), __deref_out_ecount_full(size) __pre_except_maybenull)
2813 #define __deref_opt_out_bcount_full(size) _SAL1_Source_(__deref_opt_out_bcount_full, (size), __deref_out_bcount_full(size) __pre_except_maybenull)
2814 #define __deref_opt_inout _SAL1_Source_(__deref_opt_inout, (), _Inout_opt_)
2815 #define __deref_opt_inout_ecount(size) _SAL1_Source_(__deref_opt_inout_ecount, (size), __deref_inout_ecount(size) __pre_except_maybenull)
2816 #define __deref_opt_inout_bcount(size) _SAL1_Source_(__deref_opt_inout_bcount, (size), __deref_inout_bcount(size) __pre_except_maybenull)
2817 #define __deref_opt_inout_ecount_part(size,length) _SAL1_Source_(__deref_opt_inout_ecount_part, (size,length), __deref_inout_ecount_part(size,length) __pre_except_maybenull)
2818 #define __deref_opt_inout_bcount_part(size,length) _SAL1_Source_(__deref_opt_inout_bcount_part, (size,length), __deref_inout_bcount_part(size,length) __pre_except_maybenull)
2819 #define __deref_opt_inout_ecount_full(size) _SAL1_Source_(__deref_opt_inout_ecount_full, (size), __deref_inout_ecount_full(size) __pre_except_maybenull)
2820 #define __deref_opt_inout_bcount_full(size) _SAL1_Source_(__deref_opt_inout_bcount_full, (size), __deref_inout_bcount_full(size) __pre_except_maybenull)
2821 #define __deref_opt_inout_z _SAL1_Source_(__deref_opt_inout_z, (), __deref_opt_inout __pre __deref __nullterminated __post __deref __nullterminated)
2822 #define __deref_opt_inout_ecount_z(size) _SAL1_Source_(__deref_opt_inout_ecount_z, (size), __deref_opt_inout_ecount(size) __pre __deref __nullterminated __post __deref __nullterminated)
2823 #define __deref_opt_inout_bcount_z(size) _SAL1_Source_(__deref_opt_inout_bcount_z, (size), __deref_opt_inout_bcount(size) __pre __deref __nullterminated __post __deref __nullterminated)
2824 #define __deref_opt_inout_nz _SAL1_Source_(__deref_opt_inout_nz, (), __deref_opt_inout)
2825 #define __deref_opt_inout_ecount_nz(size) _SAL1_Source_(__deref_opt_inout_ecount_nz, (size), __deref_opt_inout_ecount(size))
2826 #define __deref_opt_inout_bcount_nz(size) _SAL1_Source_(__deref_opt_inout_bcount_nz, (size), __deref_opt_inout_bcount(size))
2827 #define __deref_opt_ecount_opt(size) _SAL1_Source_(__deref_opt_ecount_opt, (size), __deref_ecount_opt(size) __pre_except_maybenull)
2828 #define __deref_opt_bcount_opt(size) _SAL1_Source_(__deref_opt_bcount_opt, (size), __deref_bcount_opt(size) __pre_except_maybenull)
2829 #define __deref_opt_out_opt _SAL1_Source_(__deref_opt_out_opt, (), _Outptr_opt_result_maybenull_)
2830 #define __deref_opt_out_ecount_opt(size) _SAL1_Source_(__deref_opt_out_ecount_opt, (size), __deref_out_ecount_opt(size) __pre_except_maybenull)
2831 #define __deref_opt_out_bcount_opt(size) _SAL1_Source_(__deref_opt_out_bcount_opt, (size), __deref_out_bcount_opt(size) __pre_except_maybenull)
2832 #define __deref_opt_out_ecount_part_opt(size,length) _SAL1_Source_(__deref_opt_out_ecount_part_opt, (size,length), __deref_out_ecount_part_opt(size,length) __pre_except_maybenull)
2833 #define __deref_opt_out_bcount_part_opt(size,length) _SAL1_Source_(__deref_opt_out_bcount_part_opt, (size,length), __deref_out_bcount_part_opt(size,length) __pre_except_maybenull)
2834 #define __deref_opt_out_ecount_full_opt(size) _SAL1_Source_(__deref_opt_out_ecount_full_opt, (size), __deref_out_ecount_full_opt(size) __pre_except_maybenull)
2835 #define __deref_opt_out_bcount_full_opt(size) _SAL1_Source_(__deref_opt_out_bcount_full_opt, (size), __deref_out_bcount_full_opt(size) __pre_except_maybenull)
2836 #define __deref_opt_out_z_opt _SAL1_Source_(__deref_opt_out_z_opt, (), __post __deref __valid __refparam __pre_except_maybenull __pre_deref_except_maybenull __post_deref_except_maybenull __post __deref __nullterminated)
2837 #define __deref_opt_out_ecount_z_opt(size) _SAL1_Source_(__deref_opt_out_ecount_z_opt, (size), __deref_opt_out_ecount_opt(size) __post __deref __nullterminated)
2838 #define __deref_opt_out_bcount_z_opt(size) _SAL1_Source_(__deref_opt_out_bcount_z_opt, (size), __deref_opt_out_bcount_opt(size) __post __deref __nullterminated)
2839 #define __deref_opt_out_nz_opt _SAL1_Source_(__deref_opt_out_nz_opt, (), __deref_opt_out_opt)
2840 #define __deref_opt_out_ecount_nz_opt(size) _SAL1_Source_(__deref_opt_out_ecount_nz_opt, (size), __deref_opt_out_ecount_opt(size))
2841 #define __deref_opt_out_bcount_nz_opt(size) _SAL1_Source_(__deref_opt_out_bcount_nz_opt, (size), __deref_opt_out_bcount_opt(size))
2842 #define __deref_opt_inout_opt _SAL1_Source_(__deref_opt_inout_opt, (), __deref_inout_opt __pre_except_maybenull)
2843 #define __deref_opt_inout_ecount_opt(size) _SAL1_Source_(__deref_opt_inout_ecount_opt, (size), __deref_inout_ecount_opt(size) __pre_except_maybenull)
2844 #define __deref_opt_inout_bcount_opt(size) _SAL1_Source_(__deref_opt_inout_bcount_opt, (size), __deref_inout_bcount_opt(size) __pre_except_maybenull)
2845 #define __deref_opt_inout_ecount_part_opt(size,length) _SAL1_Source_(__deref_opt_inout_ecount_part_opt, (size,length), __deref_inout_ecount_part_opt(size,length) __pre_except_maybenull)
2846 #define __deref_opt_inout_bcount_part_opt(size,length) _SAL1_Source_(__deref_opt_inout_bcount_part_opt, (size,length), __deref_inout_bcount_part_opt(size,length) __pre_except_maybenull)
2847 #define __deref_opt_inout_ecount_full_opt(size) _SAL1_Source_(__deref_opt_inout_ecount_full_opt, (size), __deref_inout_ecount_full_opt(size) __pre_except_maybenull)
2848 #define __deref_opt_inout_bcount_full_opt(size) _SAL1_Source_(__deref_opt_inout_bcount_full_opt, (size), __deref_inout_bcount_full_opt(size) __pre_except_maybenull)
2849 #define __deref_opt_inout_z_opt _SAL1_Source_(__deref_opt_inout_z_opt, (), __deref_opt_inout_opt __pre __deref __nullterminated __post __deref __nullterminated)
2850 #define __deref_opt_inout_ecount_z_opt(size) _SAL1_Source_(__deref_opt_inout_ecount_z_opt, (size), __deref_opt_inout_ecount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated)
2851 #define __deref_opt_inout_bcount_z_opt(size) _SAL1_Source_(__deref_opt_inout_bcount_z_opt, (size), __deref_opt_inout_bcount_opt(size) __pre __deref __nullterminated __post __deref __nullterminated)
2852 #define __deref_opt_inout_nz_opt _SAL1_Source_(__deref_opt_inout_nz_opt, (), __deref_opt_inout_opt)
2853 #define __deref_opt_inout_ecount_nz_opt(size) _SAL1_Source_(__deref_opt_inout_ecount_nz_opt, (size), __deref_opt_inout_ecount_opt(size))
2854 #define __deref_opt_inout_bcount_nz_opt(size) _SAL1_Source_(__deref_opt_inout_bcount_nz_opt, (size), __deref_opt_inout_bcount_opt(size))
2855 
2856 /*
2857 -------------------------------------------------------------------------------
2858 Advanced Annotation Definitions
2859 
2860 Any of these may be used to directly annotate functions, and may be used in
2861 combination with each other or with regular buffer macros. For an explanation
2862 of each annotation, see the advanced annotations section.
2863 -------------------------------------------------------------------------------
2864 */
2865 
2866 #define __success(expr) _SAL1_1_Source_(__success, (expr), _Success_(expr))
2867 #define __nullterminated _SAL1_Source_(__nullterminated, (), _Null_terminated_)
2868 #define __nullnullterminated _SAL1_Source_(__nullnulltermiated, (), _SAL_nop_impl_)
2869 #define __reserved _SAL1_Source_(__reserved, (), _Reserved_)
2870 #define __checkReturn _SAL1_Source_(__checkReturn, (), _Check_return_)
2871 #define __typefix(ctype) _SAL1_Source_(__typefix, (ctype), __inner_typefix(ctype))
2872 #define __override __inner_override
2873 #define __callback __inner_callback
2874 #define __format_string _SAL1_1_Source_(__format_string, (), _Printf_format_string_)
2875 #define __blocksOn(resource) _SAL_L_Source_(__blocksOn, (resource), __inner_blocksOn(resource))
2876 #define __control_entrypoint(category) _SAL_L_Source_(__control_entrypoint, (category), __inner_control_entrypoint(category))
2877 #define __data_entrypoint(category) _SAL_L_Source_(__data_entrypoint, (category), __inner_data_entrypoint(category))
2878 
2879 #ifdef _USING_V110_SDK71_ // [
2880 #ifndef _PREFAST_ // [
2881 #define __useHeader
2882 #else // ][
2883 #error Code analysis is not supported when using Visual C++ 11.0/12.0 with the Windows 7.1 SDK.
2884 #endif // ]
2885 #else // ][
2886 #define __useHeader _Use_decl_anno_impl_
2887 #endif // ]
2888 
2889 #ifdef _USING_V110_SDK71_ // [
2890 #ifndef _PREFAST_ // [
2891 #define __on_failure(annotes)
2892 #else // ][
2893 #error Code analysis is not supported when using Visual C++ 11.0/12.0 with the Windows 7.1 SDK.
2894 #endif // ]
2895 #else // ][
2896 #define __on_failure(annotes) _SAL1_1_Source_(__on_failure, (annotes), _On_failure_impl_(annotes _SAL_nop_impl_))
2897 #endif // ]
2898 
2899 #ifndef __fallthrough // [
2901  #define __fallthrough __inner_fallthrough
2902 #endif // ]
2903 
2904 #ifndef __analysis_assume // [
2905 #ifdef _PREFAST_ // [
2906 #define __analysis_assume(expr) __assume(expr)
2907 #else // ][
2908 #define __analysis_assume(expr)
2909 #endif // ]
2910 #endif // ]
2911 
2912 #ifndef _Analysis_assume_ // [
2913 #ifdef _PREFAST_ // [
2914 #define _Analysis_assume_(expr) __assume(expr)
2915 #else // ][
2916 #define _Analysis_assume_(expr)
2917 #endif // ]
2918 #endif // ]
2919 
2920 #define _Analysis_noreturn_ _SAL2_Source_(_Analysis_noreturn_, (), _SA_annotes0(SAL_terminates))
2921 
2922 #ifdef _PREFAST_ // [
2923 __inline __nothrow
2924 void __AnalysisAssumeNullterminated(_Post_ _Null_terminated_ void *p);
2925 
2926 #define _Analysis_assume_nullterminated_(x) __AnalysisAssumeNullterminated(x)
2927 
2928 #else // ][
2929 #define _Analysis_assume_nullterminated_(x)
2930 #endif // ]
2931 
2932 //
2933 // Set the analysis mode (global flags to analysis).
2934 // They take effect at the point of declaration; use at global scope
2935 // as a declaration.
2936 //
2937 
2938 // Synthesize a unique symbol.
2939 #define ___MKID(x, y) x ## y
2940 #define __MKID(x, y) ___MKID(x, y)
2941 #define __GENSYM(x) __MKID(x, __COUNTER__)
2942 
2943 __ANNOTATION(SAL_analysisMode(__AuToQuOtE __In_impl_ char *mode);)
2944 
2945 #define _Analysis_mode_impl_(mode) _SAL2_Source_(_Analysis_mode_impl_, (mode), _SA_annotes1(SAL_analysisMode, #mode))
2946 
2947 //
2948 // Floating point warnings are only meaningful in kernel-mode on x86
2949 // so avoid reporting them on other platforms.
2950 //
2951 #ifndef _M_IX86 // [
2952 
2953 #define _Analysis_mode_(mode) \
2954  __pragma(warning(disable: 28110 28111 28161 28162)) \
2955  typedef _Analysis_mode_impl_(mode) int \
2956  __GENSYM(__prefast_analysis_mode_flag);
2957 
2958 #else // ][
2959 
2960 #define _Analysis_mode_(mode) \
2961  typedef _Analysis_mode_impl_(mode) int \
2962  __GENSYM(__prefast_analysis_mode_flag);
2963 
2964 #endif // ]
2965 
2966 // The following are predefined:
2967 // _Analysis_operator_new_throw_ (operator new throws)
2968 // _Analysis_operator_new_null_ (operator new returns null)
2969 // _Analysis_operator_new_never_fails_ (operator new never fails)
2970 //
2971 
2972 // Function class annotations.
2973 __ANNOTATION(SAL_functionClassNew(__In_impl_ char*);)
2974 __PRIMOP(int, _In_function_class_(__In_impl_ char*);)
2976 #define _Called_from_function_class_(x) _In_function_class_(x)
2977 
2978 #define _Function_class_(x) _SAL2_Source_(_Function_class_, (x), _SA_annotes1(SAL_functionClassNew, _SA_SPECSTRIZE(x)))
2979 
2980 #define _Enum_is_bitflag_ _SAL2_Source_(_Enum_is_bitflag_, (), _SA_annotes0(SAL_enumIsBitflag))
2981 #define _Strict_type_match_ _SAL2_Source_(_Strict_type_match, (), _SA_annotes0(SAL_strictType2))
2982 
2983 #define _Maybe_raises_SEH_exception_ _SAL2_Source_(_Maybe_raises_SEH_exception_, (x), _Pre_ _SA_annotes1(SAL_inTry,__yes))
2984 #define _Raises_SEH_exception_ _SAL2_Source_(_Raises_SEH_exception_, (x), _Maybe_raises_SEH_exception_ _Analysis_noreturn_)
2985 
2986 #ifdef __cplusplus // [
2987 }
2988 #endif // ]
2989 
2990 #include <ConcurrencySal.h>
2991 
#define _Analysis_mode_impl_(mode)
Definition: sal.h:2945
#define __PRIMOP(type, fun)
Definition: sal.h:1629
#define _In_function_class_(x)
Definition: sal.h:2975
#define _SA_annotes1(n, pp1)
Definition: sal.h:1624
#define __inner_fallthrough_dec
Definition: sal.h:2639
#define __nothrow
Definition: sal.h:2384
#define __ANNOTATION(fun)
Definition: sal.h:1628
#define _Null_terminated_
Definition: sal.h:646
#define __QUALIFIER(type, fun)
Definition: sal.h:1630
#define _SAL2_Source_(Name, args, annotes)
Definition: sal.h:231
#define _Post_
Definition: sal.h:626