From 6df852ceb87fd30051948bad51332252327d873c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 6 Jan 2012 17:02:57 +0000 Subject: [PATCH] [SAL.h] Add definitions for declspec based sal svn path=/trunk/; revision=54851 --- reactos/include/psdk/sal.h | 97 +++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 7 deletions(-) diff --git a/reactos/include/psdk/sal.h b/reactos/include/psdk/sal.h index f74f733a269..9a181804726 100644 --- a/reactos/include/psdk/sal.h +++ b/reactos/include/psdk/sal.h @@ -31,7 +31,7 @@ #ifdef _PREFAST_ #ifndef _USE_DECLSPECS_FOR_SAL -#define _USE_DECLSPECS_FOR_SAL 0 +#define _USE_DECLSPECS_FOR_SAL 1 #endif #if !defined(_USE_ATTRIBUTES_FOR_SAL) || _USE_DECLSPECS_FOR_SAL @@ -192,6 +192,8 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define __count_c_impl(size) ValidElementsConst=size #define __count_impl(size) ValidElements=NL_(size) #define __count_x_impl(size) ValidElements="\n@"#size +#define __inner_exceptthat [SAL_except] +#define __inner_typefix(ctype) [SAL_typefix(p1=_SA_SPECSTRIZE(ctype))] #define __maybenull_impl Null=SA_Maybe #define __maybenull_impl_notref Null=SA_Maybe,Notref=1 #define __maybevalid_impl Valid=SA_Maybe @@ -210,9 +212,6 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define __writeaccess_impl Access=SA_Write #define __writeaccess_impl_notref Access=SA_Write,Notref=1 #define __zterm_impl NullTerminated=SA_Yes - -#define __inner_exceptthat [SAL_except] -#define __inner_typefix(ctype) [SAL_typefix(p1=_SA_SPECSTRIZE(ctype))] #define _Check_return_impl_ [returnvalue:SA_Post(MustCheck=SA_Yes)] #define _Deref_in_bound_impl_ [SA_PreBound(Deref=1)] #define _Deref_in_range_impl_(min,max) [SA_PreRange(Deref=1,MinVal=#min,MaxVal=#max)] @@ -234,6 +233,7 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define _Deref2_ret1_impl_(p1) [returnvalue:SA_Post(Deref=2,Notref=1,p1)] #define _In_bound_impl_ [SA_PreBound(Deref=0)] #define _In_range_impl_(min,max) [SA_PreRange(MinVal=#min,MaxVal=#max)] +#define _Notref_impl_ _SA_annotes0(SAL_notref) #define _Out_bound_impl_ [SA_PostBound(Deref=0)] #define _Out_range_impl_(min,max) [SA_PostRange(MinVal=#min,MaxVal=#max)] #define _Post1_impl_(p1) [SA_Post(p1)] @@ -258,10 +258,94 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #else /* #if _USE_DECLSPECS_FOR_SAL */ -#error unimplemented +#define __bytecap_c_impl(size) _SA_annotes1(SAL_writableTo,byteCount(size)) +#define __bytecap_impl(size) _SA_annotes1(SAL_writableTo,byteCount(size)) +#define __bytecap_x_impl(size) _SA_annotes1(SAL_writableTo,inexpressibleCount(#size)) +#define __bytecount_c_impl(size) _SA_annotes1(SAL_readableTo,byteCount(size)) +#define __bytecount_impl(size) _SA_annotes1(SAL_readableTo,byteCount(size)) +#define __bytecount_x_impl(size) _SA_annotes1(SAL_readableTo,inexpressibleCount(#size)) +#define __cap_c_impl(size) _SA_annotes1(SAL_writableTo,elementCount(size)) +#define __cap_c_one_notref_impl _Notref_ _SA_annotes1(SAL_writableTo,elementCount(1)) +#define __cap_for_impl(param) _SA_annotes1(SAL_writableTo,inexpressibleCount(sizeof(param))) +#define __cap_impl(size) _SA_annotes1(SAL_writableTo,elementCount(size)) +#define __cap_x_impl(size) _SA_annotes1(SAL_writableTo,inexpressibleCount(#size)) +#define __count_c_impl(size) _SA_annotes1(SAL_readableTo,elementCount(size)) +#define __count_impl(size) _SA_annotes1(SAL_readableTo,elementCount(size)) +#define __count_x_impl(size) _SA_annotes1(SAL_readableTo,inexpressibleCount(#size)) +#define __inner_exceptthat _SA_annotes0(SAL_except) +#define __inner_typefix(ctype) _SA_annotes1(SAL_typefix, ctype) +#define __maybenull_impl _SA_annotes0(SAL_maybenull) +#define __maybenull_impl_notref _Notref_ _Maybenull_impl_ +#define __maybevalid_impl _SA_annotes0(SAL_maybevalid) // _SA_annotes1(SAL_valid, __maybe) +#define __maybezterm_impl _SA_annotes1(SAL_nullTerminated, __maybe) +#define __maybzterm_impl _SA_annotes1(SAL_nullTerminated, __maybe) +#define __mult_impl(mult,size) _SA_annotes1(SAL_writableTo,(mult)*(size)) +#define __notnull_impl _SA_annotes0(SAL_notnull) // _SA_annotes1(SAL_null, __no) +#define __notnull_impl_notref _Notref_ _Notnull_impl_ +#define __notvalid_impl _SA_annotes0(SAL_notvalid) // _SA_annotes1(SAL_valid, __no) +#define __null_impl _SA_annotes0(SAL_null) // _SA_annotes1(SAL_null, __yes) +#define __null_impl_notref _Notref_ _Null_impl_ +#define __notzterm_impl _SA_annotes1(SAL_nullTerminated, __no) +#define __readaccess_impl _SA_annotes0(SAL_readonly) //_SA_annotes1(SAL_access, 0x1) +#define __readaccess_impl_notref _Notref_ _SA_annotes0(SAL_readonly) //_SA_annotes1(SAL_access, 0x1) +#define __valid_impl _SA_annotes0(SAL_valid) // _SA_annotes1(SAL_valid, __yes) +#define __writeaccess_impl _SA_annotes0(SAL_notreadonly) // _SA_annotes1(SAL_access, 0x2) +#define __writeaccess_impl_notref _Notref_ _SA_annotes0(SAL_notreadonly) // _SA_annotes1(SAL_access, 0x2) +#define __zterm_impl _SA_annotes1(SAL_nullTerminated, __yes) +#define _Check_return_impl_ __post _SA_annotes0(SAL_checkReturn) +#define _Deref_in_bound_impl_ _Deref_pre_impl_ _Bound_impl_ +#define _Deref_in_range_impl_(min,max) _Deref_pre_impl_ _Range_impl_(min,max) +#define _Deref_out_bound_impl_ _Deref_post_impl_ _Bound_impl_ +#define _Deref_out_range_impl_(min,max) _Deref_post_impl_ _Range_impl_(min,max) +#define _Deref_post_impl_ _Post_impl_ _Notref_impl_ _Deref_impl_ +#define _Deref_post1_impl_(p1) _Deref_post_impl_ p1 +#define _Deref_post2_impl_(p1,p2) _Deref_post_impl_ p1 _Deref_post_impl_ p2 +#define _Deref_post3_impl_(p1,p2,p3) _Deref_post_impl_ p1 _Deref_post_impl_ p2 _Deref_post_impl_ p3 +#define _Deref_pre_impl_ _Pre_impl_ _Notref_impl_ _Deref_impl_ +#define _Deref_pre1_impl_(p1) _Deref_pre_impl_ p1 +#define _Deref_pre2_impl_(p1,p2) _Deref_pre_impl_ p1 _Deref_pre_impl_ p2 +#define _Deref_pre3_impl_(p1,p2,p3) _Deref_pre_impl_ p1 _Deref_pre_impl_ p2 _Deref_pre_impl_ p3 +#define _Deref_ret_bound_impl_ _Deref_post_impl_ _Bound_impl_ +#define _Deref_ret_range_impl_(min,max) _Deref_post_impl_ _Range_impl_(min,max) +#define _Deref_ret1_impl_(p1) _Deref_post_impl_ p1 +#define _Deref_ret2_impl_(p1,p2) _Deref_post_impl_ p1 _Deref_post_impl_ p2 +#define _Deref_ret3_impl_(p1,p2,p3) _Deref_post_impl_ p1 _Deref_post_impl_ p2 _Deref_post_impl_ p3 +#define _Deref2_post1_impl_(p1) _Deref_post_impl_ _Notref_impl_ _Deref_impl_ p1 +#define _Deref2_pre1_impl_(p1) _Deref_pre_impl_ _Notref_impl_ _Deref_impl_ p1 +#define _Deref2_ret1_impl_(p1) _Deref_post_impl_ _Notref_impl_ _Deref_impl_ p1 +#define _In_bound_impl_ _Pre_impl_ _Bound_impl_ +#define _In_range_impl_(min,max) _Pre_impl_ _Range_impl_(min,max) +#if (_MSC_VER > 1600) // CHECKME: doesn't work with WDK 7600 +#define _Notref_impl_ _SA_annotes0(SAL_notref) +#else +#define _Notref_impl_ +#endif +#define _Out_bound_impl_ _Post_impl_ _Bound_impl_ +#define _Out_range_impl_(min,max) _Post_impl_ _Range_impl_(min,max) +#define _Post1_impl_(p1) _Post_impl_ p1 +#define _Post2_impl_(p1,p2) _Post_impl_ p1 _Post_impl_ p2 +#define _Post3_impl_(p1,p2,p3) _Post_impl_ p1 _Post_impl_ p2 _Post_impl_ p3 +#define _Pre1_impl_(p1) _Pre_impl_ p1 +#define _Pre2_impl_(p1,p2) _Pre_impl_ p1 _Pre_impl_ p2 +#define _Pre3_impl_(p1,p2,p3) _Pre_impl_ p1 _Pre_impl_ p2 _Pre_impl_ p3 +#define _Printf_format_string_impl_ _SA_annotes1(SAL_IsFormatString, "printf") +#define _Ret_bound_impl_ _Post_impl_ _Bound_impl_ +#define _Ret_range_impl_(min,max) _Post_impl_ _Range_impl_(min,max) +#define _Ret1_impl_(p1) _Post_impl_ p1 +#define _Ret2_impl_(p1,p2) _Post_impl_ p1 _Post_impl_ p2 +#define _Ret3_impl_(p1,p2,p3) _Post_impl_ p1 _Post_impl_ p2 _Post_impl_ p3 +#define _SA_annotes0(n) __declspec(#n) +#define _SA_annotes1(n,pp1) __declspec(#n "(" _SA_SPECSTRIZE(pp1) ")" ) +#define _SA_annotes2(n,pp1,pp2) __declspec(#n "(" _SA_SPECSTRIZE(pp1) "," _SA_SPECSTRIZE(pp2) ")") +#define _SA_annotes3(n,pp1,pp2,pp3) __declspec(#n "(" _SA_SPECSTRIZE(pp1) "," _SA_SPECSTRIZE(pp2) "," _SA_SPECSTRIZE(pp3) ")") +#define _Scanf_format_string_impl_ _SA_annotes1(SAL_IsFormatString, "scanf") +#define _Scanf_s_format_string_impl_ _SA_annotes1(SAL_IsFormatString, "scanf_s") +#define _Use_decl_anno_impl_ __declspec("SAL_useHeader()") // this is a special case! #endif +#define _SA_SPECSTRIZE(x) #x + /* Common definitions */ #define _At_(target, annos) _At_impl_(target, annos _SAL_nop_impl_) #define _Group_(annos) _Group_impl_(annos _SAL_nop_impl_) @@ -279,7 +363,6 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define _Must_inspect_impl_ _Post_impl_ _SA_annotes0(SAL_mustInspect) #define _Notliteral_impl_ _SA_annotes1(SAL_constant, __no) #define _Notnull_impl_ _SA_annotes1(SAL_null, __no) -#define _Notref_impl_ _SA_annotes0(SAL_notref) #define _Notvalid_impl_ _SA_annotes1(SAL_valid, __no) #define _Null_impl_ _SA_annotes1(SAL_null, __yes) #define _Null_terminated_impl_ _SA_annotes1(SAL_nullTerminated, __yes) @@ -1560,5 +1643,5 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define _Writable_bytes_(size) #define _Writable_elements_(size) -#endif /* _USE_ATTRIBUTES_FOR_SAL || _USE_ATTRIBUTES_FOR_SAL */ +#endif /* _USE_ATTRIBUTES_FOR_SAL || _USE_DECLSPECS_FOR_SAL */