Skip to content

Conversation

ZyX-I
Copy link
Contributor

@ZyX-I ZyX-I commented Apr 1, 2018

This also updates report format to fullhtml: a new fancy html format similar to PVS-studio competitors.

ZyX-I added 6 commits April 2, 2018 00:07
Condition was checked in surrounding if().
Should actually be silencing that for the sake of the case when `long` is 
actually not 64-bit. But it appears that Vim had already defined maximal line 
number. And even declared that exact value invalid, so no need in silencing.
These kinds of warnings are inevitable for generic macros.
ZyX-I added 9 commits April 9, 2018 10:29
It appears that transchar() was working under assumption that 
`transchar_nonprint()` may be used for multibyte characters while its 
documentation stated exact opposite. It was not actually untrue though, except 
that longer buffer would be needed then the one stated in documentation. But it 
is false now with assert().
No idea why it thinks that pre is constant expression, but switch() may be 
removed.
ZyX-I added 5 commits April 10, 2018 01:51
It is unsigned, zero length would already cause early return and length 1 is 
checked earlier in the same condition.
It is hard to say whether it actually is uninitialized, need to go deeper into 
regex code. Probably analyzer did not go that far as regmatch for sure would not 
be initialized up until calling NFA/DFA engine functions, which is to be done by 
pointer.
I failed to deduce why analyzer thinks E882 may not be triggered, though 
conditions for triggering it are strange: it would trigger E882 only in the 
single case “function returned non-number”. Cases “function thrown exception”, 
or “built-in sorter encountered error” will neither yield E882 nor stop 
sort()/uniq().

Note though that searching test code revealed that neither E702 nor E882 are not 
tested anywhere.
@ZyX-I ZyX-I changed the title [WIP] Fix errors reported by PVS [RFC] Fix errors reported by PVS Apr 22, 2018
@ZyX-I
Copy link
Contributor Author

ZyX-I commented Apr 22, 2018

There are only three errors left, of which I am unsure what to do. What is left in error file is specifically

www.viva64.com/en/w:1:1: error: Help: The documentation for all analyzer warnings is available here: https://www.viva64.com/en/w/.
./src/nvim/event/socket.c:255:1: error: V547 Expression 'status == 0' is always false.
./build/src/nvim/auto/funcs.generated.h:127:1: error: V011 Presence of #line directives may cause some diagnostic messages to have incorrect file name and line number.
./src/nvim/quickfix.c:4833:1: warning: V560 A part of conditional expression is always false: qi != save_qi.
./src/nvim/regexp.c:4314:1: warning: V560 A part of conditional expression is always true: status != 1.

, unsure about socket, regexp and quickfix errors. One was reported as vim/vim#2838 and is supposed to be a true error, other two are probably false positives.

@marvim marvim added RFC and removed WIP labels Apr 22, 2018
@justinmk
Copy link
Member

justinmk commented Apr 22, 2018

./src/nvim/event/socket.c:255:1: error: V547 Expression 'status == 0' is always false.

@bfredl This looks legitimate. I don't see *status getting set in any of the callbacks. connect_cb sets *ret_status. But I would think status != 1 comparison is subject to compiler optimizations, maybe it should look like *(&status) != 1 or should somehow avoid being stack-allocated ...

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Apr 22, 2018

Is not *&var a perfect candidate for reducing to var in one of the optimization passes? It is not uncommon to have exactly that as a result of macro expansions. To force compiler not optimize that out there is volatile, not *&var hack. (Maybe *((volatile type *)&var), will also work but I am not sure.)

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Apr 22, 2018

Though I do not think compiler will actually optimize that out. Pointer to status is clearly stored into a structure whis is in turn passed by reference somewhere outside of the current compilation unit. There would need to be a hell lot of flow analysis on linking stage (note: “outside of compilation unit” is libuv library, it basically only has headers and machine code for analysis) to prove that LOOP_PROCESS_EVENT_UNTIL (specifically, loop_poll_events()) may not actually change state. Compilers do not go that far.

@bfredl
Copy link
Member

bfredl commented Apr 22, 2018

@justinmk if it was legitimate, neovim could never possibly connect to a socket... Taking the address of a local variable has a well defined meaning in C, an optimization should not deviate from well-defined behavior. (issue would be if threads or signal handlers are involved, but they are not).

@justinmk
Copy link
Member

@bfredl Legitimate in the sense that PVS knows about some optimization or other condition that could be a risk.

@bfredl
Copy link
Member

bfredl commented Apr 22, 2018

The second half of my comment addresses that. Passing the address of a local varable down in the stack is well-defined behavior. Optimizers cannot randomly change the meaning of well-defined behavior to achieve performance, otherwise there wouldn't be much point of a language spec.

@justinmk
Copy link
Member

justinmk commented Apr 22, 2018

You don't have to convince me, I don't claim to know what PVS thinks. But I also don't see any reason not to change it to a static variable or something like that, if that eliminates the warning, which could be legitimate for a reason we don't know.

Do you think PVS made a mistake, and why?

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Apr 22, 2018

I normally just silence those with // -V… comment. BTW, tests succeeded except for QB with

test/functional/eval/timer_spec.lua @ 78
Failure message: test/functional/eval/timer_spec.lua:84: Expected objects to be the same.
Passed in:
(boolean) false
Expected:
(boolean) true
stack traceback:
test/functional/eval/timer_spec.lua:84: in function <test/functional/eval/timer_spec.lua:78>

test/functional/eval/timer_spec.lua @ 88: timers can invoke redraw in blocking getchar() call

which looks like unrelated failure.

@bfredl
Copy link
Member

bfredl commented Apr 22, 2018

@justinmk The PVS warning is a direct falsehood, so it doesn't imply anything to me. Simplest would be to just silence it. Making a variable static which doesn't make use of static behavior is only confusing.

@ZyX-I
Copy link
Contributor Author

ZyX-I commented Apr 22, 2018

I also do not claim to know how PVS thinks, but it is not the first error where flow analysis clearly cannot grasp the fact that reference to value is passed (or worse, exists before entering function) somewhere where referenced value may be edited.

@justinmk
Copy link
Member

./src/nvim/event/socket.c:255:1: error: V547 Expression 'status == 0' is always false.

Let's supress this one then.

./build/src/nvim/auto/funcs.generated.h:127:1: error: V011 Presence of #line directives may cause some diagnostic messages to have incorrect file name and line number.

Instead of excluding V011 should we avoid producing #line directives in .generated.* files?

///< start with <SNR>123_ (<SNR> is K_SPECIAL
///< KS_EXTRA KE_SNR)
char_u uf_name[]; ///< Name of function; can start with <SNR>123_
///< (<SNR> is K_SPECIAL KS_EXTRA KE_SNR)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

related: #223

@@ -2682,19 +2682,21 @@ void ex_call(exarg_T *eap)
return;
}

tofree = trans_function_name(&arg, eap->skip, TFN_INT, &fudi, &partial);
tofree = trans_function_name(&arg, false, TFN_INT, &fudi, &partial);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assert(!eap->skip) after the if (eap->skip) check to guard against future changes?

@justinmk justinmk merged commit 53f11dc into neovim:master Apr 27, 2018
@justinmk justinmk removed the RFC label Apr 27, 2018
@ZyX-I ZyX-I deleted the pvs-fixes branch April 29, 2018 22:10
justinmk added a commit to justinmk/neovim that referenced this pull request May 20, 2018
justinmk added a commit that referenced this pull request Jun 11, 2018
FEATURES:
3cc7ebf #7234 built-in VimL expression parser
6a7c904 #4419 implement <Cmd> key to invoke command in any mode
b836328 #7679 'startup: treat stdin as text instead of commands'
58b210e :digraphs : highlight with hl-SpecialKey #2690
7a13611 #8276 'startup: Let `-s -` read from stdin'
1e71978 events: VimSuspend, VimResume #8280
1e7d5e8 #6272 'stdpath()'
f96d99a #8247 server: introduce --listen
e8c39f7 #8226 insert-mode: interpret unmapped META as ESC
98e7112 msg: do not scroll entire screen (#8088)
f72630b #8055 let negative 'writedelay' show all redraws
5d2dd2e win: has("wsl") on Windows Subsystem for Linux #7330
a4f6cec cmdline: CmdlineEnter and CmdlineLeave autocommands (#7422)
207b7ca #6844 channels: support buffered output and bytes sockets/stdio

API:
f85cbea #7917 API: buffer updates
418abfc #6743 API: list information about all channels/jobs.
36b2e3f #8375 API: nvim_get_commands
273d2cd #8329 API: Make nvim_set_option() update `:verbose set …`
8d40b36 #8371 API: more reliable/descriptive VimL errors
ebb1acb #8353 API: nvim_call_dict_function
9f994bb #8004 API: nvim_list_uis
3405704 #7520 API/UI: forward option updates to UIs
911b1e4 #7821 API: improve nvim_command_output

WINDOWS OS:
9cefd83 #8084, #8516 build/win: support MSVC
ee4e1fd win: Fix reading content from stdin (#8267)

TUI:
ffb8904 #8309 TUI: add support for mouse release events in urxvt
8d5a46e #8081 TUI: implement "standout" attribute
6071637 TUI: support TERM=konsole-256color
67848c0 #7653 TUI: report TUI info with -V3 ('verbose' >= 3)
3d0ee17 TUI/rxvt: enable focus-reporting
d109f56 #7640 TUI: 'term' option: reflect effective terminal behavior

FIXES:
ed6a113 #8273 'job-control: avoid kill-timer race'
4e02f1a #8107 'jobs: separate process-group'
451c48a terminal: flush vterm output buffer on pty output #8486
5d6732f :checkhealth fixes #8335
53f11dc #8218 'Fix errors reported by PVS'
d05712f inccommand: pause :terminal redraws (#8307)
51af911 inccommand: do not execute trailing commands #8256
84359a4 terminal: resize to the max dimensions (#8249)
d49c1dd #8228 Make vim_fgets() return the same values as in Vim
60e96a4 screen: winhl=Normal:Background should not override syntax (#8093)
0c59ac1 #5908 'shada: Also save numbered marks'
ba87a2c cscope: ignore EINTR while reading the prompt (#8079)
b1412dc #7971 ':terminal Enter/Leave should not increment jumplist'
3a5721e TUI: libtermkey: force CSI driver for mouse input #7948
6ff13d7 #7720 TUI: faster startup
1c6e956 #7862 TUI: fix resize-related segfaults
a58c909 #7676 TUI: always hide cursor when flushing, never flush buffers during unibilium output
303e1df #7624 TUI: disable BCE almost always
249bdb0 #7761 mark: Make sure that jumplist item will not have zero lnum
6f41ce0 #7704 macOS: Set $LANG based on the system locale
a043899 #7633 'Retry fgets on EINTR'

CHANGES:
ad60927 #8304 default to 'nofsync'
f3f1970 #8035 defaults: 'fillchars'
a6052c7 #7984 defaults: sidescroll=1
b69fa86 #7888 defaults: enable cscopeverbose
7c4bb23 defaults: do :filetype stuff unless explicitly "off"
2aa308c #5658 'Apply :lmap in macros'
8ce6393 terminal: Leave 'relativenumber' alone (#8360)
e46534b #4486 refactor: Remove maxmem, maxmemtot options
131aad9 win: defaults: 'shellcmdflag', 'shellxquote' #7343
c57d315 #8031 jobwait(): return -2 on interrupt also with timeout
6452831 clipboard: macOS: fallback to tmux if pbcopy is broken #7940
300d365 #7919 Make 'langnoremap' apply directly after a map
ada1956 #7880 'lua/executor: Remove lightuserdata'

INTERNAL:
de0a954 #7806 internal statistics for list impl
dee78a4 #7708 rewrite internal list impl
/// Also gets up to #MAX_MCO composing characters.
///
/// @param[out] pcc Location where to store composing characters. Must have
/// space at least for #MAX_MCO + 1 elements.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ZyX-I , why #MAX_MCO + 1 instead of #MAX_MCO elements. It looks like the terminating NUL is not written if at least MAX_MCO composing characters are in the string.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I suspect I was going to refactor that into a saner version which has terminating zero always, but got distracted.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants