* [ammarfaizi2-block:dhowells/linux-fs/netfs-maple 19/40] lib/maple_tree.c:319:2: warning: Value stored to 'node' is never read [clang-analyzer-deadcode.DeadStores]
@ 2022-04-07 7:12 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2022-04-07 7:12 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 108055 bytes --]
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: "GNU/Weeb Mailing List" <gwml@vger.gnuweeb.org>
CC: linux-kernel(a)vger.kernel.org
TO: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
CC: David Howells <dhowells@redhat.com>
CC: "Matthew Wilcox (Oracle)" <willy@infradead.org>
tree: https://github.com/ammarfaizi2/linux-block dhowells/linux-fs/netfs-maple
head: 674eea41fc70a740ff83ec590f9833f805852464
commit: 51b63e667ad83864c161cf2b8ef462e907536070 [19/40] Maple Tree: Add new data structure
:::::: branch date: 3 days ago
:::::: commit date: 3 days ago
config: arm-randconfig-c002-20220405 (https://download.01.org/0day-ci/archive/20220407/202204071501.N97YJGfd-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project c4a1b07d0979e7ff20d7d541af666d822d66b566)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm cross compiling tool for clang build
# apt-get install binutils-arm-linux-gnueabi
# https://github.com/ammarfaizi2/linux-block/commit/51b63e667ad83864c161cf2b8ef462e907536070
git remote add ammarfaizi2-block https://github.com/ammarfaizi2/linux-block
git fetch --no-tags ammarfaizi2-block dhowells/linux-fs/netfs-maple
git checkout 51b63e667ad83864c161cf2b8ef462e907536070
# save the config file to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
drivers/hwtracing/coresight/coresight-stm.c:311:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(paload, data, size);
^~~~~~
drivers/hwtracing/coresight/coresight-stm.c:616:9: warning: Call to function 'sprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'sprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
return sprintf(buf, "%#lx\n", val);
^~~~~~~
drivers/hwtracing/coresight/coresight-stm.c:616:9: note: Call to function 'sprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'sprintf_s' in case of C11
return sprintf(buf, "%#lx\n", val);
^~~~~~~
include/linux/log2.h:67:13: warning: The result of the left shift is undefined due to shifting by '4294967295', which is greater or equal to the width of type 'unsigned long' [clang-analyzer-core.UndefinedBinaryOperatorResult]
return 1UL << (fls_long(n) - 1);
^
drivers/hwtracing/coresight/coresight-stm.c:418:8: note: Assuming 'drvdata' is non-null
if (!(drvdata && local_read(&drvdata->mode)))
^~~~~~~
drivers/hwtracing/coresight/coresight-stm.c:418:8: note: Left side of '&&' is true
drivers/hwtracing/coresight/coresight-stm.c:418:6: note: Assuming the condition is false
if (!(drvdata && local_read(&drvdata->mode)))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/hwtracing/coresight/coresight-stm.c:418:2: note: Taking false branch
if (!(drvdata && local_read(&drvdata->mode)))
^
drivers/hwtracing/coresight/coresight-stm.c:421:6: note: Assuming 'channel' is < field 'numsp'
if (channel >= drvdata->numsp)
^~~~~~~~~~~~~~~~~~~~~~~~~
drivers/hwtracing/coresight/coresight-stm.c:421:2: note: Taking false branch
if (channel >= drvdata->numsp)
^
drivers/hwtracing/coresight/coresight-stm.c:426:15: note: Assuming the condition is false
stm_flags = (flags & STP_PACKET_TIMESTAMPED) ?
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/hwtracing/coresight/coresight-stm.c:426:14: note: '?' condition is false
stm_flags = (flags & STP_PACKET_TIMESTAMPED) ?
^
drivers/hwtracing/coresight/coresight-stm.c:428:15: note: Assuming the condition is false
stm_flags |= test_bit(channel, drvdata->chs.guaranteed) ?
^
include/asm-generic/bitops/non-atomic.h:120:18: note: expanded from macro 'test_bit'
#define test_bit arch_test_bit
^
drivers/hwtracing/coresight/coresight-stm.c:428:15: note: '?' condition is false
stm_flags |= test_bit(channel, drvdata->chs.guaranteed) ?
^
include/asm-generic/bitops/non-atomic.h:120:18: note: expanded from macro 'test_bit'
#define test_bit arch_test_bit
^
drivers/hwtracing/coresight/coresight-stm.c:431:6: note: Assuming 'size' is <= field 'write_bytes'
if (size > drvdata->write_bytes)
^~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/hwtracing/coresight/coresight-stm.c:431:2: note: Taking false branch
if (size > drvdata->write_bytes)
^
drivers/hwtracing/coresight/coresight-stm.c:434:10: note: '?' condition is false
size = rounddown_pow_of_two(size);
^
include/linux/log2.h:193:2: note: expanded from macro 'rounddown_pow_of_two'
__builtin_constant_p(n) ? ( \
^
drivers/hwtracing/coresight/coresight-stm.c:434:10: note: Calling '__rounddown_pow_of_two'
size = rounddown_pow_of_two(size);
^
include/linux/log2.h:195:2: note: expanded from macro 'rounddown_pow_of_two'
__rounddown_pow_of_two(n) \
^~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/log2.h:67:13: note: The result of the left shift is undefined due to shifting by '4294967295', which is greater or equal to the width of type 'unsigned long'
return 1UL << (fls_long(n) - 1);
^ ~~~~~~~~~~~~~~~~~
Suppressed 42 warnings (42 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
70 warnings generated.
lib/kobject_uevent.c:296:2: warning: Call to function 'sprintf' is insecure as it does not provide bounding of the memory buffer or security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'sprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
sprintf(scratch, "%s@%s", action_string, devpath);
^~~~~~~
lib/kobject_uevent.c:296:2: note: Call to function 'sprintf' is insecure as it does not provide bounding of the memory buffer or security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'sprintf_s' in case of C11
sprintf(scratch, "%s@%s", action_string, devpath);
^~~~~~~
lib/kobject_uevent.c:435:4: warning: Call to function 'memmove' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memmove_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memmove(env->envp[i], env->envp[i + 1],
^~~~~~~
lib/kobject_uevent.c:435:4: note: Call to function 'memmove' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memmove_s' in case of C11
memmove(env->envp[i], env->envp[i + 1],
^~~~~~~
lib/kobject_uevent.c:665:8: warning: Call to function 'vsnprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'vsnprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
len = vsnprintf(&env->buf[env->buflen],
^~~~~~~~~
lib/kobject_uevent.c:665:8: note: Call to function 'vsnprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'vsnprintf_s' in case of C11
len = vsnprintf(&env->buf[env->buflen],
^~~~~~~~~
lib/kobject_uevent.c:691:8: warning: Call to function 'snprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'snprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
ret = snprintf(buf, sizeof(buf), "SEQNUM=%llu", ++uevent_seqnum);
^~~~~~~~
lib/kobject_uevent.c:691:8: note: Call to function 'snprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'snprintf_s' in case of C11
ret = snprintf(buf, sizeof(buf), "SEQNUM=%llu", ++uevent_seqnum);
^~~~~~~~
Suppressed 66 warnings (66 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
29 warnings generated.
Suppressed 29 warnings (29 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
70 warnings generated.
>> lib/maple_tree.c:319:2: warning: Value stored to 'node' is never read [clang-analyzer-deadcode.DeadStores]
node = (void *)((unsigned long)node & ~MAPLE_ENODE_NULL);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:319:2: note: Value stored to 'node' is never read
node = (void *)((unsigned long)node & ~MAPLE_ENODE_NULL);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:324:2: warning: Value stored to 'node' is never read [clang-analyzer-deadcode.DeadStores]
node = (void *)((unsigned long)node | MAPLE_ENODE_NULL);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:324:2: note: Value stored to 'node' is never read
node = (void *)((unsigned long)node | MAPLE_ENODE_NULL);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> lib/maple_tree.c:470:3: warning: Value stored to 'shift' is never read [clang-analyzer-deadcode.DeadStores]
shift = type = 0;
^ ~~~~~~~~
lib/maple_tree.c:470:3: note: Value stored to 'shift' is never read
shift = type = 0;
^ ~~~~~~~~
>> lib/maple_tree.c:470:11: warning: Although the value stored to 'type' is used in the enclosing expression, the value is never actually read from 'type' [clang-analyzer-deadcode.DeadStores]
shift = type = 0;
^ ~
lib/maple_tree.c:470:11: note: Although the value stored to 'type' is used in the enclosing expression, the value is never actually read from 'type'
shift = type = 0;
^ ~
lib/maple_tree.c:1176:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(reuse, 0, sizeof(*reuse));
^~~~~~
lib/maple_tree.c:1176:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(reuse, 0, sizeof(*reuse));
^~~~~~
>> lib/maple_tree.c:1208:23: warning: Value stored to 'nodep' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
struct maple_alloc **nodep = &mas->alloc;
^~~~~ ~~~~~~~~~~~
lib/maple_tree.c:1208:23: note: Value stored to 'nodep' during its initialization is never read
struct maple_alloc **nodep = &mas->alloc;
^~~~~ ~~~~~~~~~~~
lib/maple_tree.c:1218:20: warning: Access to field 'node_count' results in a dereference of a null pointer (loaded from field 'alloc') [clang-analyzer-core.NullDereference]
if (!allocated || mas->alloc->node_count == MAPLE_ALLOC_SLOTS - 1) {
^
lib/maple_tree.c:6266:2: note: Calling 'trace_ma_op'
trace_ma_op(__func__, &mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
include/trace/events/maple_tree.h:13:1: note: Returning without writing to 'mas->alloc', which participates in a condition later
TRACE_EVENT(ma_op,
^
include/linux/tracepoint.h:553:2: note: expanded from macro 'TRACE_EVENT'
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
^
include/linux/tracepoint.h:419:2: note: expanded from macro 'DECLARE_TRACE'
__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
^
include/linux/tracepoint.h:343:4: note: expanded from macro '__DECLARE_TRACE'
{ } \
^
include/trace/events/maple_tree.h:13:1: note: Returning without writing to 'mas->alloc'
TRACE_EVENT(ma_op,
^
include/linux/tracepoint.h:553:2: note: expanded from macro 'TRACE_EVENT'
DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
^
include/linux/tracepoint.h:419:2: note: expanded from macro 'DECLARE_TRACE'
__DECLARE_TRACE(name, PARAMS(proto), PARAMS(args), \
^
include/linux/tracepoint.h:343:4: note: expanded from macro '__DECLARE_TRACE'
{ } \
^
lib/maple_tree.c:6266:2: note: Returning from 'trace_ma_op'
trace_ma_op(__func__, &mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Calling 'mas_is_none'
if (mas_is_none(mas) || mas_is_paused(mas))
^~~~~~~~~~~~~~~~
include/linux/maple_tree.h:476:2: note: Returning without writing to 'mas->alloc', which participates in a condition later
return mas->node == MAS_NONE;
^
include/linux/maple_tree.h:476:2: note: Returning without writing to 'mas->alloc'
lib/maple_tree.c:5981:6: note: Returning from 'mas_is_none'
if (mas_is_none(mas) || mas_is_paused(mas))
^~~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
lib/maple_tree.c:5981:26: note: Calling 'mas_is_paused'
if (mas_is_none(mas) || mas_is_paused(mas))
^~~~~~~~~~~~~~~~~~
include/linux/maple_tree.h:482:2: note: Returning without writing to 'mas->alloc', which participates in a condition later
return mas->node == MAS_PAUSE;
^
include/linux/maple_tree.h:482:2: note: Returning without writing to 'mas->alloc'
lib/maple_tree.c:5981:26: note: Returning from 'mas_is_paused'
if (mas_is_none(mas) || mas_is_paused(mas))
^~~~~~~~~~~~~~~~~~
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5985:10: note: Calling 'mas_state_walk'
entry = mas_state_walk(mas);
^~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3741:10: note: Calling 'mas_start'
entry = mas_start(mas);
^~~~~~~~~~~~~~
lib/maple_tree.c:1316:13: note: Calling 'mas_is_start'
if (likely(mas_is_start(mas))) {
^
include/linux/compiler.h:77:40: note: expanded from macro 'likely'
# define likely(x) __builtin_expect(!!(x), 1)
^
lib/maple_tree.c:236:2: note: Returning without writing to 'mas->alloc', which participates in a condition later
return mas->node == MAS_START;
^
lib/maple_tree.c:236:2: note: Returning without writing to 'mas->alloc'
lib/maple_tree.c:1316:13: note: Returning from 'mas_is_start'
if (likely(mas_is_start(mas))) {
^
include/linux/compiler.h:77:40: note: expanded from macro 'likely'
# define likely(x) __builtin_expect(!!(x), 1)
^
lib/maple_tree.c:1316:2: note: Taking true branch
if (likely(mas_is_start(mas))) {
^
lib/maple_tree.c:1325:10: note: Calling 'mas_root'
root = mas_root(mas);
^~~~~~~~~~~~~
lib/maple_tree.c:847:9: note: Left side of '||' is false
return rcu_dereference_check(mas->tree->ma_root, mt_locked(mas->tree));
^
include/linux/rcupdate.h:531:2: note: expanded from macro 'rcu_dereference_check'
__rcu_dereference_check((p), __UNIQUE_ID(rcu), \
^
include/linux/rcupdate.h:391:43: note: expanded from macro '__rcu_dereference_check'
--
^
lib/maple_tree.c:2788:2: note: Loop condition is false. Exiting loop
do {
^
lib/maple_tree.c:2833:2: note: Returning without writing to 'mas->alloc', which participates in a condition later
return (void *) next;
^
lib/maple_tree.c:2833:2: note: Returning without writing to 'mas->alloc'
lib/maple_tree.c:2983:2: note: Returning from 'mtree_range_walk'
mtree_range_walk(mas);
^~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3940:9: note: Returning from 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4269:3: note: Returning from 'mas_wr_spanning_store'
mas_wr_spanning_store(wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:5993:2: note: Returning from 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:5994:6: note: Calling 'mas_nomem'
if (mas_nomem(mas, GFP_KERNEL))
^~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:6011:13: note: Assuming the condition is false
if (likely(mas->node != MA_ERROR(-ENOMEM))) {
^
include/linux/compiler.h:77:40: note: expanded from macro 'likely'
# define likely(x) __builtin_expect(!!(x), 1)
^
lib/maple_tree.c:6011:2: note: Taking false branch
if (likely(mas->node != MA_ERROR(-ENOMEM))) {
^
lib/maple_tree.c:6016:6: note: Left side of '&&' is true
if (gfpflags_allow_blocking(gfp) && !mt_external_lock(mas->tree)) {
^
lib/maple_tree.c:6016:2: note: Taking false branch
if (gfpflags_allow_blocking(gfp) && !mt_external_lock(mas->tree)) {
^
lib/maple_tree.c:6021:3: note: Calling 'mas_alloc_nodes'
mas_alloc_nodes(mas, gfp);
^~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:1209:28: note: Calling 'mas_allocated'
unsigned long allocated = mas_allocated(mas);
^~~~~~~~~~~~~~~~~~
lib/maple_tree.c:554:6: note: Assuming field 'alloc' is non-null, which participates in a condition later
if (!mas->alloc || ((unsigned long)mas->alloc & 0x1))
^~~~~~~~~~~
lib/maple_tree.c:554:6: note: Left side of '||' is false
lib/maple_tree.c:554:22: note: Assuming the condition is false
if (!mas->alloc || ((unsigned long)mas->alloc & 0x1))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:554:2: note: Taking false branch
if (!mas->alloc || ((unsigned long)mas->alloc & 0x1))
^
lib/maple_tree.c:557:2: note: Returning value, which participates in a condition later
return mas->alloc->total;
^~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:1209:28: note: Returning from 'mas_allocated'
unsigned long allocated = mas_allocated(mas);
^~~~~~~~~~~~~~~~~~
lib/maple_tree.c:1214:6: note: Assuming 'requested' is not equal to 0
if (!requested)
^~~~~~~~~~
lib/maple_tree.c:1214:2: note: Taking false branch
if (!requested)
^
lib/maple_tree.c:1217:2: note: Calling 'mas_set_alloc_req'
mas_set_alloc_req(mas, 0);
^~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:572:12: note: Field 'alloc' is non-null, which participates in a condition later
if (!mas->alloc || ((unsigned long)mas->alloc & 0x1)) {
^
lib/maple_tree.c:572:6: note: Left side of '||' is false
if (!mas->alloc || ((unsigned long)mas->alloc & 0x1)) {
^
lib/maple_tree.c:572:22: note: Assuming the condition is true
if (!mas->alloc || ((unsigned long)mas->alloc & 0x1)) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:572:2: note: Taking true branch
if (!mas->alloc || ((unsigned long)mas->alloc & 0x1)) {
^
lib/maple_tree.c:573:8: note: 'count' is 0
if (!count)
^~~~~
lib/maple_tree.c:573:3: note: Taking true branch
if (!count)
^
lib/maple_tree.c:574:4: note: Null pointer value stored to 'mas.alloc'
mas->alloc = NULL;
^~~~~~~~~~~~~~~~~
lib/maple_tree.c:1217:2: note: Returning from 'mas_set_alloc_req'
mas_set_alloc_req(mas, 0);
^~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:1218:6: note: Assuming 'allocated' is not equal to 0
if (!allocated || mas->alloc->node_count == MAPLE_ALLOC_SLOTS - 1) {
^~~~~~~~~~
lib/maple_tree.c:1218:6: note: Left side of '||' is false
lib/maple_tree.c:1218:20: note: Access to field 'node_count' results in a dereference of a null pointer (loaded from field 'alloc')
if (!allocated || mas->alloc->node_count == MAPLE_ALLOC_SLOTS - 1) {
^ ~~~~~
>> lib/maple_tree.c:1690:3: warning: Dereference of null pointer [clang-analyzer-core.NullDereference]
rcu_assign_pointer(slots[offset], mas->node);
^
include/linux/rcupdate.h:455:3: note: expanded from macro 'rcu_assign_pointer'
smp_store_release(&p, RCU_INITIALIZER((typeof(p))_r_a_p__v)); \
^
include/asm-generic/barrier.h:190:2: note: expanded from macro 'smp_store_release'
WRITE_ONCE(*p, v); \
^
include/asm-generic/rwonce.h:61:2: note: expanded from macro 'WRITE_ONCE'
__WRITE_ONCE(x, val); \
^
include/asm-generic/rwonce.h:55:30: note: expanded from macro '__WRITE_ONCE'
*(volatile typeof(x) *)&(x) = (val); \
^
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5986:7: note: 'entry' is non-null
if (!entry)
^~~~~
lib/maple_tree.c:5986:2: note: Taking false branch
if (!entry)
^
lib/maple_tree.c:5994:2: note: Taking true branch
if (mas_nomem(mas, GFP_KERNEL))
^
lib/maple_tree.c:5995:3: note: Control jumps to line 5991
goto write_retry;
^
lib/maple_tree.c:5993:2: note: Calling 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4262:7: note: Assuming field 'content' is null
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^~~~~~~~~~~~~~~
lib/maple_tree.c:4262:6: note: Left side of '||' is false
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4262:6: note: Left side of '||' is false
lib/maple_tree.c:4262:2: note: Taking false branch
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4268:2: note: Taking false branch
if (unlikely(!mas_wr_walk(wr_mas))) {
^
lib/maple_tree.c:4277:15: note: Field 'entry' is non-null
if (!wr_mas->entry)
^
lib/maple_tree.c:4277:2: note: Taking false branch
if (!wr_mas->entry)
^
lib/maple_tree.c:4281:15: note: Assuming field 'index' is not equal to 0
if (unlikely(!mas->index && mas->last == ULONG_MAX)) {
^
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
lib/maple_tree.c:4281:27: note: Left side of '&&' is false
if (unlikely(!mas->index && mas->last == ULONG_MAX)) {
^
lib/maple_tree.c:4281:2: note: Taking false branch
if (unlikely(!mas->index && mas->last == ULONG_MAX)) {
^
lib/maple_tree.c:4286:2: note: Calling 'mas_wr_modify'
mas_wr_modify(wr_mas);
^~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4211:6: note: Assuming field 'r_min' is not equal to field 'index'
if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4211:34: note: Left side of '&&' is false
if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last) {
^
lib/maple_tree.c:4221:15: note: Assuming the condition is false
if (unlikely(wr_mas->offset_end + 1 >= node_slots))
^
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
lib/maple_tree.c:4221:2: note: Taking false branch
if (unlikely(wr_mas->offset_end + 1 >= node_slots))
^
lib/maple_tree.c:4224:14: note: Field 'entry' is non-null
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^
lib/maple_tree.c:4224:6: note: Left side of '&&' is true
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^
lib/maple_tree.c:4224:24: note: Assuming the condition is false
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4224:59: note: Left side of '&&' is false
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^
lib/maple_tree.c:4231:7: note: Assuming the condition is false
--
piv_end = min(mas_end, mt_pivots[mt]);
^
include/linux/minmax.h:45:19: note: expanded from macro 'min'
#define min(x, y) __careful_cmp(x, y, <)
^~~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
__cmp(unique_x, unique_y, op); })
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
^~~
lib/maple_tree.c:1897:12: note: '?' condition is false
piv_end = min(mas_end, mt_pivots[mt]);
^
include/linux/minmax.h:45:19: note: expanded from macro 'min'
#define min(x, y) __careful_cmp(x, y, <)
^
include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
^
include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
__cmp(unique_x, unique_y, op); })
^
include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
^
lib/maple_tree.c:1898:9: note: 'i' is >= 'piv_end'
for (; i < piv_end; i++, j++) {
^
lib/maple_tree.c:1898:2: note: Loop condition is false. Execution continues on line 1907
for (; i < piv_end; i++, j++) {
^
lib/maple_tree.c:1907:13: note: Assuming 'i' is > 'mas_end'
if (likely(i <= mas_end))
^
include/linux/compiler.h:77:40: note: expanded from macro 'likely'
# define likely(x) __builtin_expect(!!(x), 1)
^
lib/maple_tree.c:1907:2: note: Taking false branch
if (likely(i <= mas_end))
^
lib/maple_tree.c:1915:22: note: Left side of '&&' is false
if (!ma_is_leaf(mt) && mt_is_alloc(mas->tree)) {
^
lib/maple_tree.c:3931:2: note: Returning from 'mas_mab_cp'
mas_mab_cp(&r_mas, r_mas.offset, r_wr_mas.node_end,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3940:9: note: Calling 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2881:31: note: Left side of '&&' is false
if (!mas_is_root_limits(mas) &&
^
lib/maple_tree.c:2903:2: note: Loop condition is false. Execution continues on line 2954
while (count--) {
^
lib/maple_tree.c:2957:2: note: Calling 'mab_mas_cp'
mab_mas_cp(mast->bn, 0, mt_slots[mast->bn->type] - 1, &l_mas, true);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:1941:6: note: Assuming the condition is false
if (mab_end - mab_start > mt_pivots[mt])
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:1941:2: note: Taking false branch
if (mab_end - mab_start > mt_pivots[mt])
^
lib/maple_tree.c:1944:6: note: Assuming the condition is false
if (!pivots[mt_pivots[mt] - 1])
^~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:1944:2: note: Taking false branch
if (!pivots[mt_pivots[mt] - 1])
^
lib/maple_tree.c:1951:11: note: 'i' is <= 'mab_end'
} while (i <= mab_end && likely(b_node->pivot[i]));
^
lib/maple_tree.c:1951:11: note: Left side of '&&' is true
lib/maple_tree.c:1949:2: note: Loop condition is true. Execution continues on line 1950
do {
^
lib/maple_tree.c:1950:31: note: The value 3 is assigned to 'i'
pivots[j++] = b_node->pivot[i++];
^~~
lib/maple_tree.c:1951:11: note: 'i' is <= 'mab_end'
} while (i <= mab_end && likely(b_node->pivot[i]));
^
lib/maple_tree.c:1951:11: note: Left side of '&&' is true
lib/maple_tree.c:1951:27: note: 1st function call argument is an uninitialized value
} while (i <= mab_end && likely(b_node->pivot[i]));
^
include/linux/compiler.h:77:20: note: expanded from macro 'likely'
# define likely(x) __builtin_expect(!!(x), 1)
^ ~~~~~
lib/maple_tree.c:1953:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(slots, b_node->slot + mab_start,
^~~~~~
lib/maple_tree.c:1953:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(slots, b_node->slot + mab_start,
^~~~~~
>> lib/maple_tree.c:1966:14: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]
gaps[--j] = b_node->gap[--i];
^
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5986:7: note: 'entry' is non-null
if (!entry)
^~~~~
lib/maple_tree.c:5986:2: note: Taking false branch
if (!entry)
^
lib/maple_tree.c:5994:2: note: Taking true branch
if (mas_nomem(mas, GFP_KERNEL))
^
lib/maple_tree.c:5995:3: note: Control jumps to line 5991
goto write_retry;
^
lib/maple_tree.c:5993:2: note: Calling 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4262:7: note: Assuming field 'content' is null
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^~~~~~~~~~~~~~~
lib/maple_tree.c:4262:6: note: Left side of '||' is false
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4262:6: note: Left side of '||' is false
lib/maple_tree.c:4262:2: note: Taking false branch
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4268:2: note: Taking false branch
if (unlikely(!mas_wr_walk(wr_mas))) {
^
lib/maple_tree.c:4277:15: note: Field 'entry' is non-null
if (!wr_mas->entry)
^
lib/maple_tree.c:4277:2: note: Taking false branch
if (!wr_mas->entry)
^
lib/maple_tree.c:4281:15: note: Assuming field 'index' is not equal to 0
if (unlikely(!mas->index && mas->last == ULONG_MAX)) {
^
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
lib/maple_tree.c:4281:27: note: Left side of '&&' is false
if (unlikely(!mas->index && mas->last == ULONG_MAX)) {
^
lib/maple_tree.c:4281:2: note: Taking false branch
if (unlikely(!mas->index && mas->last == ULONG_MAX)) {
^
lib/maple_tree.c:4286:2: note: Calling 'mas_wr_modify'
mas_wr_modify(wr_mas);
^~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4211:6: note: Assuming field 'r_min' is not equal to field 'index'
if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last) {
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4211:34: note: Left side of '&&' is false
if (wr_mas->r_min == mas->index && wr_mas->r_max == mas->last) {
^
lib/maple_tree.c:4221:15: note: Assuming the condition is false
if (unlikely(wr_mas->offset_end + 1 >= node_slots))
^
include/linux/compiler.h:78:42: note: expanded from macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
lib/maple_tree.c:4221:2: note: Taking false branch
if (unlikely(wr_mas->offset_end + 1 >= node_slots))
^
lib/maple_tree.c:4224:14: note: Field 'entry' is non-null
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^
lib/maple_tree.c:4224:6: note: Left side of '&&' is true
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^
lib/maple_tree.c:4224:24: note: Assuming the condition is false
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4224:59: note: Left side of '&&' is false
if (wr_mas->entry && (wr_mas->node_end < node_slots - 1) &&
^
lib/maple_tree.c:4231:7: note: Assuming the condition is false
if ((wr_mas->offset_end - mas->offset <= 1) && mas_wr_slot_store(wr_mas))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4231:46: note: Left side of '&&' is false
if ((wr_mas->offset_end - mas->offset <= 1) && mas_wr_slot_store(wr_mas))
^
lib/maple_tree.c:4233:11: note: Assuming the condition is false
else if (mas_wr_node_store(wr_mas))
^~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4233:7: note: Taking false branch
else if (mas_wr_node_store(wr_mas))
^
lib/maple_tree.c:4236:2: note: Taking false branch
--
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
^~~
lib/maple_tree.c:1897:12: note: '?' condition is false
piv_end = min(mas_end, mt_pivots[mt]);
^
include/linux/minmax.h:45:19: note: expanded from macro 'min'
#define min(x, y) __careful_cmp(x, y, <)
^
include/linux/minmax.h:38:3: note: expanded from macro '__careful_cmp'
__cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
^
include/linux/minmax.h:33:3: note: expanded from macro '__cmp_once'
__cmp(unique_x, unique_y, op); })
^
include/linux/minmax.h:28:26: note: expanded from macro '__cmp'
#define __cmp(x, y, op) ((x) op (y) ? (x) : (y))
^
lib/maple_tree.c:1898:9: note: 'i' is >= 'piv_end'
for (; i < piv_end; i++, j++) {
^
lib/maple_tree.c:1898:2: note: Loop condition is false. Execution continues on line 1907
for (; i < piv_end; i++, j++) {
^
lib/maple_tree.c:1907:13: note: 'i' is > 'mas_end'
if (likely(i <= mas_end))
^
include/linux/compiler.h:77:40: note: expanded from macro 'likely'
# define likely(x) __builtin_expect(!!(x), 1)
^
lib/maple_tree.c:1907:2: note: Taking false branch
if (likely(i <= mas_end))
^
lib/maple_tree.c:1915:22: note: Left side of '&&' is false
if (!ma_is_leaf(mt) && mt_is_alloc(mas->tree)) {
^
lib/maple_tree.c:3931:2: note: Returning from 'mas_mab_cp'
mas_mab_cp(&r_mas, r_mas.offset, r_wr_mas.node_end,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3940:9: note: Calling 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2881:31: note: Left side of '&&' is false
if (!mas_is_root_limits(mas) &&
^
lib/maple_tree.c:2903:2: note: Loop condition is true. Entering loop body
while (count--) {
^
lib/maple_tree.c:2904:3: note: Calling 'mast_setup_bnode_for_split'
mast_setup_bnode_for_split(mast);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2768:2: note: The value 4 is assigned to 'b_node.b_end'
mast->bn->b_end--;
^~~~~~~~~~~~~~~~~
lib/maple_tree.c:2904:3: note: Returning from 'mast_setup_bnode_for_split'
mast_setup_bnode_for_split(mast);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2905:11: note: Calling 'mas_mab_to_node'
split = mas_mab_to_node(mas, mast->bn, &left, &right, &middle,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2484:10: note: Calling 'mas_new_ma_node'
*left = mas_new_ma_node(mas, b_node);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2459:2: note: Returning without writing to 'b_node->b_end'
return mt_mk_node(ma_mnode_ptr(mas_pop_node(mas)), b_node->type);
^
lib/maple_tree.c:2484:10: note: Returning from 'mas_new_ma_node'
*left = mas_new_ma_node(mas, b_node);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2489:6: note: Assuming 'slot_count' is > field 'b_end'
if (b_node->b_end < slot_count) {
^~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2489:2: note: Taking true branch
if (b_node->b_end < slot_count) {
^
lib/maple_tree.c:2490:3: note: The value 4 is assigned to 'split'
split = b_node->b_end;
^~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2496:2: note: Taking false branch
if (*mid_split)
^
lib/maple_tree.c:2499:2: note: Returning the value 4 (loaded from 'split')
return split;
^~~~~~~~~~~~
lib/maple_tree.c:2905:11: note: Returning from 'mas_mab_to_node'
split = mas_mab_to_node(mas, mast->bn, &left, &right, &middle,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2905:3: note: The value 4 is assigned to 'split'
split = mas_mab_to_node(mas, mast->bn, &left, &right, &middle,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2909:47: note: Passing the value 4 via 5th parameter 'split'
mast_cp_to_nodes(mast, left, middle, right, split, mid_split);
^~~~~
lib/maple_tree.c:2909:3: note: Calling 'mast_cp_to_nodes'
mast_cp_to_nodes(mast, left, middle, right, split, mid_split);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2686:15: note: Assigned value is garbage or undefined
mast->l->max = mast->bn->pivot[split];
^ ~~~~~~~~~~~~~~~~~~~~~~
>> lib/maple_tree.c:2785:2: warning: Value stored to 'last' is never read [clang-analyzer-deadcode.DeadStores]
last = next = mas->node;
^ ~~~~~~~~~~~~~~~~
lib/maple_tree.c:2785:2: note: Value stored to 'last' is never read
last = next = mas->node;
^ ~~~~~~~~~~~~~~~~
>> lib/maple_tree.c:2786:2: warning: Value stored to 'prev_min' is never read [clang-analyzer-deadcode.DeadStores]
prev_min = min = mas->min;
^ ~~~~~~~~~~~~~~
lib/maple_tree.c:2786:2: note: Value stored to 'prev_min' is never read
prev_min = min = mas->min;
^ ~~~~~~~~~~~~~~
lib/maple_tree.c:2915:3: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(mast->bn, 0, sizeof(struct maple_big_node));
^~~~~~
lib/maple_tree.c:2915:3: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(mast->bn, 0, sizeof(struct maple_big_node));
^~~~~~
>> lib/maple_tree.c:2984:2: warning: Address of stack memory associated with local variable 'destroy' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference [clang-analyzer-core.StackAddressEscape]
return mast->bn->b_end;
^
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5986:7: note: 'entry' is non-null
if (!entry)
^~~~~
lib/maple_tree.c:5986:2: note: Taking false branch
if (!entry)
^
lib/maple_tree.c:5993:2: note: Calling 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4262:7: note: Assuming field 'content' is null
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^~~~~~~~~~~~~~~
lib/maple_tree.c:4262:6: note: Left side of '||' is false
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4262:6: note: Left side of '||' is false
lib/maple_tree.c:4262:2: note: Taking false branch
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4268:2: note: Taking true branch
if (unlikely(!mas_wr_walk(wr_mas))) {
^
lib/maple_tree.c:4269:3: note: Calling 'mas_wr_spanning_store'
mas_wr_spanning_store(wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3892:21: note: Field 'index' is 0
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:15: note: Left side of '&&' is true
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:2: note: Taking false branch
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3900:2: note: Taking false branch
if (mas_is_err(mas))
^
lib/maple_tree.c:3910:2: note: Taking true branch
if (r_mas.last + 1)
^
lib/maple_tree.c:3921:15: note: Field 'entry' is null
if (!wr_mas->entry) {
^
lib/maple_tree.c:3921:2: note: Taking true branch
if (!wr_mas->entry) {
^
lib/maple_tree.c:3940:9: note: Calling 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2881:31: note: Left side of '&&' is false
if (!mas_is_root_limits(mas) &&
^
lib/maple_tree.c:2903:2: note: Loop condition is true. Entering loop body
while (count--) {
^
lib/maple_tree.c:2920:3: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2935:3: note: Taking false branch
if (mast_sufficient(mast))
^
lib/maple_tree.c:2938:3: note: Taking false branch
if (mast_overflow(mast))
^
lib/maple_tree.c:2942:3: note: Taking false branch
if (mas_is_root_limits(mast->orig_l))
^
lib/maple_tree.c:2946:3: note: Taking true branch
if (!mast_sibling_rebalance_right(mast, true))
^
lib/maple_tree.c:2947:4: note: Taking true branch
if (!mast_cousin_rebalance_right(mast, true))
^
lib/maple_tree.c:2948:5: note: Execution continues on line 2954
break;
^
lib/maple_tree.c:2959:6: note: 'middle' is null
if (middle)
^~~~~~
lib/maple_tree.c:2959:2: note: Taking false branch
if (middle)
^
lib/maple_tree.c:2962:6: note: 'right' is null
if (right)
^~~~~
lib/maple_tree.c:2962:2: note: Taking false branch
if (right)
^
lib/maple_tree.c:2966:2: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2971:2: note: Taking true branch
if (!mte_dead_node(mast->orig_l->node))
^
lib/maple_tree.c:2984:2: note: Address of stack memory associated with local variable 'destroy' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference
return mast->bn->b_end;
^
>> lib/maple_tree.c:2984:2: warning: Address of stack memory associated with local variable 'free' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference [clang-analyzer-core.StackAddressEscape]
return mast->bn->b_end;
^
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5986:7: note: 'entry' is non-null
if (!entry)
^~~~~
lib/maple_tree.c:5986:2: note: Taking false branch
if (!entry)
^
lib/maple_tree.c:5993:2: note: Calling 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4262:7: note: Assuming field 'content' is null
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^~~~~~~~~~~~~~~
lib/maple_tree.c:4262:6: note: Left side of '||' is false
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4262:6: note: Left side of '||' is false
lib/maple_tree.c:4262:2: note: Taking false branch
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4268:2: note: Taking true branch
if (unlikely(!mas_wr_walk(wr_mas))) {
^
lib/maple_tree.c:4269:3: note: Calling 'mas_wr_spanning_store'
mas_wr_spanning_store(wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3892:21: note: Field 'index' is 0
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:15: note: Left side of '&&' is true
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:2: note: Taking false branch
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3900:2: note: Taking false branch
if (mas_is_err(mas))
^
lib/maple_tree.c:3910:2: note: Taking true branch
if (r_mas.last + 1)
^
lib/maple_tree.c:3921:15: note: Field 'entry' is null
if (!wr_mas->entry) {
^
lib/maple_tree.c:3921:2: note: Taking true branch
if (!wr_mas->entry) {
^
lib/maple_tree.c:3940:9: note: Calling 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2881:31: note: Left side of '&&' is false
if (!mas_is_root_limits(mas) &&
^
lib/maple_tree.c:2903:2: note: Loop condition is true. Entering loop body
while (count--) {
^
lib/maple_tree.c:2920:3: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2935:3: note: Taking false branch
if (mast_sufficient(mast))
^
lib/maple_tree.c:2938:3: note: Taking false branch
if (mast_overflow(mast))
^
lib/maple_tree.c:2942:3: note: Taking false branch
if (mas_is_root_limits(mast->orig_l))
^
lib/maple_tree.c:2946:3: note: Taking true branch
if (!mast_sibling_rebalance_right(mast, true))
^
lib/maple_tree.c:2947:4: note: Taking true branch
if (!mast_cousin_rebalance_right(mast, true))
^
lib/maple_tree.c:2948:5: note: Execution continues on line 2954
break;
^
lib/maple_tree.c:2959:6: note: 'middle' is null
if (middle)
^~~~~~
lib/maple_tree.c:2959:2: note: Taking false branch
if (middle)
^
lib/maple_tree.c:2962:6: note: 'right' is null
if (right)
^~~~~
lib/maple_tree.c:2962:2: note: Taking false branch
if (right)
^
lib/maple_tree.c:2966:2: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2971:2: note: Taking true branch
if (!mte_dead_node(mast->orig_l->node))
^
lib/maple_tree.c:2984:2: note: Address of stack memory associated with local variable 'free' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference
return mast->bn->b_end;
^
>> lib/maple_tree.c:2984:2: warning: Address of stack memory associated with local variable 'l_mas' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference [clang-analyzer-core.StackAddressEscape]
return mast->bn->b_end;
^
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5986:7: note: 'entry' is non-null
if (!entry)
^~~~~
lib/maple_tree.c:5986:2: note: Taking false branch
if (!entry)
^
lib/maple_tree.c:5993:2: note: Calling 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4262:7: note: Assuming field 'content' is null
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^~~~~~~~~~~~~~~
lib/maple_tree.c:4262:6: note: Left side of '||' is false
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4262:6: note: Left side of '||' is false
lib/maple_tree.c:4262:2: note: Taking false branch
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4268:2: note: Taking true branch
if (unlikely(!mas_wr_walk(wr_mas))) {
^
lib/maple_tree.c:4269:3: note: Calling 'mas_wr_spanning_store'
mas_wr_spanning_store(wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3892:21: note: Field 'index' is 0
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:15: note: Left side of '&&' is true
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:2: note: Taking false branch
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3900:2: note: Taking false branch
if (mas_is_err(mas))
^
lib/maple_tree.c:3910:2: note: Taking true branch
if (r_mas.last + 1)
^
lib/maple_tree.c:3921:15: note: Field 'entry' is null
if (!wr_mas->entry) {
^
lib/maple_tree.c:3921:2: note: Taking true branch
if (!wr_mas->entry) {
^
lib/maple_tree.c:3940:9: note: Calling 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2881:31: note: Left side of '&&' is false
if (!mas_is_root_limits(mas) &&
^
lib/maple_tree.c:2903:2: note: Loop condition is true. Entering loop body
while (count--) {
^
lib/maple_tree.c:2920:3: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2935:3: note: Taking false branch
if (mast_sufficient(mast))
^
lib/maple_tree.c:2938:3: note: Taking false branch
if (mast_overflow(mast))
^
lib/maple_tree.c:2942:3: note: Taking false branch
if (mas_is_root_limits(mast->orig_l))
^
lib/maple_tree.c:2946:3: note: Taking true branch
if (!mast_sibling_rebalance_right(mast, true))
^
lib/maple_tree.c:2947:4: note: Taking true branch
if (!mast_cousin_rebalance_right(mast, true))
^
lib/maple_tree.c:2948:5: note: Execution continues on line 2954
break;
^
lib/maple_tree.c:2959:6: note: 'middle' is null
if (middle)
^~~~~~
lib/maple_tree.c:2959:2: note: Taking false branch
if (middle)
^
lib/maple_tree.c:2962:6: note: 'right' is null
if (right)
^~~~~
lib/maple_tree.c:2962:2: note: Taking false branch
if (right)
^
lib/maple_tree.c:2966:2: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2971:2: note: Taking true branch
if (!mte_dead_node(mast->orig_l->node))
^
lib/maple_tree.c:2984:2: note: Address of stack memory associated with local variable 'l_mas' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference
return mast->bn->b_end;
^
>> lib/maple_tree.c:2984:2: warning: Address of stack memory associated with local variable 'm_mas' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference [clang-analyzer-core.StackAddressEscape]
return mast->bn->b_end;
^
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5986:7: note: 'entry' is non-null
if (!entry)
^~~~~
lib/maple_tree.c:5986:2: note: Taking false branch
if (!entry)
^
lib/maple_tree.c:5993:2: note: Calling 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4262:7: note: Assuming field 'content' is null
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^~~~~~~~~~~~~~~
lib/maple_tree.c:4262:6: note: Left side of '||' is false
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4262:6: note: Left side of '||' is false
lib/maple_tree.c:4262:2: note: Taking false branch
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4268:2: note: Taking true branch
if (unlikely(!mas_wr_walk(wr_mas))) {
^
lib/maple_tree.c:4269:3: note: Calling 'mas_wr_spanning_store'
mas_wr_spanning_store(wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3892:21: note: Field 'index' is 0
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:15: note: Left side of '&&' is true
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:2: note: Taking false branch
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3900:2: note: Taking false branch
if (mas_is_err(mas))
^
lib/maple_tree.c:3910:2: note: Taking true branch
if (r_mas.last + 1)
^
lib/maple_tree.c:3921:15: note: Field 'entry' is null
if (!wr_mas->entry) {
^
lib/maple_tree.c:3921:2: note: Taking true branch
if (!wr_mas->entry) {
^
lib/maple_tree.c:3940:9: note: Calling 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2881:31: note: Left side of '&&' is false
if (!mas_is_root_limits(mas) &&
^
lib/maple_tree.c:2903:2: note: Loop condition is true. Entering loop body
while (count--) {
^
lib/maple_tree.c:2920:3: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2935:3: note: Taking false branch
if (mast_sufficient(mast))
^
lib/maple_tree.c:2938:3: note: Taking false branch
if (mast_overflow(mast))
^
lib/maple_tree.c:2942:3: note: Taking false branch
if (mas_is_root_limits(mast->orig_l))
^
lib/maple_tree.c:2946:3: note: Taking true branch
if (!mast_sibling_rebalance_right(mast, true))
^
lib/maple_tree.c:2947:4: note: Taking true branch
if (!mast_cousin_rebalance_right(mast, true))
^
lib/maple_tree.c:2948:5: note: Execution continues on line 2954
break;
^
lib/maple_tree.c:2959:6: note: 'middle' is null
if (middle)
^~~~~~
lib/maple_tree.c:2959:2: note: Taking false branch
if (middle)
^
lib/maple_tree.c:2962:6: note: 'right' is null
if (right)
^~~~~
lib/maple_tree.c:2962:2: note: Taking false branch
if (right)
^
lib/maple_tree.c:2966:2: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2971:2: note: Taking true branch
if (!mte_dead_node(mast->orig_l->node))
^
lib/maple_tree.c:2984:2: note: Address of stack memory associated with local variable 'm_mas' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference
return mast->bn->b_end;
^
>> lib/maple_tree.c:2984:2: warning: Address of stack memory associated with local variable 'r_mas' is still referred to by the stack variable 'mast' upon returning to the caller. This will be a dangling reference [clang-analyzer-core.StackAddressEscape]
return mast->bn->b_end;
^
lib/maple_tree.c:6269:10: note: Calling 'mas_erase'
entry = mas_erase(&mas);
^~~~~~~~~~~~~~~
lib/maple_tree.c:5981:6: note: Left side of '||' is false
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5981:2: note: Taking false branch
if (mas_is_none(mas) || mas_is_paused(mas))
^
lib/maple_tree.c:5986:7: note: 'entry' is non-null
if (!entry)
^~~~~
lib/maple_tree.c:5986:2: note: Taking false branch
if (!entry)
^
lib/maple_tree.c:5993:2: note: Calling 'mas_wr_store_entry'
mas_wr_store_entry(&wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:4262:7: note: Assuming field 'content' is null
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^~~~~~~~~~~~~~~
lib/maple_tree.c:4262:6: note: Left side of '||' is false
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4262:6: note: Left side of '||' is false
lib/maple_tree.c:4262:2: note: Taking false branch
if ((wr_mas->content = mas_start(mas)) || mas_is_none(mas) ||
^
lib/maple_tree.c:4268:2: note: Taking true branch
if (unlikely(!mas_wr_walk(wr_mas))) {
^
lib/maple_tree.c:4269:3: note: Calling 'mas_wr_spanning_store'
mas_wr_spanning_store(wr_mas);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:3892:21: note: Field 'index' is 0
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:15: note: Left side of '&&' is true
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3892:2: note: Taking false branch
if (unlikely(!mas->index && mas->last == ULONG_MAX))
^
lib/maple_tree.c:3900:2: note: Taking false branch
if (mas_is_err(mas))
^
lib/maple_tree.c:3910:2: note: Taking true branch
if (r_mas.last + 1)
^
lib/maple_tree.c:3921:15: note: Field 'entry' is null
if (!wr_mas->entry) {
^
lib/maple_tree.c:3921:2: note: Taking true branch
if (!wr_mas->entry) {
^
lib/maple_tree.c:3940:9: note: Calling 'mas_spanning_rebalance'
return mas_spanning_rebalance(mas, &mast, height + 1);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/maple_tree.c:2881:31: note: Left side of '&&' is false
if (!mas_is_root_limits(mas) &&
^
lib/maple_tree.c:2903:2: note: Loop condition is true. Entering loop body
while (count--) {
^
lib/maple_tree.c:2920:3: note: Taking false branch
if (mas_is_root_limits(mast->l))
^
lib/maple_tree.c:2935:3: note: Taking false branch
if (mast_sufficient(mast))
^
lib/maple_tree.c:2938:3: note: Taking false branch
if (mast_overflow(mast))
^
lib/maple_tree.c:2942:3: note: Taking false branch
if (mas_is_root_limits(mast->orig_l))
^
lib/maple_tree.c:2946:3: note: Taking true branch
if (!mast_sibling_rebalance_right(mast, true))
^
lib/maple_tree.c:2947:4: note: Taking true branch
if (!mast_cousin_rebalance_right(mast, true))
^
lib/maple_tree.c:2948:5: note: Execution continues on line 2954
break;
^
lib/maple_tree.c:2959:6: note: 'middle' is null
if (middle)
^~~~~~
lib/maple_tree.c:2959:2: note: Taking false branch
if (middle)
^
lib/maple_tree.c:2962:6: note: 'right' is null
if (right)
^~~~~
lib/maple_tree.c:2962:2: note: Taking false branch
if (right)
^
lib/maple_tree.c:2966:2: note: Taking false branch
--
^~~~~~
lib/maple_tree.c:3122:3: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(l_slots + tmp, 0, sizeof(void *) * (max_s - tmp));
^~~~~~
lib/maple_tree.c:3137:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(slots, l_slots, sizeof(void *) * split);
^~~~~~
lib/maple_tree.c:3137:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(slots, l_slots, sizeof(void *) * split);
^~~~~~
lib/maple_tree.c:3138:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(pivs, l_pivs, sizeof(unsigned long) * split);
^~~~~~
lib/maple_tree.c:3138:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(pivs, l_pivs, sizeof(unsigned long) * split);
^~~~~~
lib/maple_tree.c:3148:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(parent, mte_to_node(eparent), sizeof(struct maple_node));
^~~~~~
lib/maple_tree.c:3148:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(parent, mte_to_node(eparent), sizeof(struct maple_node));
^~~~~~
lib/maple_tree.c:3241:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(mast->bn->gap + mast->bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:3241:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(mast->bn->gap + mast->bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:3243:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(mast->bn->slot + mast->bn->b_end + 1, 0, sizeof(void*) * zero--);
^~~~~~
lib/maple_tree.c:3243:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(mast->bn->slot + mast->bn->b_end + 1, 0, sizeof(void*) * zero--);
^~~~~~
lib/maple_tree.c:3244:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(mast->bn->pivot + mast->bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:3244:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(mast->bn->pivot + mast->bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:3474:4: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(slots + bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:3474:4: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(slots + bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:3476:4: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(pivots + bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:3476:4: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(pivots + bn->b_end + 1, 0,
^~~~~~
lib/maple_tree.c:4007:3: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(&reuse, 0, sizeof(struct maple_node));
^~~~~~
lib/maple_tree.c:4007:3: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(&reuse, 0, sizeof(struct maple_node));
^~~~~~
lib/maple_tree.c:4015:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(dst_pivots, wr_mas->pivots, sizeof(unsigned long) * (offset + 1));
^~~~~~
lib/maple_tree.c:4015:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(dst_pivots, wr_mas->pivots, sizeof(unsigned long) * (offset + 1));
^~~~~~
lib/maple_tree.c:4016:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(dst_slots, wr_mas->slots, sizeof(void *) * (offset + 1));
^~~~~~
lib/maple_tree.c:4016:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(dst_slots, wr_mas->slots, sizeof(void *) * (offset + 1));
^~~~~~
lib/maple_tree.c:4038:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(dst_slots + dst_offset, wr_mas->slots + wr_mas->offset_end,
^~~~~~
lib/maple_tree.c:4038:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(dst_slots + dst_offset, wr_mas->slots + wr_mas->offset_end,
^~~~~~
lib/maple_tree.c:4043:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(dst_pivots + dst_offset, wr_mas->pivots + wr_mas->offset_end,
^~~~~~
lib/maple_tree.c:4043:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(dst_pivots + dst_offset, wr_mas->pivots + wr_mas->offset_end,
^~~~~~
lib/maple_tree.c:4061:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(wr_mas->node, newnode, sizeof(struct maple_node));
^~~~~~
lib/maple_tree.c:4061:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(wr_mas->node, newnode, sizeof(struct maple_node));
^~~~~~
lib/maple_tree.c:4243:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(b_node.slot + b_node.b_end + 1, 0, sizeof(void *) * zero--);
^~~~~~
lib/maple_tree.c:4243:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(b_node.slot + b_node.b_end + 1, 0, sizeof(void *) * zero--);
^~~~~~
lib/maple_tree.c:4244:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(b_node.pivot + b_node.b_end + 1, 0,
^~~~~~
lib/maple_tree.c:4244:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(b_node.pivot + b_node.b_end + 1, 0,
^~~~~~
>> lib/maple_tree.c:4979:5: warning: Value stored to 'count' is never read [clang-analyzer-deadcode.DeadStores]
count = mt_slots[type];
^ ~~~~~~~~~~~~~~
lib/maple_tree.c:4979:5: note: Value stored to 'count' is never read
count = mt_slots[type];
^ ~~~~~~~~~~~~~~
Suppressed 18 warnings (8 in non-user code, 10 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
46 warnings generated.
drivers/crypto/keembay/keembay-ocs-hcu-core.c:572:2: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(rctx, 0, sizeof(*rctx));
^~~~~~
drivers/crypto/keembay/keembay-ocs-hcu-core.c:572:2: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(rctx, 0, sizeof(*rctx));
^~~~~~
drivers/crypto/keembay/keembay-ocs-hcu-core.c:732:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(out, rctx, sizeof(*rctx));
^~~~~~
drivers/crypto/keembay/keembay-ocs-hcu-core.c:732:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(out, rctx, sizeof(*rctx));
^~~~~~
drivers/crypto/keembay/keembay-ocs-hcu-core.c:742:2: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(rctx, in, sizeof(*rctx));
^~~~~~
drivers/crypto/keembay/keembay-ocs-hcu-core.c:742:2: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(rctx, in, sizeof(*rctx));
^~~~~~
drivers/crypto/keembay/keembay-ocs-hcu-core.c:768:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(ctx->key, key, keylen);
^~~~~~
drivers/crypto/keembay/keembay-ocs-hcu-core.c:768:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(ctx->key, key, keylen);
^~~~~~
Suppressed 42 warnings (42 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
42 warnings generated.
fs/isofs/util.c:40:14: warning: The result of the left shift is undefined because the left operand is negative [clang-analyzer-core.UndefinedBinaryOperatorResult]
tz |= (-1 << 8);
~~ ^
fs/isofs/util.c:30:6: note: Assuming 'flag' is equal to 0
if (flag == 0) tz = p[6]; /* High sierra has no time zone */
^~~~~~~~~
fs/isofs/util.c:30:2: note: Taking true branch
if (flag == 0) tz = p[6]; /* High sierra has no time zone */
^
fs/isofs/util.c:33:6: note: 'year' is >= 0
if (year < 0) {
^~~~
fs/isofs/util.c:33:2: note: Taking false branch
if (year < 0) {
^
fs/isofs/util.c:39:7: note: Assuming the condition is true
if (tz & 0x80)
^~~~~~~~~
fs/isofs/util.c:39:3: note: Taking true branch
if (tz & 0x80)
^
fs/isofs/util.c:40:14: note: The result of the left shift is undefined because the left operand is negative
tz |= (-1 << 8);
~~ ^
Suppressed 41 warnings (41 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
65 warnings generated.
drivers/net/ethernet/hisilicon/hns_mdio.c:454:2: warning: Call to function 'snprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'snprintf_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
^~~~~~~~
drivers/net/ethernet/hisilicon/hns_mdio.c:454:2: note: Call to function 'snprintf' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'snprintf_s' in case of C11
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
^~~~~~~~
drivers/net/ethernet/hisilicon/hns_mdio.c:508:3: warning: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memset(new_bus->irq, PHY_POLL, 4 * PHY_MAX_ADDR);
^~~~~~
drivers/net/ethernet/hisilicon/hns_mdio.c:508:3: note: Call to function 'memset' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memset_s' in case of C11
memset(new_bus->irq, PHY_POLL, 4 * PHY_MAX_ADDR);
^~~~~~
Suppressed 63 warnings (62 in non-user code, 1 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
60 warnings generated.
Suppressed 60 warnings (60 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
68 warnings generated.
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c:898:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(key, ppe_cb->rss_key, HNS_PPEV2_RSS_KEY_SIZE);
^~~~~~
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c:898:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(key, ppe_cb->rss_key, HNS_PPEV2_RSS_KEY_SIZE);
^~~~~~
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c:902:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(indir, ppe_cb->rss_indir_table,
^~~~~~
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c:902:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(indir, ppe_cb->rss_indir_table,
^~~~~~
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c:915:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(ppe_cb->rss_key, key, HNS_PPEV2_RSS_KEY_SIZE);
^~~~~~
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c:915:3: note: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11
memcpy(ppe_cb->rss_key, key, HNS_PPEV2_RSS_KEY_SIZE);
^~~~~~
drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c:921:3: warning: Call to function 'memcpy' is insecure as it does not provide security checks introduced in the C11 standard. Replace with analogous functions that support length arguments or provides boundary checks such as 'memcpy_s' in case of C11 [clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling]
memcpy(ppe_cb->rss_indir_table, indir,
vim +/node +319 lib/maple_tree.c
51b63e667ad838 Liam R. Howlett 2020-07-24 316
51b63e667ad838 Liam R. Howlett 2020-07-24 317 static inline void mte_set_full(const struct maple_enode *node)
51b63e667ad838 Liam R. Howlett 2020-07-24 318 {
51b63e667ad838 Liam R. Howlett 2020-07-24 @319 node = (void *)((unsigned long)node & ~MAPLE_ENODE_NULL);
51b63e667ad838 Liam R. Howlett 2020-07-24 320 }
51b63e667ad838 Liam R. Howlett 2020-07-24 321
51b63e667ad838 Liam R. Howlett 2020-07-24 322 static inline void mte_clear_full(const struct maple_enode *node)
51b63e667ad838 Liam R. Howlett 2020-07-24 323 {
51b63e667ad838 Liam R. Howlett 2020-07-24 324 node = (void *)((unsigned long)node | MAPLE_ENODE_NULL);
51b63e667ad838 Liam R. Howlett 2020-07-24 325 }
51b63e667ad838 Liam R. Howlett 2020-07-24 326
51b63e667ad838 Liam R. Howlett 2020-07-24 327 static inline bool ma_is_root(struct maple_node *node)
51b63e667ad838 Liam R. Howlett 2020-07-24 328 {
51b63e667ad838 Liam R. Howlett 2020-07-24 329 return ((unsigned long)node->parent & MA_ROOT_PARENT);
51b63e667ad838 Liam R. Howlett 2020-07-24 330 }
51b63e667ad838 Liam R. Howlett 2020-07-24 331
51b63e667ad838 Liam R. Howlett 2020-07-24 332 static inline bool mte_is_root(const struct maple_enode *node)
51b63e667ad838 Liam R. Howlett 2020-07-24 333 {
51b63e667ad838 Liam R. Howlett 2020-07-24 334 return ma_is_root(mte_to_node(node));
51b63e667ad838 Liam R. Howlett 2020-07-24 335 }
51b63e667ad838 Liam R. Howlett 2020-07-24 336
51b63e667ad838 Liam R. Howlett 2020-07-24 337 static inline bool mas_is_root_limits(const struct ma_state *mas)
51b63e667ad838 Liam R. Howlett 2020-07-24 338 {
51b63e667ad838 Liam R. Howlett 2020-07-24 339 return !mas->min && mas->max == ULONG_MAX;
51b63e667ad838 Liam R. Howlett 2020-07-24 340 }
51b63e667ad838 Liam R. Howlett 2020-07-24 341
51b63e667ad838 Liam R. Howlett 2020-07-24 342 static inline bool mt_is_alloc(struct maple_tree *mt)
51b63e667ad838 Liam R. Howlett 2020-07-24 343 {
51b63e667ad838 Liam R. Howlett 2020-07-24 344 return (mt->ma_flags & MT_FLAGS_ALLOC_RANGE);
51b63e667ad838 Liam R. Howlett 2020-07-24 345 }
51b63e667ad838 Liam R. Howlett 2020-07-24 346
51b63e667ad838 Liam R. Howlett 2020-07-24 347 /*
51b63e667ad838 Liam R. Howlett 2020-07-24 348 * The Parent Pointer
51b63e667ad838 Liam R. Howlett 2020-07-24 349 * Excluding root, the parent pointer is 256B aligned like all other tree nodes.
51b63e667ad838 Liam R. Howlett 2020-07-24 350 * When storing a 32 or 64 bit values, the offset can fit into 4 bits. The 16
51b63e667ad838 Liam R. Howlett 2020-07-24 351 * bit values need an extra bit to store the offset. This extra bit comes from
51b63e667ad838 Liam R. Howlett 2020-07-24 352 * a reuse of the last bit in the node type. This is possible by using bit 1 to
51b63e667ad838 Liam R. Howlett 2020-07-24 353 * indicate if bit 2 is part of the type or the slot.
51b63e667ad838 Liam R. Howlett 2020-07-24 354 *
51b63e667ad838 Liam R. Howlett 2020-07-24 355 * Note types:
51b63e667ad838 Liam R. Howlett 2020-07-24 356 * 0x??1 = Root
51b63e667ad838 Liam R. Howlett 2020-07-24 357 * 0x?00 = 16 bit nodes
51b63e667ad838 Liam R. Howlett 2020-07-24 358 * 0x010 = 32 bit nodes
51b63e667ad838 Liam R. Howlett 2020-07-24 359 * 0x110 = 64 bit nodes
51b63e667ad838 Liam R. Howlett 2020-07-24 360 *
51b63e667ad838 Liam R. Howlett 2020-07-24 361 * Slot size and alignment
51b63e667ad838 Liam R. Howlett 2020-07-24 362 * 0x??1 : Root
51b63e667ad838 Liam R. Howlett 2020-07-24 363 * 0x?00 : 16 bit values, type in 0-1, slot in 2-6
51b63e667ad838 Liam R. Howlett 2020-07-24 364 * 0x010 : 32 bit values, type in 0-2, slot in 3-6
51b63e667ad838 Liam R. Howlett 2020-07-24 365 * 0x110 : 64 bit values, type in 0-2, slot in 3-6
51b63e667ad838 Liam R. Howlett 2020-07-24 366 */
51b63e667ad838 Liam R. Howlett 2020-07-24 367
51b63e667ad838 Liam R. Howlett 2020-07-24 368 #define MAPLE_PARENT_ROOT 0x01
51b63e667ad838 Liam R. Howlett 2020-07-24 369
51b63e667ad838 Liam R. Howlett 2020-07-24 370 #define MAPLE_PARENT_SLOT_SHIFT 0x03
51b63e667ad838 Liam R. Howlett 2020-07-24 371 #define MAPLE_PARENT_SLOT_MASK 0x78
51b63e667ad838 Liam R. Howlett 2020-07-24 372
51b63e667ad838 Liam R. Howlett 2020-07-24 373 #define MAPLE_PARENT_16B_SLOT_SHIFT 0x02
51b63e667ad838 Liam R. Howlett 2020-07-24 374 #define MAPLE_PARENT_16B_SLOT_MASK 0x7C
51b63e667ad838 Liam R. Howlett 2020-07-24 375
51b63e667ad838 Liam R. Howlett 2020-07-24 376 #define MAPLE_PARENT_RANGE64 0x06
51b63e667ad838 Liam R. Howlett 2020-07-24 377 #define MAPLE_PARENT_RANGE32 0x04
51b63e667ad838 Liam R. Howlett 2020-07-24 378 #define MAPLE_PARENT_NOT_RANGE16 0x02
51b63e667ad838 Liam R. Howlett 2020-07-24 379
51b63e667ad838 Liam R. Howlett 2020-07-24 380 /*
51b63e667ad838 Liam R. Howlett 2020-07-24 381 * mte_parent_shift() - Get the parent shift for the slot storage.
51b63e667ad838 Liam R. Howlett 2020-07-24 382 * @parent: The parent pointer cast as an unsigned long
51b63e667ad838 Liam R. Howlett 2020-07-24 383 * Return: The shift into that pointer to the star to of the slot
51b63e667ad838 Liam R. Howlett 2020-07-24 384 */
51b63e667ad838 Liam R. Howlett 2020-07-24 385 static inline unsigned long mte_parent_shift(unsigned long parent)
51b63e667ad838 Liam R. Howlett 2020-07-24 386 {
51b63e667ad838 Liam R. Howlett 2020-07-24 387 /* Note bit 1 == 0 means 16B */
51b63e667ad838 Liam R. Howlett 2020-07-24 388 if (likely(parent & MAPLE_PARENT_NOT_RANGE16))
51b63e667ad838 Liam R. Howlett 2020-07-24 389 return MAPLE_PARENT_SLOT_SHIFT;
51b63e667ad838 Liam R. Howlett 2020-07-24 390
51b63e667ad838 Liam R. Howlett 2020-07-24 391 return MAPLE_PARENT_16B_SLOT_SHIFT;
51b63e667ad838 Liam R. Howlett 2020-07-24 392 }
51b63e667ad838 Liam R. Howlett 2020-07-24 393
51b63e667ad838 Liam R. Howlett 2020-07-24 394 /*
51b63e667ad838 Liam R. Howlett 2020-07-24 395 * mte_parent_slot_mask() - Get the slot mask for the parent.
51b63e667ad838 Liam R. Howlett 2020-07-24 396 * @parent: The parent pointer cast as an unsigned long.
51b63e667ad838 Liam R. Howlett 2020-07-24 397 * Return: The slot mask for that parent.
51b63e667ad838 Liam R. Howlett 2020-07-24 398 */
51b63e667ad838 Liam R. Howlett 2020-07-24 399 static inline unsigned long mte_parent_slot_mask(unsigned long parent)
51b63e667ad838 Liam R. Howlett 2020-07-24 400 {
51b63e667ad838 Liam R. Howlett 2020-07-24 401 /* Note bit 1 == 0 means 16B */
51b63e667ad838 Liam R. Howlett 2020-07-24 402 if (likely(parent & MAPLE_PARENT_NOT_RANGE16))
51b63e667ad838 Liam R. Howlett 2020-07-24 403 return MAPLE_PARENT_SLOT_MASK;
51b63e667ad838 Liam R. Howlett 2020-07-24 404
51b63e667ad838 Liam R. Howlett 2020-07-24 405 return MAPLE_PARENT_16B_SLOT_MASK;
51b63e667ad838 Liam R. Howlett 2020-07-24 406 }
51b63e667ad838 Liam R. Howlett 2020-07-24 407
51b63e667ad838 Liam R. Howlett 2020-07-24 408 /*
51b63e667ad838 Liam R. Howlett 2020-07-24 409 * mas_parent_enum() - Return the maple_type of the parent from the stored
51b63e667ad838 Liam R. Howlett 2020-07-24 410 * parent type.
51b63e667ad838 Liam R. Howlett 2020-07-24 411 * @mas: The maple state
51b63e667ad838 Liam R. Howlett 2020-07-24 412 * @node: The maple_enode to extract the parent's enum
51b63e667ad838 Liam R. Howlett 2020-07-24 413 * Return: The node->parent maple_type
51b63e667ad838 Liam R. Howlett 2020-07-24 414 */
51b63e667ad838 Liam R. Howlett 2020-07-24 415 static inline
51b63e667ad838 Liam R. Howlett 2020-07-24 416 enum maple_type mte_parent_enum(struct maple_enode *p_enode,
51b63e667ad838 Liam R. Howlett 2020-07-24 417 struct maple_tree *mt)
51b63e667ad838 Liam R. Howlett 2020-07-24 418 {
51b63e667ad838 Liam R. Howlett 2020-07-24 419 unsigned long p_type;
51b63e667ad838 Liam R. Howlett 2020-07-24 420
51b63e667ad838 Liam R. Howlett 2020-07-24 421 p_type = (unsigned long)p_enode;
51b63e667ad838 Liam R. Howlett 2020-07-24 422 if (p_type & MAPLE_PARENT_ROOT)
51b63e667ad838 Liam R. Howlett 2020-07-24 423 return 0; /* Validated in the caller. */
51b63e667ad838 Liam R. Howlett 2020-07-24 424
51b63e667ad838 Liam R. Howlett 2020-07-24 425 p_type &= MAPLE_NODE_MASK;
51b63e667ad838 Liam R. Howlett 2020-07-24 426 p_type = p_type & ~(MAPLE_PARENT_ROOT | mte_parent_slot_mask(p_type));
51b63e667ad838 Liam R. Howlett 2020-07-24 427
51b63e667ad838 Liam R. Howlett 2020-07-24 428 switch (p_type) {
51b63e667ad838 Liam R. Howlett 2020-07-24 429 case MAPLE_PARENT_RANGE64: /* or MAPLE_PARENT_ARANGE64 */
51b63e667ad838 Liam R. Howlett 2020-07-24 430 if (mt_is_alloc(mt))
51b63e667ad838 Liam R. Howlett 2020-07-24 431 return maple_arange_64;
51b63e667ad838 Liam R. Howlett 2020-07-24 432 return maple_range_64;
51b63e667ad838 Liam R. Howlett 2020-07-24 433 }
51b63e667ad838 Liam R. Howlett 2020-07-24 434
51b63e667ad838 Liam R. Howlett 2020-07-24 435 return 0;
51b63e667ad838 Liam R. Howlett 2020-07-24 436 }
51b63e667ad838 Liam R. Howlett 2020-07-24 437
51b63e667ad838 Liam R. Howlett 2020-07-24 438 static inline
51b63e667ad838 Liam R. Howlett 2020-07-24 439 enum maple_type mas_parent_enum(struct ma_state *mas, struct maple_enode *enode)
51b63e667ad838 Liam R. Howlett 2020-07-24 440 {
51b63e667ad838 Liam R. Howlett 2020-07-24 441 return mte_parent_enum(ma_enode_ptr(mte_to_node(enode)->parent), mas->tree);
51b63e667ad838 Liam R. Howlett 2020-07-24 442 }
51b63e667ad838 Liam R. Howlett 2020-07-24 443
51b63e667ad838 Liam R. Howlett 2020-07-24 444 /*
51b63e667ad838 Liam R. Howlett 2020-07-24 445 * mte_set_parent() - Set the parent node and encode the slot
51b63e667ad838 Liam R. Howlett 2020-07-24 446 * @enode: The encoded maple node.
51b63e667ad838 Liam R. Howlett 2020-07-24 447 * @parent: The encoded maple node that is the parent of @enode.
51b63e667ad838 Liam R. Howlett 2020-07-24 448 * @slot: The slot that @enode resides in @parent.
51b63e667ad838 Liam R. Howlett 2020-07-24 449 *
51b63e667ad838 Liam R. Howlett 2020-07-24 450 * Slot number is encoded in the enode->parent bit 3-6 or 2-6, depending on the
51b63e667ad838 Liam R. Howlett 2020-07-24 451 * parent type.
51b63e667ad838 Liam R. Howlett 2020-07-24 452 */
51b63e667ad838 Liam R. Howlett 2020-07-24 453 static inline
51b63e667ad838 Liam R. Howlett 2020-07-24 454 void mte_set_parent(struct maple_enode *enode, const struct maple_enode *parent,
51b63e667ad838 Liam R. Howlett 2020-07-24 455 unsigned char slot)
51b63e667ad838 Liam R. Howlett 2020-07-24 456 {
51b63e667ad838 Liam R. Howlett 2020-07-24 457 unsigned long val = (unsigned long) parent;
51b63e667ad838 Liam R. Howlett 2020-07-24 458 unsigned long shift;
51b63e667ad838 Liam R. Howlett 2020-07-24 459 unsigned long type;
51b63e667ad838 Liam R. Howlett 2020-07-24 460 enum maple_type p_type = mte_node_type(parent);
51b63e667ad838 Liam R. Howlett 2020-07-24 461
51b63e667ad838 Liam R. Howlett 2020-07-24 462 switch(p_type) {
51b63e667ad838 Liam R. Howlett 2020-07-24 463 case maple_range_64:
51b63e667ad838 Liam R. Howlett 2020-07-24 464 case maple_arange_64:
51b63e667ad838 Liam R. Howlett 2020-07-24 465 shift = MAPLE_PARENT_SLOT_SHIFT;
51b63e667ad838 Liam R. Howlett 2020-07-24 466 type = MAPLE_PARENT_RANGE64;
51b63e667ad838 Liam R. Howlett 2020-07-24 467 break;
51b63e667ad838 Liam R. Howlett 2020-07-24 468 case maple_dense:
51b63e667ad838 Liam R. Howlett 2020-07-24 469 case maple_leaf_64:
51b63e667ad838 Liam R. Howlett 2020-07-24 @470 shift = type = 0;
51b63e667ad838 Liam R. Howlett 2020-07-24 471 BUG_ON(1);
51b63e667ad838 Liam R. Howlett 2020-07-24 472 break;
51b63e667ad838 Liam R. Howlett 2020-07-24 473 }
51b63e667ad838 Liam R. Howlett 2020-07-24 474
51b63e667ad838 Liam R. Howlett 2020-07-24 475 val &= ~MAPLE_NODE_MASK; /* Clear all node metadata in parent */
51b63e667ad838 Liam R. Howlett 2020-07-24 476 val |= (slot << shift) | type;
51b63e667ad838 Liam R. Howlett 2020-07-24 477 mte_to_node(enode)->parent = ma_parent_ptr(val);
51b63e667ad838 Liam R. Howlett 2020-07-24 478 }
51b63e667ad838 Liam R. Howlett 2020-07-24 479
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-04-07 7:12 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-07 7:12 [ammarfaizi2-block:dhowells/linux-fs/netfs-maple 19/40] lib/maple_tree.c:319:2: warning: Value stored to 'node' is never read [clang-analyzer-deadcode.DeadStores] kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.