annotate src/create_nvcmdidxs.vim @ 34309:d7cfd8fb1d75 v9.1.0089

patch 9.1.0089: qsort() comparison functions should be transitive Commit: https://github.com/vim/vim/commit/e06e43766500ecb4cd1031fa16cf9cbebdb222c1 Author: Christian Brabandt <cb@256bit.org> Date: Fri Feb 9 19:39:14 2024 +0100 patch 9.1.0089: qsort() comparison functions should be transitive Problem: qsort() comparison functions should be transitive Solution: Do not subtract values, but rather use explicit comparisons Improve qsort() comparison functions There has been a recent report on qsort() causing out-of-bounds read & write in glibc for non transitive comparison functions https://www.qualys.com/2024/01/30/qsort.txt Even so the bug is in glibc's implementation of the qsort() algorithm, it's bad style to just use substraction for the comparison functions, which may cause overflow issues and as hinted at in OpenBSD's manual page for qsort(): "It is almost always an error to use subtraction to compute the return value of the comparison function." So check the qsort() comparison functions and change them to be safe. closes: #13980 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Fri, 09 Feb 2024 19:45:06 +0100
parents ee1019e59bef
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
1 " This script generates the table nv_cmd_idx[] which contains the index in
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
2 " nv_cmds[] table (normal.c) for each of the command character supported in
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
3 " normal/visual mode.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
4 " This is used to speed up the command lookup in nv_cmds[].
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
5 "
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
6 " Script should be run using "make nvcmdidxs", every time the nv_cmds[] table
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
7 " in src/nv_cmds.h changes.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
8 "
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
9 " This is written in legacy Vim script so that it can be run by a slightly
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
10 " older Vim version.
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
12 " Generate the table of normal/visual mode command characters and their
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
13 " corresponding index.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
14 let cmd = 'create_nvcmdidxs'
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
15 if has('unix')
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
16 let cmd = './' .. cmd
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
17 endif
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
18 let nv_cmdtbl = systemlist(cmd)->map({i, ch -> {'idx': i, 'cmdchar': ch}})
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
20 " sort the table by the command character
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
21 call sort(nv_cmdtbl, {a, b -> a.cmdchar - b.cmdchar})
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
23 " Compute the highest index upto which the command character can be directly
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
24 " used as an index.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
25 let nv_max_linear = 0
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
26 for i in range(nv_cmdtbl->len())
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
27 if i != nv_cmdtbl[i].cmdchar
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
28 let nv_max_linear = i - 1
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
29 break
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
30 endif
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
31 endfor
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
33 " Generate a header file with the table
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
34 let output =<< trim END
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
35 /*
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
36 * Automatically generated code by the create_nvcmdidxs.vim script.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
37 *
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
38 * Table giving the index in nv_cmds[] to lookup based on
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
39 * the command character.
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
40 */
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
42 // nv_cmd_idx[<normal mode command character>] => nv_cmds[] index
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
43 static const unsigned short nv_cmd_idx[] =
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
44 {
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
45 END
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
47 " Add each command character in comment and the corresponding index
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
48 let output += nv_cmdtbl->map({_, v ->
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
49 \ printf(' /* %5d */ %3d,', v.cmdchar, v.idx)})
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
51 let output += ['};', '',
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
52 \ '// The highest index for which',
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
53 \ '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]']
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
55 let output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';']
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
56
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
57 call writefile(output, "nv_cmdidxs.h")
27447
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 quit
4050f0554902 patch 8.2.4252: generating the normal command table at runtime is inefficient
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59
27484
ee1019e59bef patch 8.2.4270: generating nv_cmdidxs.h requires building Vim twice
Bram Moolenaar <Bram@vim.org>
parents: 27447
diff changeset
60 " vim: shiftwidth=2 sts=2 expandtab