aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAge
* test: Fix problems in job_spec.luaThiago de Arruda2014-11-21
| | | | | | | | | Nvim wasn't exiting cleanly in some job tests due to errors. This can't be noticed until the next commit, which will perform a refactoring to selectively process K_EVENT, so the `qa!` command executed at the end of each test blocks forever if there are errors which require the user to press ENTER(in that state Nvim no longer will process events).
* test: Refactor functional helpers to use vim_inputThiago de Arruda2014-11-21
| | | | | | | | | | | | | | | | | | | The vim_input function accepts raw terminal input and so is better to emulate real user, especially because it is not deferred as vim_feedkeys. Using this function required a number of changes: - expect() was refactored to use curbuf_contents() - The vim_eval function in request() was moved to curbuf_contents(). For most cases this is enough(we only care for synchronizing api calls with user input when verifying buffer contents). - <C-@>(NUL) is preprocessed before being passed to replace_termcodes. - Legacy test 4 had a bug that only became visible when using vim_input, it is fixed now. - An extra blank line deletion was required for test 101 The last two items show that vim_feedkeys because it is not 100% equivalent to receiving terminal input.
* input: Refactor to ensure user input has higher priorityThiago de Arruda2014-11-21
|
* Merge PR #1515 'Refer to plugins running outside Nvim as "remote plugins"'Thiago de Arruda2014-11-21
|\
| * runtime: Refer to plugins running outside Nvim as "remote plugins"Thiago de Arruda2014-11-21
|/ | | | | | - Rename autoload/rpc to autoload/remote - External plugins are now remote plugins - External plugins directory is "rplugin"
* Merge pull request #1373 from elmart/fix-outofdate-docJustin M. Keyes2014-11-21
|\ | | | | Fix outdated doc: Connecting to nvim through python REPL.
| * Fix warnings: Fix outdated doc: Connecting to nvim through python REPL.Eliseo Martínez2014-11-21
|/ | | | | After neovim/python-client@b8b48bbe8fe9ee41ad73c9bd5a45e808504399e2, docs were no longer relevant.
* Merge PR #1420 'Migrate legacy tests (2nd batch)'Thiago de Arruda2014-11-20
|\
| * legacy tests: migrate test105Rainer Borene2014-11-20
| |
| * legacy tests: migrate test26Rainer Borene2014-11-20
| |
| * legacy tests: migrate test101Rainer Borene2014-11-20
| |
| * legacy tests: migrate test75Rainer Borene2014-11-20
| |
| * legacy tests: migrate test51Rainer Borene2014-11-20
| |
| * legacy tests: migrate test43Rainer Borene2014-11-20
| |
| * legacy tests: migrate test33Rainer Borene2014-11-20
| |
| * legacy tests: migrate test67Rainer Borene2014-11-20
| |
| * legacy tests: migrate test66Rainer Borene2014-11-20
| |
| * legacy tests: migrate test25Rainer Borene2014-11-20
| |
| * legacy tests: migrate test104Rainer Borene2014-11-20
| |
| * legacy tests: implement :source helper method.Rainer Borene2014-11-20
| |
| * legacy tests: remove test21 filesRainer Borene2014-11-20
| |
| * legacy tests: migrate test5Rainer Borene2014-11-20
|/
* Merge PR #1504 'Change external plugin dir, manifest and improve docs'Thiago de Arruda2014-11-20
|\
| * doc: Add nvim_provider/external_plugin to doc MakefileThiago de Arruda2014-11-20
| |
| * doc: Update external plugin documentationThiago de Arruda2014-11-20
| |
| * runtime: Prepend the vimrc filename to the external plugin manifestThiago de Arruda2014-11-20
| | | | | | | | | | This is required to support multiple vimrcs with each having it's own set of installed external plugins.
| * runtime: Change external plugin directory to "external-plugin"Thiago de Arruda2014-11-20
|/
* Merge pull request #1488 from fwalch/invert-wconversionJustin M. Keyes2014-11-19
|\ | | | | Invert -Wconversion handling & fix some warnings.
| * Wconversion: Fix warnings in digraph.c.Florian Walch2014-11-19
| |
| * Wconversion: Fix warnings in cursor_shape.c.Florian Walch2014-11-19
| |
| * CMake: Set -Wconversion by default.Florian Walch2014-11-19
|/
* Merge pull request #1478 from elmart/clang-analysis-fixes-4Justin M. Keyes2014-11-19
|\ | | | | Fix clang analysis warnings. (4)
| * Fix warnings: eval.c: f_rpcrequest(): Garbage value: MI.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | Problem : Assigned value is garbage or undefined @ 12578. Diagnostic : Multithreading issue. Rationale : Error can only occur if global `provider_call_nesting` is changed while function is executing. Resolution : Use local copy of global.
| * Fix warnings: screen.c: screenalloc(): Np arg (2): MI.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | Problems : Null pointer argument in call to memory copy function @ 6465. Null pointer argument in call to memory copy function @ 6475. Diagnostic : Multithreading issues. Rationale : Problem occurs if globals `enc_utf8` and `enc_dbcs` are modified while function is executing. Resolution : Use local copy of globals.
| * Fix warnings: eval.c: do_return(): Np dereference: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 18841. Diagnostic : False positive. Rationale : Suggested error path takes `reanimate` branch at 18827, assigning `rettv = current_funccal->rettv`. Then, inmediately after, it supposes rettv is null, which cannot happen, since current_funccal->rettv should always be non null. Resolution : Assert current_funccal->rettv non null.
| * Fix warnings: eval.c: add_nr_var(): Out of bounds: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Out-of-bound array access @ 18737. Diagnostic : False positive. Rationale : Situation is intentional. `dictitem_T` is a prefix all dict items whill share, but actual size of each item will be different depending on its key length. `di_key` array field is declared of size 1 just to have a field name, but real size will vary for each item. Resolution : Make analyzer ignore it. This could be refactored to use C99-allowed variable length arrays, but eval.c is bound to dissappear, so no effort is done in that sense.
| * Fix warnings: eval.c: call_user_func(): Out of bounds: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Out-of-bound array access @ 18429. Diagnostic : False positive. Rationale : Situation is intentional. `dictitem_T` is a prefix all dict items whill share, but actual size of each item will be different depending on its key length. `di_key` array field is declared of size 1 just to have a field name, but real size will vary for each item. Resolution : Make analyzer ignore it. This could be refactored to use C99-allowed variable length arrays, but eval.c is bound to dissappear, so no effort is done in that sense.
| * Fix warnings: eval.c: get_user_func_name(): Np dereference: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 18216. Diagnostic : False positive. Rationale : `hi` and `done` are static. Intended usage is for the first call to have idx == 0, so that they are initialized. Resolution : Assert hi after (optional) initialization.
| * Fix warnings: eval.c: clear_tv(): Bad free: RI.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Bad free @ 16076. Diagnostic : Real issue. Rationale : A non-allocated string is set at 4127, which later on can be tried to be freed if aborting. Resolution : Detect particular case (func with empty name) and don't free in that case. Another solution (use allocated string) was tried before, but it produced a leak difficult to solve. Finally applied solution works, but it produces a new false positive warning (Np dereference at 13763), deactivated by `assert(ptrs[i].item->li_next)`.
| * Fix warnings: eval.c: item_compare(): Garbage value: MI.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Result of operation is garbage or undefined @ 13565. Diagnostic : Multithreading issue. Rationale : Problem occurs only if global (static) variable `item_compare_keep_zero` changes after being used by `do_sort_uniq` but before being used by `item_compare` or `item_compare2`. Resolution : This is not an intra-function problem, as other MI's before, but rather an inter-function one. Thus, it can't be solved by using local copy of global. Therefore, we are forced to do a bit refactoring. We can't simply add a bool param to item_compare/item_compare2, as they couldn't be passed to qsort() that way. So, item_compare/item_compare2 are added a bool param and curried versions of them are added and used in their place.
| * Fix warnings: eval.c: dictitem_alloc(): Out-of-bounds access: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Out-of-bound array access @ 5737. Diagnostic : False positive. Rationale : Situation is intentional. `dictitem_T` is a prefix all dict items whill share, but actual size of each item will be different depending on its key length. `di_key` array field is declared of size 1 just to have a field name, but real size will vary for each item. Resolution : Make analyzer ignore it. This could be refactored to use C99-allowed variable length arrays, but eval.c is bound to dissappear, so no effort is done in that sense.
| * Fix warnings: eval.c: set_var_lval(): Np dereference: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 2273. Diagnostic : False positive. Rationale : Suggested error would happen when assigning an rvalue with more items than the lvalue. Then we would enter conditional at: ``` if (lp->ll_li->li_next == NULL) { /* Need to add an empty item. */ list_append_number(lp->ll_list, 0); } lp->ll_li = lp->ll_li->li_next; ``` Analyzer thinks the value assigned to lp->ll_li is still NULL and is hit on the next iteration. Resolution : Assert lp->ll_li->li_next is not null anymore after list_append_number().
| * Fix warnings: window.c: tabline_height(): Np dereference: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 4978. Diagnostic : False positive. Rationale : tabline_height() shouldn't be called when a tab doesn't exist yet (this is, before initialization). Resolution : Assert function precondition.
| * Fix warnings: window.c: win_drag_vsep_line(): Np dereference: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 4512. Diagnostic : False positive. Rationale : Suggested error path implies `fr == NULL` after 4504. That's not possible, because: - curfr and curfr->next must be both nonnull, as we are dragging the divider between the two. - after conditional, fr is one of those two (the one that grows). Resolution : Assert fr.
| * Fix warnings: window.c: winframe_remove(): Np dereference: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 2196. Diagnostic : False positive. Rationale : Suggested error path implies `frp->child == NULL` while being under condition `frp2->fr_layout == frp->fr_layout`, which is impossible: - If frp2 is frp's parent, then frp2's layout is FR_COL or FR_ROW; - if frp->child is NULL, the frp's layout is FR_LEAF. - Therefore, they can't be equal. Resolution : Assert frp->child not null.
| * Fix warnings: window.c: win_rotate(): Np dereference: FP.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 1268. Diagnostic : False positive. Rationale : Suggested error path implies current window's frame to be the only child of its parent, which is ruled out by `if (firstwin == lastwin) {` check at the beginning. Resolution : Assert another child remains after removing current frame. Strictly, assert is only needed in false branch of conditional, but we add it the same in the true branch to reduce reader surprise. Several forms of a single assert after `if (firstwin == lastwin) {` were tried, but analyzer cannot follow implications that way.
| * Fix warnings: tag.c: get_tags(): Uninitialized arg: RI.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem : Uninitialized argument value @ 2798. Diagnostic : Real issue. Rationale : Tags doesn't have to have a kind. When they have one, both `tp.tagkind` and `tp.tagkind_end` are nonnull. But when they don't, `tp.tagkind` will we null (but defined), while `tp.tagkind_end` will be undefined. Therefore, reported invocation is indeed using a garbage value for a tag with no kind. Problem doesn't have consequences because `add_tag_field()` doesn't use `end` param if `start` param is null. Resolution : Don't use `tp.tagkind_end` if `tp.tagkind` is null.
| * Fix warnings: tag.c: jumpto_tag(): Np dereference: MI.Eliseo Martínez2014-11-18
| | | | | | | | | | | | | | | | Problem : Dereference of null pointer @ 2399. Diagnostic : Multithreading issue. Rationale : Error can only occur if global `g_do_tagpreview` changes while the function is executing. Resolution : Use local copy of global var.
| * Fix warnings: tag.c: test_for_static()/get_tags(): Various (2): FP.Eliseo Martínez2014-11-18
|/ | | | | | | | | | | | | | | | | | | Problems : Assigned value is garbage or undefined @ 2191. Uninitialized argument value @ 2796. Diagnostic : False positives. Rationale : Both problems share the same cause. Error happens in get_tags(), if parse_match() fails because of parse_tag_line() failing before. Then, `tp` is not correctly initialized and subsequent code accesses garbage values. This is not really possible, as parse_tag_line() should not fail after find_tags() has been successful. That is because find_tags() already does tag line parsing, using parse_tag_line() itself for it (or a quicker alternative that should produce same result). That's why return value of parse_match() is ignored, and subsequent code assumes it is successful. Resolution : Assert parse_match() always successful.
* Merge PR #1454 'Refactor plugin system'Thiago de Arruda2014-11-18
|\