23#define ASSERTBUFSZ (MAXLINELEN * 9)
37#ifdef _UCRT_ENCLAVE_BUILD
39template <
typename Character>
41 Character
const*
const expression,
53 traits::output_debug_string(assert_buffer);
57template <
typename Character>
59 Character
const*
const expression,
129 wchar_t const*
const expression,
135#pragma warning(suppress:__WARNING_REDUNDANT_POINTER_TEST)
147#pragma warning(suppress:__WARNING_BANNED_API_USAGE)
153 DWORD const assert_buffer_length =
static_cast<DWORD>(
wcslen(assert_buffer));
154 DWORD characters_written = 0;
155 if (
WriteConsoleW(stderr_handle, assert_buffer, assert_buffer_length, &characters_written,
nullptr) == 0)
163template <
typename Character>
165 Character
const*
const expression,
189template <
typename Character>
191 Character*
const assert_buffer,
192 size_t const assert_buffer_count,
193 Character
const*
const expression,
196 void*
const return_address
202 _ERRCHECK(traits::tcscpy_s(assert_buffer, assert_buffer_count, get_box_intro(Character())));
203 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_double_newline(Character())));
206 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_program_intro(Character())));
210 HMODULE asserting_module =
nullptr;
212 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT | GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
213 static_cast<wchar_t const*
>(return_address),
216 asserting_module =
nullptr;
224 asserting_module =
nullptr;
241 get_dot_dot_dot(Character()),
242 sizeof(Character) * dot_dot_dot_length
246 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, pchProg));
247 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_newline(Character())));
250 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_file_intro(Character())));
254 size_t const ffn =
MAXLINELEN - file_intro_count - newline_length;
268 if ((ffn - ffn / 3) < (
len -
p) && ffn / 3 >
p)
272 _ERRCHECK(traits::tcsncat_s(assert_buffer, assert_buffer_count,
pch, ffn - dot_dot_dot_length -
p));
273 _ERRCHECK(traits::tcscat_s (assert_buffer, assert_buffer_count, get_dot_dot_dot(Character())));
274 _ERRCHECK(traits::tcscat_s (assert_buffer, assert_buffer_count,
pch +
len -
p));
276 else if (ffn - ffn / 3 >
len -
p)
281 _ERRCHECK(traits::tcsncat_s(assert_buffer, assert_buffer_count,
pch, ffn - dot_dot_dot_length -
p));
282 _ERRCHECK(traits::tcscat_s (assert_buffer, assert_buffer_count, get_dot_dot_dot(Character())));
283 _ERRCHECK(traits::tcscat_s (assert_buffer, assert_buffer_count,
pch +
len -
p));
289 _ERRCHECK(traits::tcsncat_s(assert_buffer, assert_buffer_count,
pch, ffn - ffn / 3 - dot_dot_dot_length));
290 _ERRCHECK(traits::tcscat_s (assert_buffer, assert_buffer_count, get_dot_dot_dot(Character())));
291 _ERRCHECK(traits::tcsncat_s(assert_buffer, assert_buffer_count,
pch +
len -
p, ffn / 6 - 1));
292 _ERRCHECK(traits::tcscat_s (assert_buffer, assert_buffer_count, get_dot_dot_dot(Character())));
293 _ERRCHECK(traits::tcscat_s (assert_buffer, assert_buffer_count,
pch +
len - (ffn / 3 - ffn / 6 - 2)));
302 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_newline(Character())));
305 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_line_intro(Character())));
308 assert_buffer + traits::tcslen(assert_buffer),
309 assert_buffer_count - traits::tcslen(assert_buffer),
311 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_double_newline(Character())));
314 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_expression_intro(Character())));
316 size_t const characters_used =
317 traits::tcslen(assert_buffer) +
318 2 * double_newline_length +
322 if (characters_used + traits::tcslen(expression) > assert_buffer_count)
324 size_t const characters_to_write = assert_buffer_count - (characters_used + dot_dot_dot_length);
329 characters_to_write));
330 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_dot_dot_dot(Character())));
334 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, expression));
337 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_double_newline(Character())));
340 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_info_intro(Character())));
341 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_double_newline(Character())));
344 _ERRCHECK(traits::tcscat_s(assert_buffer, assert_buffer_count, get_help_intro(Character())));
349template <
typename Character>
351 Character
const*
const expression,
354 void*
const return_address
368 int const action = traits::show_message_box(
370 get_banner_text(Character()),
402template <
typename Character>
404 Character
const*
const expression,
407 void*
const return_address
429 char const*
const expression,
438 wchar_t const*
const expression,
static void __cdecl common_assert_to_stderr_direct(char const *, char const *, unsigned)
Character const *const unsigned const line_number throw()
static void __cdecl common_assert(Character const *const expression, Character const *const file_name, unsigned const line_number, void *const return_address)
void __cdecl _wassert(wchar_t const *const expression, wchar_t const *const file_name, unsigned const line_number)
Character const *const file_name
static void __cdecl common_assert_to_message_box(Character const *const expression, Character const *const file_name, unsigned const line_number, void *const return_address)
void __cdecl _assert(char const *const expression, char const *const file_name, unsigned const line_number)
static void __cdecl common_assert_to_message_box_build_string(Character *const assert_buffer, size_t const assert_buffer_count, Character const *const expression, Character const *const file_name, unsigned const line_number, void *const return_address)
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
#define _GENERATE_TCHAR_STRING_FUNCTIONS(name, string)
_ACRTIMP _crt_app_type __cdecl _query_app_type(void)
int __cdecl raise(int _SigNum)
static PDB_INFORMATION information
int const char const *const int const line_number
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
#define INVALID_HANDLE_VALUE
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleW(IN HANDLE hConsoleOutput, IN CONST VOID *lpBuffer, IN DWORD nNumberOfCharsToWrite, OUT LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved)
DWORD WINAPI GetFileType(HANDLE hFile)
BOOL WINAPI GetModuleHandleExW(IN DWORD dwFlags, IN LPCWSTR lpwModuleName OPTIONAL, OUT HMODULE *phModule)
void __declspec(noinline) __cdecl _free_base(void *const block)
GLenum GLenum GLsizei const GLuint GLboolean enabled
_Check_return_opt_ _CRTIMP int __cdecl fflush(_Inout_opt_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl setvbuf(_Inout_ FILE *_File, _Inout_updates_opt_z_(_Size) char *_Buf, _In_ int _Mode, _In_ size_t _Size)
_Check_return_opt_ _CRTIMP int __cdecl _set_error_mode(_In_ int _Mode)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
void __cdecl __debugbreak(void)
static char * program_name
int CDECL memcpy_s(void *dest, size_t numberOfElements, const void *src, size_t count)
#define MB_ABORTRETRYIGNORE