annotate runtime/indent/testdir/README.txt @ 33815:08f9e1eac4cf v9.0.2123

patch 9.0.2123: Problem with initializing the length of range() lists Commit: https://github.com/vim/vim/commit/df63da98d8dc284b1c76cfe1b17fa0acbd6094d8 Author: Christian Brabandt <cb@256bit.org> Date: Thu Nov 23 20:14:28 2023 +0100 patch 9.0.2123: Problem with initializing the length of range() lists Problem: Problem with initializing the length of range() lists Solution: Set length explicitly when it shouldn't contain any items range() may cause a wrong calculation of list length, which may later then cause a segfault in list_find(). This is usually not a problem, because range_list_materialize() calculates the length, when it materializes the list. In addition, in list_find() when the length of the range was wrongly initialized, it may seem to be valid, so the check for list index out-of-bounds will not be true, because it is called before the list is actually materialized. And so we may eventually try to access a null pointer, causing a segfault. So this patch does 3 things: - In f_range(), when we know that the list should be empty, explicitly set the list->lv_len value to zero. This should happen, when start is larger than end (in case the stride is positive) or end is larger than start when the stride is negative. This should fix the underlying issue properly. However, - as a safety measure, let's check that the requested index is not out of range one more time, after the list has been materialized and return NULL in case it suddenly is. - add a few more tests to verify the behaviour. fixes: #13557 closes: #13563 Co-authored-by: Tim Pope <tpope@github.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 23 Nov 2023 20:30:07 +0100
parents bd7461db24b3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14970
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 TESTING INDENT SCRIPTS
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 We'll use FILETYPE for the filetype name here.
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 FORMAT OF THE FILETYPE.IN FILE
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 First of all, create a FILETYPE.in file. It should contain:
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 - A modeline setting the 'filetype' and any other option values.
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 This must work like a comment for FILETYPE. E.g. for vim:
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 " vim: set ft=vim sw=4 :
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 - At least one block of lines to indent, prefixed with START_INDENT and
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15 followed by END_INDENT. These lines must also look like a comment for your
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 FILETYPE. You would normally leave out all indent, so that the effect of
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 the indent command results in adding indent. Example:
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 " START_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 func Some()
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 let x = 1
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 endfunc
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 " END_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24
14999
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
25 If you just want to test normal indenting with default options, you can make
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
26 this a large number of lines. Just add all kinds of language constructs,
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
27 nested statements, etc. with valid syntax.
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
28
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
29 - Optionally, add lines with INDENT_EXE after START_INDENT, followed by a Vim
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
30 command. This will be executed before indenting the lines. Example:
14970
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32 " START_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 " INDENT_EXE let g:vim_indent_cont = 6
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 let cmd =
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 \ 'some '
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 \ 'string'
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 " END_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 Note that the command is not undone, you may need to reverse the effect for
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 the next block of lines.
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 - Alternatively to indenting all the lines between START_INDENT and
14999
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
43 END_INDENT, use an INDENT_AT line, which specifies a pattern to find the
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
44 line to indent. Example:
14970
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 " START_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 " INDENT_AT this-line
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48 func Some()
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 let f = x " this-line
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 endfunc
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 " END_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 Alternatively you can use INDENT_NEXT to indent the line below the matching
14999
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
54 pattern. Keep in mind that quite often it will indent relative to the
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
55 matching line:
14970
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 " START_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 " INDENT_NEXT next-line
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 func Some()
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
60 " next-line
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 let f = x
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 endfunc
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 " END_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65 Or use INDENT_PREV to indent the line above the matching pattern:
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 " START_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68 " INDENT_PREV prev-line
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 func Some()
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70 let f = x
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71 " prev-line
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 endfunc
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73 " END_INDENT
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
74
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
75 It's best to keep the whole file valid for FILETYPE, so that syntax
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
76 highlighting works normally, and any indenting that depends on the syntax
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
77 highlighting also works.
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
79
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
80 RUNNING THE TEST
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
82 Before running the test, create a FILETYPE.ok file. You can leave it empty at
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
83 first.
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
84
16086
bd7461db24b3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 14999
diff changeset
85 Now run "make test" from the parent directory. After Vim has done the
bd7461db24b3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 14999
diff changeset
86 indenting you will see a FILETYPE.fail file. This contains the actual result
bd7461db24b3 Update runtime files.
Bram Moolenaar <Bram@vim.org>
parents: 14999
diff changeset
87 of indenting, and it's different from the FILETYPE.ok file.
14970
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
88
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
89 Check the contents of the FILETYPE.fail file. If it is perfectly OK, then
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90 rename it to overwrite the FILETYPE.ok file. If you now run "make test" again,
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 the test will pass and create a FILETYPE.out file, which is identical to the
14999
2b30a2b4bde2 Update runtime files
Bram Moolenaar <Bram@vim.org>
parents: 14970
diff changeset
92 FILETYPE.ok file. The FILETYPE.fail file will be deleted.
14970
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
93
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
94 If you try to run "make test" again you will notice that nothing happens,
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
95 because the FILETYPE.out file already exists. Delete it, or do "make clean",
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96 so that the text runs again. If you edit the FILETYPE.in file, so that it's
19b757c6c6a7 patch 8.1.0496: no tests for indent files
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97 newer than the FILETYPE.out file, the test will also run.