eval/decode.c: Avoid NULL arg to memchr() #7332

Clang complains because memchr has undefined behavior if the ptr is
NULL, even if len==0.

Helped-by: Nikolai Aleksandrovich Pavlov <kp-pav@yandex.ru>
This commit is contained in:
Adrian Neumann 2017-09-28 10:19:57 +02:00 committed by Justin M. Keyes
parent d31b94ac20
commit 8f03014e88
2 changed files with 8 additions and 1 deletions

View File

@ -266,7 +266,7 @@ typval_T decode_string(const char *const s, const size_t len,
{ {
assert(s != NULL || len == 0); assert(s != NULL || len == 0);
const bool really_hasnul = (hasnul == kNone const bool really_hasnul = (hasnul == kNone
? memchr(s, NUL, len) != NULL ? ((s != NULL) && (memchr(s, NUL, len) != NULL))
: (bool)hasnul); : (bool)hasnul);
if (really_hasnul) { if (really_hasnul) {
list_T *const list = tv_list_alloc(); list_T *const list = tv_list_alloc();

View File

@ -776,4 +776,11 @@ describe('json_encode() function', function()
it('can dump NULL dictionary', function() it('can dump NULL dictionary', function()
eq('{}', eval('json_encode(v:_null_dict)')) eq('{}', eval('json_encode(v:_null_dict)'))
end) end)
it('fails to parse NULL strings and lists', function()
eq('Vim(call):E474: Attempt to decode a blank string',
exc_exec('call json_decode($XXX_UNEXISTENT_VAR_XXX)'))
eq('Vim(call):E474: Attempt to decode a blank string',
exc_exec('call json_decode(v:_null_list)'))
end)
end) end)