tb_pointer_t tb_memmov(tb_pointer_t s1, tb_cpointer_t s2, tb_size_t n) { // check #ifdef __tb_debug__ { // overflow dst? tb_size_t n1 = tb_pool_data_size(s1); if (n1 && n > n1) { tb_trace_i("[memmov]: [overflow]: [%p, %lu] => [%p, %lu]", s2, n, s1, n1); tb_backtrace_dump("[memmov]: [overflow]: ", tb_null, 10); tb_pool_data_dump(s1, tb_true, "\t[malloc]: [from]: "); tb_abort(); } // overflow src? tb_size_t n2 = tb_pool_data_size(s2); if (n2 && n > n2) { tb_trace_i("[memmov]: [overflow]: [%p, %lu] => [%p, %lu]", s2, n, s1, n1); tb_backtrace_dump("[memmov]: [overflow]: ", tb_null, 10); tb_pool_data_dump(s2, tb_true, "\t[malloc]: [from]: "); tb_abort(); } } #endif // done return tb_memmov_impl(s1, s2, n); }
/* ////////////////////////////////////////////////////////////////////////////////////// * interfaces */ tb_size_t tb_strlen(tb_char_t const* s) { // check #ifdef __tb_debug__ { // overflow? tb_size_t size = tb_pool_data_size(s); if (size) { // no '\0'? tb_size_t real = tb_strnlen(s, size); if (s[real]) { tb_trace_i("[strlen]: [overflow]: [%p, %lu]", s, size); tb_backtrace_dump("[strlen]: [overflow]: ", tb_null, 10); tb_pool_data_dump(s, tb_true, "\t[malloc]: [from]: "); tb_abort(); } } } #endif // done return tb_strlen_impl(s); }
tb_pointer_t tb_memset_u24(tb_pointer_t s, tb_uint32_t c, tb_size_t n) { // check #ifdef __tb_debug__ { // overflow? tb_size_t size = tb_pool_data_size(s); if (size && (n * 3) > size) { tb_trace_i("[memset_u24]: [overflow]: [%#x x %lu x 3] => [%p, %lu]", c, n, s, size); tb_pool_data_dump(s, tb_true, "\t[malloc]: [from]: "); tb_abort(); } } #endif // done return tb_memset_u24_impl(s, c, n); }
tb_pointer_t tb_memset_u16(tb_pointer_t s, tb_uint16_t c, tb_size_t n) { // check #ifdef __tb_debug__ { // overflow? tb_size_t size = tb_pool_data_size(s); if (size && (n << 1) > size) { tb_trace_i("[memset_u16]: [overflow]: [%#x x %lu x 2] => [%p, %lu]", c, n, s, size); tb_backtrace_dump("[memset_u16]: [overflow]: ", tb_null, 10); tb_pool_data_dump(s, tb_true, "\t[malloc]: [from]: "); tb_abort(); } } #endif // done return tb_memset_u16_impl(s, c, n); }
/* ////////////////////////////////////////////////////////////////////////////////////// * interfaces */ tb_char_t* tb_strncpy(tb_char_t* s1, tb_char_t const* s2, tb_size_t n) { // check #ifdef __tb_debug__ { // overflow dst? tb_strlen(s2); // strncpy overflow? tb_size_t n1 = tb_pool_data_size(s1); if (n1 && n + 1 > n1) { tb_trace_i("[strncpy]: [overflow]: [%p, %lu] => [%p, %lu]", s2, n, s1, n1); tb_backtrace_dump("[strncpy]: [overflow]: ", tb_null, 10); tb_pool_data_dump(s2, tb_true, "\t[malloc]: [from]: "); tb_abort(); } } #endif // done return tb_strncpy_impl(s1, s2, n); }