summaryrefslogtreecommitdiff
path: root/sed/debug.c
Commit message (Collapse)AuthorAgeFilesLines
* maint: update copyright datesJim Meyering2023-01-011-1/+1
|
* sed: improve integer overflow checkingPaul Eggert2022-12-191-10/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Fix some some longstanding but unlikely integer overflows. Internally, 'sed' now more often prefers signed integer arithmetic, which can be checked automatically via 'gcc -fsanitize=undefined'. * basicdefs.h (countT): Remove. All uses replaced with a more-specific signed type, e.g., idx_t. Similarly, change uses of types like size_t to signed types like idx_t when appropriate. (REALLOC): Remove; no longer used. We now use xpalloc because that detects integer overflow in size calculations. Also, we no longer use XCALLOC since the code never relies on the storage being zero, and leaving it uninitialized is more likely to catch errors when debugging implementations are used. We use XNMALLOC instead, or xpalloc. * bootstrap.conf (gnulib_modules): Add stdckdint, strtoimax. * lib/.gitignore, m4/.gitignore: Update for new Gnulib modules. * sed/compile.c: Include stdckdint.h. (VECTOR_ALLOC_INCREMENT): Remove; no longer used. (in_integer): Return maximal value if integer overflow. All callers changed to expect this. (next_cmd_entry): Use xpalloc instead of reallocating by hand, which might suffer integer overflow. (normalize_text): Don’t rely on system-defined conversion of out-of-range size_t to int. (next_cmd_entry): Arg is now pointer, not pointer-to-pointer. All uses changed. * sed/debug.c (debug_print_function): Don’t attempt to fwrite a null pointer with a zero size. * sed/execute.c: Include <stdckdint.h>, "minmax.h". (resize_line): LEN arg is now increment, not total length, to avoid overflow when calculating total length. All uses changed. Do not assume lb->alloc * 2 cannot overflow. (resize_line, line_copy): Use xpalloc instead of doing realloc by hand, which might suffer integer overflow. (str_append_modified): Do not add n to to->length until after it's known this cannot overflow. (read_file_line): Don’t assume ssize_t fits in long. (get_backup_file_name): Don’t assume string length fits in int. Do not assume PTR-1+1 works; behavior is undefined if PTR is at buffer start. Check for integer overflow in buffer size calculation. (read_pattern_space): Check for line number overflow. (match_address_p): Check for address overflow. (debug_print_line): Omit unnecessary test for in->active being null. (execute_program): Check for Q overflow. * sed/regexp.c: Include <stdckdint.h>. (match_regex): Don’t assume TYPE_MAXIMUM (regoff_t) == INT_MAX. * sed/sed.c: Include inttypes.h, for strtoimax. (main): Use strtoimax, not atoi. * sed/utils.c (init_buffer): Use xmalloc and xpalloc instead of guessing sizes ourselves, and unnecessarily initializing. (resize_buffer): Remove; all callers changed to use xpalloc. (free_buffer): Don’t call free (NULL), since we already test whether the pointer is null.
* sed: simplify by aborting rather than assertingPaul Eggert2022-12-191-7/+6
| | | | | | * sed/debug.c: Do not include assert.h. (debug_print_function): Use plain abort () rather than assert (0). This is simpler and just as useful.
* maint: make update-copyrightJim Meyering2022-01-011-1/+1
|
* sed: allow '0rFILE' (insert FILE before the first line)Assaf Gordon2021-08-161-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The 'r' command can be used with address zero, effectively prepending a file to the beginning of the input file, e.g.: sed '0rA.TXT' B.TXT > C.TXT is equivalent to: cat A.TXT B.TXT > C.TXT With "sed -i", this allows safe in-place prepending of files. A typical example would be adding a license header to multiple source files: sed -i '0rLICENSE' *.c *.h find -iname '*.cpp' | xargs sed -i '0rLICENSE' A current cumbersome alternative is: sed -i -e 'x;${p;x};1rA.TXT' -e '1d' B.TXT * NEWS: Mention new feature. * sed/sed.h (struct readcmd): New struct. (struct sed_cmd): Use new struct instead of a char* for the filename. * sed/compile.c (compile_program): Expand conditional detecting invalid usage of "0" address to allow "0r"; Adjust '0r' to '1r' with prepending (instead of appending). * sed/execute.c (execute_program): 'r' command: support prepending. * sed/debug.c (debug_print_function): Use the new 'struct readcmd'. * testsuite/cmd-0r.sh: New test. * testsuite/local.mk (TESTS): Add new test. * doc/sed.texi (Zero Address): New section. (Adding a header to multiple files): New example section.
* maint: update all copyright year number rangesAssaf Gordon2021-01-051-1/+1
| | | | | | | | | | | | | Run "make update-copyright" and then... * gnulib: Update to latest with copyright year adjusted. * bootstrap.conf (gnulib_modules): Remove getopt module, depracated in https://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=0abc38bd2a1398f0 * po/POTFILES.in: Remove getopt.c * sed/utils.h (panic): Rename _GL_ATTRIBUTE_FORMAT_PRINTF to _GL_ATTRIBUTE_FORMAT_PRINTF_STANDARD following gnulib's change: https://git.savannah.gnu.org/cgit/gnulib.git/commit/?id=387d654cabd7bc15 * tests/init.sh: Sync with gnulib to pick up copyright year. * bootstrap: Likewise.
* maint: update all copyright year number rangesJim Meyering2020-01-011-1/+1
| | | | | | | Run "make update-copyright" and then... * gnulib: Update to latest with copyright year adjusted. * tests/init.sh: Sync with gnulib to pick up copyright year. * bootstrap: Likewise.
* maint: update copyright dates for 2019Assaf Gordon2019-01-011-1/+1
| | | | * all files: Run "make update-copyright".
* sed: avoid UMR in --debug code pathJim Meyering2018-10-271-3/+6
| | | | | | * sed/debug.c (debug_print_function) [b, t, T]: For a b, t or T command with no LABEL, do not access uninitialized memory. I.e., print the label name only when there is one.
* sed: add --debug featureAssaf Gordon2018-10-241-0/+453
$ seq 3 | sed --debug -e 's/./--&--/ ; 2d' SED PROGRAM: s/./--&--/ 2 d INPUT: 'STDIN' line 1 PATTERN: 1 COMMAND: s/./--&--/ MATCHED REGEX REGISTERS regex[0] = 0-1 '1' PATTERN: --1-- COMMAND: 2 d END-OF-CYCLE: --1-- INPUT: 'STDIN' line 2 PATTERN: 2 COMMAND: s/./--&--/ MATCHED REGEX REGISTERS regex[0] = 0-1 '2' PATTERN: --2-- COMMAND: 2 d END-OF-CYCLE: INPUT: 'STDIN' line 3 PATTERN: 3 COMMAND: s/./--&--/ MATCHED REGEX REGISTERS regex[0] = 0-1 '3' PATTERN: --3-- COMMAND: 2 d END-OF-CYCLE: --3-- Discussed in https://lists.gnu.org/r/sed-devel/2018-07/msg00006.html and https://lists.gnu.org/r/sed-devel/2018-10/msg00007.html . * NEWS: Mention new option. * doc/sed.texi (Program options): Mention new option. * sed/debug.c: New unit with debug printing functions. * sed/sed.h (debug_print_command, debug_print_char, debug_print_program, debug): Declare functions and global variable. (struct sed_cmd): Add label_name member variable. * sed/compile.c (compile_program): Save the label's name. (cleanup_program_filenames): extracted function to free filenames. (check_final_program) Don't delete the filenames, instead move it to ... (finish_program) ... here. * sed/execute.c (debug_print_end_of_cycle, debug_print_input, debug_print_line): New debug functions (cannot be defined in debug.c as execute's structures are private). (execute_program, process_files): Call debug functions. * sed/sed.c: (DEBUG_OPTION): New option for getoptlong. (debug): New global variable. (usage): Mention new option. (main): Process new option and call debug functions if needed. * testsuite/debug.pl: New tests. * testsuite/local.mk (T): Add new tests.