Unified · Split
| @@ -1482,6 +1482,7 @@ enum { · 1481 unmodified lines | ||
| 1482 | 1482 | TCC_OPTION_bench, |
| 1483 | 1483 | TCC_OPTION_bt, |
| 1484 | 1484 | TCC_OPTION_b, |
| 1485 | + TCC_OPTION_ba, | |
| 1485 | 1486 | TCC_OPTION_g, |
| 1486 | 1487 | TCC_OPTION_c, |
| 1487 | 1488 | TCC_OPTION_dumpversion, |
| @@ -1544,6 +1545,7 @@ static const TCCOption tcc_options[] = { · 56 unmodified lines | ||
| 1544 | 1545 | #endif |
| 1545 | 1546 | #ifdef CONFIG_TCC_BCHECK |
| 1546 | 1547 | { "b", TCC_OPTION_b, 0 }, |
| 1548 | + { "ba", TCC_OPTION_ba, 0 }, | |
| 1547 | 1549 | #endif |
| 1548 | 1550 | { "g", TCC_OPTION_g, TCC_OPTION_HAS_ARG | TCC_OPTION_NOSEP }, |
| 1549 | 1551 | { "c", TCC_OPTION_c, 0 }, |
| @@ -1800,6 +1802,9 @@ reparse: · 250 unmodified lines | ||
| 1800 | 1802 | s->do_bounds_check = 1; |
| 1801 | 1803 | s->do_debug = 1; |
| 1802 | 1804 | break; |
| 1805 | + case TCC_OPTION_ba: | |
| 1806 | + s->do_bounds_check_addres = 1; | |
| 1807 | + break; | |
| 1803 | 1808 | #endif |
| 1804 | 1809 | case TCC_OPTION_g: |
| 1805 | 1810 | s->do_debug = 1; |
| @@ -368,6 +368,9 @@ Try to continue in case of a bound checking error. · 367 unmodified lines | ||
| 368 | 368 | |
| 369 | 369 | Note: @option{-b} is only available on i386 (linux and windows) and x86_64 (linux and windows) when using libtcc for the moment. |
| 370 | 370 | |
| 371 | +@item -ba | |
| 372 | +Generate address checking tests when using @option{-b}. This will be a lot slower but finds more errors. | |
| 373 | + | |
| 371 | 374 | @item -bt N |
| 372 | 375 | Display N callers in stack traces. This is useful with @option{-g} or |
| 373 | 376 | @option{-b}. |
| @@ -59,6 +59,7 @@ static const char help[] = · 58 unmodified lines | ||
| 59 | 59 | " -g generate runtime debug info\n" |
| 60 | 60 | #ifdef CONFIG_TCC_BCHECK |
| 61 | 61 | " -b compile with built-in memory and bounds checker (implies -g)\n" |
| 62 | + " -ba Enable better addres checking with bounds checker\n" | |
| 62 | 63 | #endif |
| 63 | 64 | #ifdef CONFIG_TCC_BACKTRACE |
| 64 | 65 | " -bt N show N callers in stack traces\n" |
| @@ -720,6 +720,7 @@ struct TCCState { · 719 unmodified lines | ||
| 720 | 720 | #ifdef CONFIG_TCC_BCHECK |
| 721 | 721 | /* compile with built-in memory and bounds checker */ |
| 722 | 722 | unsigned char do_bounds_check; |
| 723 | + unsigned char do_bounds_check_addres; | |
| 723 | 724 | #endif |
| 724 | 725 | #ifdef TCC_TARGET_ARM |
| 725 | 726 | enum float_abi float_abi; /* float ABI of the generated code*/ |
| @@ -2509,7 +2509,8 @@ redo: · 2508 unmodified lines | ||
| 2509 | 2509 | */ |
| 2510 | 2510 | /* if evaluating constant expression, no code should be |
| 2511 | 2511 | generated, so no bound check */ |
| 2512 | − if (tcc_state->do_bounds_check && !const_wanted && !nocode_wanted) { | |
| 2512 | + if (tcc_state->do_bounds_check && tcc_state->do_bounds_check_addres | |
| 2513 | + && !const_wanted && !nocode_wanted) { | |
| 2513 | 2514 | /* if bounded pointers, we generate a special code to |
| 2514 | 2515 | test bounds */ |
| 2515 | 2516 | if (op == '-') { |