Commit Graph

2131 Commits

Author SHA1 Message Date
Eliseo Martínez
2aa8c7c41f Fix warnings: spell.c: spell_edit_score(): Garbage value: MI.
Problem    : Assigned value is garbage or undefined @ 12526.
Diagnostic : Multithreading issue.
Rationale  : Error only occurs if global has_mbyte is modified while
             function is executing.
Resolution : Use local copy of global.
2014-11-15 12:49:18 +01:00
Eliseo Martínez
1adfb558f5 Fix warnings: spell.c: getroom(): Np dereference: FP/RI.
Problem    : Dereference of null pointer @ 6089.
Diagnostic : False positive / Real issue.
Rationale  : From the code, it seems the intent is that len parameter
             should never exceed SBLOCKSIZE. But the code checking for
             that does in fact cause a null pointer dereference just
             immediately after.
Resolution : State precondition in doc and assert it at entry.
2014-11-15 12:49:18 +01:00
Eliseo Martínez
5f9cacbf32 Fix warnings: spell.c: store_aff_word(): Garbage value: RI.
Problem    : Result of operation is garbage or undefined @ 5809.
Diagnostic : Real issue.
Rationale  : When copying flags, first access to
             `use_pfxlist[use_pfxlen]` was garbage if
             `spin->si_compflags` was null.
Resolution : Make sure `use_pfxlist[use_pfxlen]` always has a value (NUL
             if `spin->si_compflags` is NULL).
2014-11-15 12:48:30 +01:00
Eliseo Martínez
a09b7f2e2e Fix warnings: spell.c: spell_read_aff(): Uninitialized arg: RI.
Problem    : Uninitialized argument value @ 4469.
Diagnostic : Real issue.
Rationale  : Happens when a line contains a spell info item (NAME, HOME,
             VERSION, AUTHOR, EMAIL, COPYRIGHT), which expect a second
             item, but then the second item is not present.
Resolution : Add guard (item count > 1) to failing branch.
2014-11-15 12:48:29 +01:00
Eliseo Martínez
40cf1a1e74 Fix warnings: spell.c: spell_move_to(): Garbage value: RI.
Problem    : Result of operation is garbage or undefined @ 2238.
Diagnostic : Real issue.
Rationale  : Problem occurs when searching forward starting on an empty
             line. This is, at 2127:
             ```
             p = buf + skip;
             endp = buf + len;
             while (p < endp) {
             ```
             when skip == 0, len == 0, implying p == endp and therefore
             not entering the loop.
             Under those conditions, comparison
             ```
             if (attr == HLF_COUNT)
             ```
             at line 2242 is really using a garbage value for `attr`.
             Most of the time the error doesn't produce visible problems
             as it only affects when dealing with wrapped words.
Resolution : Initialize `attr` at declaration to `HLF_COUNT`, which is
             used in the code when no bad word found yet.
2014-11-15 12:48:29 +01:00
Eliseo Martínez
faa000edcb Fix warnings: spell.c: spell_move_to(): Null arg: FP.
Problem    : Argument with 'nonnull' attribute passed null @ 2118.
Diagnostic : False positive.
Rationale  : Error happens when `if (buflen < len + MAXWLEN + 2) {` is
             not entered on the first iteration, which cannot happen
             because buflen is 0 on the first iteration, so the
             condition should always hold.
Resolution : Assert existence of buffer with appropiate length after
             conditional (which prevents previous error path).
2014-11-15 12:48:29 +01:00
Eliseo Martínez
7d3aac2d71 Fix warnings: spell.c: find_word(): Dead assignment: HI.
Problem    : Dead assignment @ 1602.
Diagnostic : Harmless issue.
Rationale  : Code using this assignment (line 1666) was disabled. Vim's
             tip at Wed Nov 12 13:07:54 2014 +0100 (changeset
             6352:2f7bf5f90f57) hasn't changed this yet.
Resolution : Disable assignment. Directive processors are used for that
             in order to match the way the other code was disabled.
2014-11-15 12:48:29 +01:00
Eliseo Martínez
b02905bdd7 Fix warnings: search.c: find_pattern_in_path(): Np dereference: MI.
Problem    : Dereference of null pointer @ 4395.
Diagnostic : Multithreading issue.
Rationale  : Problem occurs only if global g_do_tagpreview changed while
             funcion is executing.
Resolution : Use local copy of global var.
2014-11-15 12:48:29 +01:00
Eliseo Martínez
78b49ce950 Fix warnings: regexp_nfa.c: nfa_regatom(): Dead assignment: HI.
Problem    : Dead assignment @ 1554.
Diagnostic : Harmless issue.
Rationale  : `result` is used when analyzing if a bracketed expresion
             `[<whatever>]` can be condensed into a character class. Not
             used for anything else anywhere. So, it's safe to remove.
Resolution : Remove dead assingment and move declaration of `result` to
             the scope where it's used.
2014-11-15 12:48:28 +01:00
Eliseo Martínez
83a32aad82 Fix warnings: quickfix.c: qf_add_entry(): Np dereference: FP.
Problem    : Dereference of null pointer @ 921.
Diagnostic : False positive.
Rationale  : If `qi->qf_lists[qi->qf_curlist].qf_count == 0` doesn't
             hold, we should be calling function with nonnull `*prevp`.
Resolution : Assert nonnull.
2014-11-15 12:48:28 +01:00
Eliseo Martínez
3d57bcee7d Fix warnings: option.c: do_set(): Dead assignment: HI.
Problem    : Dead assignment @ 2566.
Diagnostic : Harmless issue.
Rationale  : `nextchar` is used as a lookahead buffer for the character
             next to the currently examined token. Sometimes it also
             saves that char while original string is modified (original
             position of nextchar is nullified for the string to
             terminate there). In summary, it's an auxiliary variable
             with no particular complex meaning. Safe to remove if not
             used.
Resolution : Remove dead assignment.
2014-11-15 12:40:28 +01:00
Justin M. Keyes
b299c011a0 Update README.md 2014-11-14 12:32:03 -05:00
Justin M. Keyes
acce475e80 Update README.md 2014-11-14 12:27:54 -05:00
André Twupack
e199470bd3 vim-patch:7.4.378 #1217
Problem:    Title of quickfist list is not kept for setqflist(list, 'r').
Solution:   Keep the title.  Add a test. (Lcd)

https://code.google.com/p/vim/source/detail?r=v7-4-378
2014-11-14 11:56:25 -05:00
Justin M. Keyes
c347d9226a Merge pull request #1473 from alexgenco/patch-1
Fix api metadata function name in docs
2014-11-14 10:59:18 -05:00
Alex Genco
92aba9e942 Fix api metadata function name in docs
The documentation mentions `vim_get_api_metadata`, but the actual function is `vim_get_api_info`
2014-11-13 21:47:08 -08:00
Justin M. Keyes
c7a3109dd3 Merge #1322 'vim-patch:7.4.421 + vim-patch:7.4.437' 2014-11-13 11:41:50 -05:00
Scott Prager
ca7c509ae0 vim-patch:7.4.437
Problem:    New and old regexp engine are not consistent.
Solution:   Also give an error for "\ze*" for the old regexp engine.

https://code.google.com/p/vim/source/detail?r=v7-4-437
2014-11-13 11:38:19 -05:00
Scott Prager
44635add18 vim-patch:7.4.421
Problem:    Crash when searching for "\ze*". (Urtica Dioica)
Solution:   Disallow a multi after \ze and \zs.

https://code.google.com/p/vim/source/detail?r=v7-4-421
2014-11-13 11:38:19 -05:00
Justin M. Keyes
c5d7d75bb1 Merge pull request #1283 from splinterofchaos/breakindent-tab
vim-patch:7.4.416 + vim-patch:7.4.417
2014-11-12 16:23:27 -05:00
Scott Prager
c92e649a1e vim-patch:7.4.417
Problem:    After splitting a window and setting 'breakindent' the default
            minimum with is not respected.
Solution:   Call briopt_check() when copying options to a new window.

https://code.google.com/p/vim/source/detail?r=v7-4-417
2014-11-12 15:37:56 -05:00
Justin M. Keyes
205ac8d176 Merge pull request #1345 from war1025/dev/wininfo_bools
Convert some values into bools
2014-11-12 11:13:02 -05:00
Wayne Rowcliffe
63e2558870 Convert some values from buffer_defs.h to bools 2014-11-12 00:38:34 -06:00
Justin M. Keyes
8da78bc3ae Merge pull request #1320 from splinterofchaos/ll-lock
vim-patch:7.4.419
2014-11-11 23:04:09 -05:00
Scott Prager
24ebb018e2 vim-patch:7.4.416
Problem:    Problem with breakindent/showbreak and tabs.
Solution:   Handle tabs differently. (Christian Brabandt)

https://code.google.com/p/vim/source/detail?name=v7-4-416
2014-11-11 12:51:58 -05:00
Justin M. Keyes
b1e06c6d60 Merge pull request #1282 from splinterofchaos/cmd-undef
vim-patch:7.4.414 + vim-patch:7.4.415
2014-11-11 12:46:08 -05:00
Justin M. Keyes
b027e1ed0c Merge pull request #923 from splinterofchaos/normal-bool
Use bool in normal.h and .c.
2014-11-11 12:13:00 -05:00
Scott Prager
96be11f609 vim-patch:7.4.419
Problem:    Whan part of a list is locked it's possible to make changes.
Solution:   Check if any of the list items is locked before make a change.
            (ZyX)

https://code.google.com/p/vim/source/detail?r=v7-4-419
2014-11-11 12:05:51 -05:00
Scott Prager
bffea01c89 vim-patch:7.4.415
Problem:    Cannot build.  Warning for shadowed variable. (John Little)
Solution:   Add missing change.  Remove declaration.

https://code.google.com/p/vim/source/detail?name=v7-4-414&r=20dbceb6f4713ccd01be45dc531abc269fbb7579
2014-11-11 11:55:59 -05:00
Scott Prager
0051a7cb25 vim-patch:7.4.414
Problem:    Cannot define a command only when it's used.
Solution:   Add the CmdUndefined autocommand event. (partly by Yasuhiro
            Matsumoto)

https://code.google.com/p/vim/source/detail?r=v7-4-414
2014-11-11 11:55:59 -05:00
Scott Prager
8390accde7 Fix fileio.c's diagram. 2014-11-11 11:55:58 -05:00
Scott Prager
8eddceb140 normal.c: Replace last TRUE/FALSE/OK/FAIL's w/bool. 2014-11-11 11:34:58 -05:00
Scott Prager
38e8676c00 Use bool in signatures of functions in normal.h.
Return bool from checkclearop, checkclearopq, add_to_showcmd,
find_decl, nv_screengo, get_visual_text, and unadjust_for_sel as these
functions all return either TRUE or FALSE or OK or FAIL, but not MAYBE.

Change to arguments toplevel of normal_cmd, check of
do_check_scrollbind, and locally and thisblock of finddecl, to bools as
they represent predicates.
2014-11-11 11:34:58 -05:00
Scott Prager
9172bf64c2 Use bool or int for local flag variables.
In do_pending_operator(), nv_zet(), nv_indent(), nv_g_cmd(), and more,
replace integer flags with bools when appropriate.

However, do keep the TRUEs and FALSEs of nv_cmds[].cmd_arg. It may store
values other than TRUE or FALSE, so it seems to make sense to use
integral constants.
2014-11-11 11:34:58 -05:00
Scott Prager
e1e7dda24d Use bool in do_mouse().
Change the signature of get_mouse_button() for consistency, and because
only do_mouse() uses it.
2014-11-11 11:34:58 -05:00
Scott Prager
dc7473c680 Use bool in normal_cmd().
Change signature of set_vcount_ca for consistency.
2014-11-11 11:34:58 -05:00
Scott Prager
f5aee19ac0 Use bool for flags in oparg_T.
Several opart_T members like use_reg_one, end_adjusted, empty,
is_VIsual, and block_mode, only ever store TRUE or FALSE, so make this
constraint explicit by changing them to bools, and TRUE to true and
FALSE to false in the context of their uses.

The member, inclusive, has several other uses such as in arithmetic
equations and one inequality, but every single assignment (obtained with
'grep -r "inclusive \\="') sets it to either TRUE or FALSE.

This also implies that the inequality, "oap->end.coladd <
oap->inclusive", can only be true when coladd==0 and inclusive==true, so
test for that instead.

For consistency, change the first argument of findpar (which ends up
being inclusive) to bool.

Include stdbool.h for consistency with issue #918.

This commit shrinks the size of oparg_T from 128 bytes to 112 (-13%) on
my machine.
2014-11-11 11:34:58 -05:00
Justin M. Keyes
e450c541dd Merge pull request #1439 from jszakmeister/shuffle-some-includes
Move many includes down to the EXITFREE block.
2014-11-11 01:13:14 -05:00
John Szakmeister
85842b29eb Merge pull request #1449 from jszakmeister/fix-cmake-module-path-usage
build: fix CMAKE_MODULE_PATH usage
2014-11-10 20:54:52 -05:00
Justin M. Keyes
fc19f0c4c6 Merge pull request #1431 from elmart/clang-analysis-fixes-2
Fix clang analysis warnings. (2)
2014-11-10 20:05:42 -05:00
Eliseo Martínez
a6548e4fb3 Fix warnings: message.c: vim_vsnprintf(): Dead assignment (2): HI.
Problem    : Dead assignment @ 3323.
             Dead assignment @ 3587.
Diagnostic : Harmless issues.
Rationale  : - 3323: Assignment is in fact dead. But, in addition to
               that, `length_modifier` is assigned default value `\0`
               when declared and is untouched in path leading to
               signaled point. So, maintaining assignment adds nothing
               to code.
             - 3587: Assignment is in fact dead. It could be thought
               that `precision_specified` has to be 1 in order to flag
               `precision` as having a valid value. But that doesn't
               seem to be the case, as there are places in the code
               where `precision` gets assigned a default value, even if
               `precision_specified` is 0. So, maintaining assignment
               adds nothing to code.
Resolution : Remove dead assignments.
2014-11-11 01:43:14 +01:00
Eliseo Martínez
5bf6639e0f Fix warnings: message.c: delete_first_msg(): Np dereference: FP.
Problem    : Dereference of null pointer @ 693.
Diagnostic : False positive.
Rationale  : Error condition occurs if `delete_first_msg` is entered two
             consecutive times, the firt of which sets leaves history
             empty. But, in that case, second entrance should leave at
             the `return FAIL`, and thus cannot reach the pointer
             dereference.
Resolution : Assert history will be empty after first entrance.
2014-11-11 01:43:14 +01:00
Eliseo Martínez
8bb2c2c074 Fix warnings: memory.c: xcalloc(): 0 size calloc: CW.
Problem    : Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)
             @ 148.
Diagnostic : Cautionary warning.
Rationale  : Reported circumstance (calling calloc with requesting 0
             size allocation) can occur, and it's not an issue. It's
             perfectly legal doing so, though result is implementation
             dependant. A given implementation can return NULL or a
             valid pointer, so that free() can be called on it later the
             same as if it was a real pointer. Such a pointer should not
             be dereferenced, though.
             Now, for some reason I can't explain, compiler is warning
             us in the case of calloc, but not in the case of malloc,
             which is doing the same.
Resolution : Refactor memory functions to avoid using implementation
             dependant behaviour.
             Proposed code is neater to read, and it avoids calling
             system memory functions with size 0, thus behaving the same
             everywhere.
             Note that semantics for xmalloc/xcalloc is slightly
             changed:
             - Previously, an implementation that returns a valid
               pointer on malloc/calloc with 0 size, would return that
               pointer to xmalloc/xcalloc caller.
             - Currently, a regular pointer is always returned.
2014-11-11 01:43:13 +01:00
Eliseo Martínez
51080737df Fix warnings: hardcopy.c: mch_print_text_out(): Bad free: FP + RI.
Problem    : Bad free @ 3058.
Diagnostic : False positive uncovering a real issue.
Rationale  : Signaled error occurs if p gets assigned `(char_u*)""` at
             line 3009 and then is freed at line 3058. But that cannot
             happen because of the last guard condition before `free`
             (`*p != NUL`). So, signaled error is a false positive.
             Now, examining this code more carefully reveals a real
             issue: not freeing an empty string may not be always
             correct, as an empty (but allocated) string could also be
             returned in `p = string_convert(&prt_conv, p, &len);` if
             passed '&len' points to 0). Which would in fact be a memory
             leak.
Resolution : Remove the exceptional case. Make p always point to
             allocated memory, and always free it, when `prt_do_conv` is
             on.
2014-11-11 01:43:13 +01:00
Eliseo Martínez
6d057a2ca5 Fix warnings: fileio.c: aucmd_prepbuf(): Np dereference: FP.
Problem    : Dereference of null pointer @ 6219.
Diagnostic : False positive.
Rationale  : Problem occurs if `aucmd_win` is NULL after
             `win_alloc_aucmd_win()`, which cannot happen since it uses
             new memory functions. So, this is a leftover since OOM
             refactorization.
Resolution : Remove dead code.
2014-11-11 01:43:13 +01:00
Eliseo Martínez
4e02a1bf46 Fix warnings: fileio.c: readfile(): Dead assignment: HI.
Problem    : Dead assignment @ 1754.
Diagnostic : Harmless issue.
Rationale  : It's true `iconv_fd` is not going to be used again (we are
             in the failure handler). But what is being done (assigning
             sentinel value to mark as "empty" after destroying) is in
             fact good practice, which could turn significant if more
             code is added later on. So, we don't want to remove this.
Resolution : Leave it there, but exclude from analysis.
2014-11-11 01:43:13 +01:00
Eliseo Martínez
1002e3fe1d Fix warnings: fold.c: get_foldtext(): Np dereference: FP.
Problem    : Dereference of null pointer @ 1701.
Diagnostic : False positive.
Rationale  : Comparison `last_wp != wp` just after initializing
             `last_wp` to NULL makes the compiler think `wp` can be
             null. Error appears then on codepath assuming comparison is
             false (i.e. `wp` is null).
Resolution : Change order of OR clauses.
             That seems not to give motives for the analyzer to check
             the `wp` null path and removes the warning.
             But potential null dereference is still there, so we add
             the nonnull annotation to `wp` parameter.
2014-11-11 01:43:13 +01:00
Eliseo Martínez
d6472f459b Fix warnings: ex_getln.c: init_history(): Double free: FP.
Problem    : Double free @ 4249.
Diagnostic : False positive.
Rationale  : Codepath leading to error contains two consecutive
             iterations in which `if (--j < 0)` is true.
             That executes `free` two consecutive times with the same
             value (hislen - 1) for j, with leads to double free.
             Now, that can only happen with j == 0 && hislen == 1.
             And that would imply j == hisidx[type] too, which would
             take the following break.
             So, the error codepath cannot really happen, but the
             compiler cannot deduce the last implication.
Resolution : We have two possible solutions for this:
             1.- Comparing value of j before and after updating it,
                 and breaking out of iteration if equal.
                 That changes nothing in functionality, but teaches the
                 compiler his proposed error codepath is impossible.
             2.- Nullify pointer after freeing.
                 This way, the compiler still thinks his error codepath
                 is possible, but it's not an error anymore, as
                 free(NULL) is a no-op.
             We opt for solution 2, as solution 1 requires adding
             logic that adds nothing (and having to explain that clearly
             in aside comments) just for the purpose of silencing
             warning. On the other hand, solution 2 improves the code,
             adding something considered good practice in any case,
             and therefore doesn't require further explanation.
2014-11-11 01:43:12 +01:00
Eliseo Martínez
ea1f883b19 Fix warnings: ex_eval.c: report_pending(): Np dereference: FP.
Problem    : Dereference of null pointer @ 711.
Diagnostic : False positive.
Rationale  : Codepath producing error invokes this function with values
             `action=RPC_DISCARD, pending=CSTP_FINISH, value=NULL`.
             Now, for some reason, the analyzer is remembering that
             `value` is null, and that `action` is `RPC_DISCARD`, but
             it's not remembering that `pending` is `CSTP_FINISH`.
             Then, it's taking the wrong branch in the switch for
             `pending`. That path would never occur invocating the
             function with those values.
Resolution : Assert function precondition between `pending` and `value`.
             This is, let the compiler know that `value` being null
             implies `pending` not containing `CSTP_THROW`.
2014-11-11 01:43:12 +01:00
Eliseo Martínez
1575642b11 Fix warnings: ex_docmd.c: eval_vars(): Unitialized arg: FP.
Problem    : Uninitialized argument value @ 7704.
Diagnostic : False positive.
Rationale  : Error occurs if `switch(spec_idx)` doesn't enter any case,
             which should not occur after
             `spec_idx = find_cmdline_var(...)` returned non-negative.
Resolution : Add default clause to switch and error if reached.
2014-11-11 01:43:12 +01:00