aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliseo Martínez <eliseomarmol@gmail.com>2014-12-17 15:25:59 +0100
committerEliseo Martínez <eliseomarmol@gmail.com>2014-12-17 21:45:01 +0100
commit693da009204f058494ef32dc5ce5c5d4298a61d6 (patch)
treee5fdfe06ca3d34e496dc2d8d371b443c3762c432
parent10a45846dc959f8b3ab9436f0809e90d1adf4ee4 (diff)
downloadrneovim-693da009204f058494ef32dc5ce5c5d4298a61d6.tar.gz
rneovim-693da009204f058494ef32dc5ce5c5d4298a61d6.tar.bz2
rneovim-693da009204f058494ef32dc5ce5c5d4298a61d6.zip
Fix warnings: option.c: makeset()/put_setnum(): Various (3): FP.
Problems : Dereference of null pointer @ 6251. Dereference of null pointer @ 6267. Dereference of null pointer @ 6351. Diagnostic : False positive. Rationale : Problems occur if varp is null after `varp = get_varp_scope(p, opt_flags);`. That can only happen if option is hidden. Those are options that can be set (for backwards compatibility reasons) but that do nothing (see `:h hidden-options`, `:h missing-options`). In particular, even if setting them is allowed, value is not stored, so these options have no real value. So, suggested error paths should not occur, as checks comparing option value and default value should discard them. Resolution : We could just `assert(varp)` before line 6235 `varp_local = varp;`. That was tried and worked. But we prefer modifying the code to explicitly skip hidden options. A redundant `!istermoption(p)` is removed too (it's already checked by for loop condition).
-rw-r--r--src/nvim/option.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c
index c1ab3f2ee5..2b3c87511e 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -6196,15 +6196,17 @@ int makeset(FILE *fd, int opt_flags, int local_only)
int pri;
/*
- * The options that don't have a default (terminal name, columns, lines)
- * are never written. Terminal options are also not written.
+ * Some options are never written:
+ * - Options that don't have a default (terminal name, columns, lines).
+ * - Terminal options.
+ * - Hidden options.
+ *
* Do the loop over "options[]" twice: once for options with the
* P_PRI_MKRC flag and once without.
*/
for (pri = 1; pri >= 0; --pri) {
for (p = &options[0]; !istermoption(p); p++)
if (!(p->flags & P_NO_MKRC)
- && !istermoption(p)
&& ((pri == 1) == ((p->flags & P_PRI_MKRC) != 0))) {
/* skip global option when only doing locals */
if (p->indir == PV_NONE && !(opt_flags & OPT_GLOBAL))
@@ -6215,8 +6217,11 @@ int makeset(FILE *fd, int opt_flags, int local_only)
if ((opt_flags & OPT_GLOBAL) && (p->flags & P_NOGLOB))
continue;
- /* Global values are only written when not at the default value. */
varp = get_varp_scope(p, opt_flags);
+ /* Hidden options are never written. */
+ if (!varp)
+ continue;
+ /* Global values are only written when not at the default value. */
if ((opt_flags & OPT_GLOBAL) && optval_default(p, varp))
continue;