jobstart: Check prg arguments for NULL.
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.
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.
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.
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.
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.
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).
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.
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.
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).
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.
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.
Fix warnings: syntax.c: syn_regexec(): Uninitialized arg: MI.

Problem    : Uninitialized argument value @ 2863.
Diagnostic : Multithreading issue.
Rationale  : Error can only occur if global `syn_time_on` is changed
             while the function is executing.
Resolution : Use local copy of gloval var.
Fix warnings: syntax.c: get_id_list(): Double free: FP.

Problem    : Double free @ 5213.
Diagnostic : False positive.
Rationale  : Suggested error path contains two consecutive invocations
             of `ends_excmd(*p)` having different results, which is not
             possible. First invocation is before the while loop. Second
             invocation is the while loop condition itsef.
Resolution : Refactor while loop into do-while loop. That removes the
             impossible path from analysis, and, in addition, is a bit
             more efficient.
Fix warnings: undo.c: u_blockfree(): Use after free: FP.

Problem    : Use-after-free @ 2686.
Diagnostic : False positive.
Rationale  : Suggested error path is taking false branch
             `uhp->uh_next.ptr != NULL` @ 2506, which cannot happen when
             `uhp == buf->b_u_oldhead`.
Resolution : Assert `buf->b_u_oldhead` is changed after freeing old one.
Fix warnings: charset.c: win_lbr_chartabsize(): Dead assignment: HI.

Problem    : Dead assignment @ 1037.
Diagnostic : Harmless issue.
Rationale  : `tab_corr` is in effect unused after signaled point.
             Previous code using it after that point was removed at
             24ebb018e28187c61900b1616e4f79fec9d70878.
Resolution : Remove dead assignment. As only one usage remains, remove
             variable and inline the only usage.
Merge pull request #1460 from elmart/clang-analysis-fixes-3

Fix clang analysis warnings. (3)
Merge pull request #1471 from splinterofchaos/fix-jobstart

jobstart: Check prg arguments for NULL.
Fix warnings: tag.c: test_for_static()/get_tags(): Various (2): FP.

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.
Fix warnings: tag.c: jumpto_tag(): Np dereference: MI.

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.