sigmd 0.1.0

Windows API signature metadata
Documentation
#if 0
// CHECK-MS: #define _MSC_VER 1900
// CHECK-MS: #define _MSVC_LANG 201403L
// CHECK-MS: #define _M_IX86 600
// CHECK-MS: #define _M_IX86_FP 0
// CHECK-MS: #define _WIN32 1

#if defined(_MSC_VER)
void __defined_MSC_VER();
#endif

#if defined(_MSVC_LANG)
void __defined_MSVC_LANG();
#endif

#if defined(_M_IX86)
void __defined_M_IX86();
#endif

#if defined(_M_IX86_FP)
void __defined_M_IX86_FP();
#endif

#if defined(_WIN32)
void __defined_WIN32();
#endif

#if defined(WIN32)
void __defined_WIN32_XXX();
#endif

#if defined(_X86_)
void __defined_X86_();
#endif

// CHECK-MS64: #define _MSC_VER 1900
// CHECK-MS64: #define _MSVC_LANG 201402L
// CHECK-MS64: #define _M_AMD64 100
// CHECK-MS64: #define _M_X64 100
// CHECK-MS64: #define _WIN64 1

#if defined(_M_AMD64)
void __defined_M_AMD64();
#endif

#if defined(_M_X64)
void __defined_M_X64();
#endif

#if defined(_AMD64_)
void __defined_AMD64_();
#endif

#if defined(_WIN64)
void __defined_WIN64();
#endif

#if defined(__cplusplus)
void __defined_cplusplus();
#endif

size_t __test_size_t();
// wchar_t __test_wchar_t();
#endif

#define __SPECSTRINGS_STRICT_LEVEL 0
//#define _PREFAST_
#include <sal.h>
#include <rpcsal.h>
//#undef _PREFAST_

#undef _SA_SPECSTRIZE
#define _SA_SPECSTRIZE(x)                 #x

//
// _At_ and _When_ need special handling.
//

#undef _At_
#undef _When_

#define _At_(expr, annotes)               annotes
#define _When_(expr, annotes)             annotes

//
// TODO: __in, __out, __inout, ... ?
//

#undef IN
#undef OUT

#define IN                                __attribute__((annotate("__SAL|_In_")))
#define OUT                               __attribute__((annotate("__SAL|_Out_")))

//
// Macro hackery for expanding the arguments of SAL annotations.
//

#define __PP_EVAL0(fn, _)
#define __PP_EVAL1(fn, p1)                      fn(0, p1)
#define __PP_EVAL2(fn, p1, p2)                  fn(0, p1) fn(1, p2)
#define __PP_EVAL3(fn, p1, p2, p3)              fn(0, p1) fn(1, p2) fn(2, p3)
#define __PP_EVAL4(fn, p1, p2, p3, p4)          fn(0, p1) fn(1, p2) fn(2, p3) fn(3, p4)
#define __PP_EVAL5(fn, p1, p2, p3, p4, p5)      fn(0, p1) fn(1, p2) fn(2, p3) fn(3, p4) fn(4, p5)
#define __PP_EVAL6(fn, p1, p2, p3, p4, p5, p6)  fn(0, p1) fn(1, p2) fn(2, p3) fn(3, p4) fn(4, p5) fn(5, p6)

#define __PP_NUM_ARGS_H1(dummy, n6, n5, n4, n3, n2, n1, n0, ...) n0
#define __PP_NUM_ARGS(...)                      __PP_NUM_ARGS_H1(dummy, ##__VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)
#define __PP_EVAL_ALL_H3(fn, n, ...)            __PP_EVAL##n(fn, __VA_ARGS__)
#define __PP_EVAL_ALL_H2(fn, n, ...)            __PP_EVAL_ALL_H3(fn, n, __VA_ARGS__)
#define __PP_EVAL_ALL(fn, ...)                  __PP_EVAL_ALL_H2(fn, __PP_NUM_ARGS(__VA_ARGS__), __VA_ARGS__)

//
// Redefine SAL annotations.
// Note that we exploit the fact that the _SAL1_Source_ is using its `annotes`
// argument to define the SAL2 annotations - therefore in our redefinition we
// just pass it through. SAL1 annotations are the legacy annotations, e.g.
// __in, __in_bcount(size), etc.
//

#undef _SAL1_Source_
#undef _SAL1_1_Source_
#undef _SAL1_2_Source_
#undef _SAL2_Source_
#undef _SAL_L_Source_

#define __PP_ANNOTATE_ALL(...)                  __PP_EVAL_ALL(__PP_ANNOTATE, __VA_ARGS__)
#define __PP_ANNOTATE(i, n)                     __attribute__((annotate("__SAL_ARG[" _SA_SPECSTRIZE(i) "]|" #n)))

#define _SAL1_Source_(Name, args, annotes)      annotes
#define _SAL1_1_Source_(Name, args, annotes)    __attribute__((annotate("__SAL|"#Name))) __PP_ANNOTATE_ALL args
#define _SAL1_2_Source_(Name, args, annotes)    __attribute__((annotate("__SAL|"#Name))) __PP_ANNOTATE_ALL args
#define _SAL2_Source_(Name, args, annotes)      __attribute__((annotate("__SAL|"#Name))) __PP_ANNOTATE_ALL args
#define _SAL_L_Source_(Name, args, annotes)     __attribute__((annotate("__SAL|"#Name))) __PP_ANNOTATE_ALL args

int __test_param(
    __in_bcount(Length) void* Buffer,
    __in unsigned int Length
);