The incr_offset offset code was not working with bounds checking. So I reverted part of tccgen.c. See new test code 132. Also added some debugging code that prints location of bounds checking calls. Needed this to find the problem. See lib/bcheck.c, lib/bt-dll.c, lib/bt-exe.c, lib/bt-log.c, tccrun.c
Showing the changes to lib (4 of 8 files). Show all
Unified · Split
| @@ -41,7 +41,7 @@ · 40 unmodified lines | ||
| 41 | 41 | #define BOUND_STATISTIC (1) |
| 42 | 42 | |
| 43 | 43 | #if BOUND_DEBUG |
| 44 | − #define dprintf(a...) if (print_calls) fprintf(a) | |
| 44 | + #define dprintf(a...) if (print_calls) { bounds_loc; fprintf(a); } | |
| 45 | 45 | #else |
| 46 | 46 | #define dprintf(a...) |
| 47 | 47 | #endif |
| @@ -446,6 +446,7 @@ static unsigned long long bound_splay_delete; · 398 unmodified lines | ||
| 446 | 446 | #endif |
| 447 | 447 | |
| 448 | 448 | int tcc_backtrace(const char *fmt, ...); |
| 449 | +void tcc_location(const char *fmt); | |
| 449 | 450 | |
| 450 | 451 | /* print a bound error message */ |
| 451 | 452 | #define bound_warning(...) \ |
| @@ -462,6 +463,13 @@ int tcc_backtrace(const char *fmt, ...); · 10 unmodified lines | ||
| 462 | 463 | exit(255); \ |
| 463 | 464 | } while (0) |
| 464 | 465 | |
| 466 | +#define bounds_loc \ | |
| 467 | + do { \ | |
| 468 | + WAIT_SEM (); \ | |
| 469 | + tcc_location("^bcheck.c^"); \ | |
| 470 | + POST_SEM (); \ | |
| 471 | + } while (0) | |
| 472 | + | |
| 465 | 473 | static void bound_alloc_error(const char *s) |
| 466 | 474 | { |
| 467 | 475 | fprintf(stderr,"FATAL: %s\n",s); |
| @@ -8,6 +8,7 @@ · 7 unmodified lines | ||
| 8 | 8 | REDIR(__bt_init) \ |
| 9 | 9 | REDIR(__bt_exit) \ |
| 10 | 10 | REDIR(tcc_backtrace) \ |
| 11 | + REDIR(tcc_location) \ | |
| 11 | 12 | \ |
| 12 | 13 | REDIR(__bound_ptr_add) \ |
| 13 | 14 | REDIR(__bound_ptr_indir1) \ |
| @@ -8,6 +8,7 @@ · 7 unmodified lines | ||
| 8 | 8 | #include "../tccrun.c" |
| 9 | 9 | |
| 10 | 10 | int (*__rt_error)(void*, void*, const char *, va_list); |
| 11 | +void (*__rt_location)(void*, void*, const char *); | |
| 11 | 12 | __attribute__((weak)) void __bound_checking_lock(void); |
| 12 | 13 | __attribute__((weak)) void __bound_checking_unlock(void); |
| 13 | 14 | |
| @@ -33,6 +34,7 @@ void __bt_init(rt_context *p, int num_callers) · 19 unmodified lines | ||
| 33 | 34 | rc->num_callers = num_callers - 1; |
| 34 | 35 | rc->top_func = main; |
| 35 | 36 | __rt_error = _rt_error; |
| 37 | + __rt_location = _rt_location; | |
| 36 | 38 | set_exception_handler(); |
| 37 | 39 | } else { |
| 38 | 40 | p->next = rc->next, rc->next = p; |
| @@ -6,6 +6,7 @@ · 5 unmodified lines | ||
| 6 | 6 | #include <string.h> |
| 7 | 7 | |
| 8 | 8 | int (*__rt_error)(void*, void*, const char *, va_list); |
| 9 | +void (*__rt_location)(void*, void*, const char *); | |
| 9 | 10 | |
| 10 | 11 | #ifdef _WIN32 |
| 11 | 12 | # define DLL_EXPORT __declspec(dllexport) |
| @@ -42,6 +43,15 @@ DLL_EXPORT int tcc_backtrace(const char *fmt, ...) · 30 unmodified lines | ||
| 42 | 43 | return ret; |
| 43 | 44 | } |
| 44 | 45 | |
| 46 | +DLL_EXPORT void tcc_location(const char *fmt) | |
| 47 | +{ | |
| 48 | + if (__rt_location) { | |
| 49 | + void *fp = __builtin_frame_address(1); | |
| 50 | + void *ip = __builtin_return_address(0); | |
| 51 | + __rt_location(fp, ip, fmt); | |
| 52 | + } | |
| 53 | +} | |
| 54 | + | |
| 45 | 55 | #if (defined(__GNUC__) && (__GNUC__ >= 6)) || defined(__clang__) |
| 46 | 56 | #pragma GCC diagnostic pop |
| 47 | 57 | #endif |