**Describe the bug**
runtime error: applying zero offset to null pointer.
``` c++
// ./nanomq/nng/src/core/list.c:
void *
nni_list_first(const nni_list *list)
{
	nni_list_node *node = list->ll_head.ln_next;

	if (node == &list->ll_head) {
		return (NULL);
	}
	return (ITEM(list, node)); // null pointer.
}
```
**To Reproduce**
Build with UBSan: -DCMAKE_CXX_FLAGS="-g -O1 -fsanitize=address,undefined"
Start two nanomq server with different tcp address but the same ws address. (remove the pid file in /tmp/nanomq/nanomq.pid)

server 1
```bash
./nanomq
```
server2
```bash
./nanomq tart --url nmq-tcp://0.0.0.0:4453
```

Server Logs as follow

**Additional context**
```
2024-04-05 21:58:36 [2627426] ERROR /home/user/nanomq/nng/src/supplemental/nanolib/conf_ver2.c:1202 conf_parse_ver2: Configure file [(null)] or [/etc/nanomq.conf] not found or unreadable
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1141 print_conf: This NanoMQ instance configured as:
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1144 print_conf: tcp url:                  nmq-tcp://0.0.0.0:4453 
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1148 print_conf: websocket url:            nmq-ws://0.0.0.0:8083/mqtt
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1166 print_conf: daemon:                   false
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1168 print_conf: num_taskq_thread:         32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1170 print_conf: max_taskq_thread:         32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1171 print_conf: parallel:                 32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1172 print_conf: property_size:            32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1173 print_conf: max_packet_size:          1048576
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1175 print_conf: client_max_packet_size:   1048576
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1176 print_conf: msq_len:                  2048
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1177 print_conf: qos_duration:             10
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1178 print_conf: keepalive_backoff:        1.500000
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1215 print_conf: allow_anonymous:          true
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1219 print_conf: acl_nomatch:              allow
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1221 print_conf: enable_acl_cache:         on
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1223 print_conf: acl_cache_max_size:       32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1224 print_conf: acl_cache_ttl:            60
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1227 print_conf: acl_deny_action:          ignore
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nanomq/apps/broker.c:1272 store_pid: 2627426
nng_listen ws: Address in use
/home/user/nanomq/nng/src/core/list.c:39:10: runtime error: applying zero offset to null pointer
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /home/user/nanomq/nng/src/core/list.c:39:10 in 
```

runtime error: applying zero offset to null pointer
This is a GitHub Issue
repo:nanomq
owner:emqx
Title : runtime error: applying zero offset to null pointer
Issue date:

--- start body ---
**Describe the bug**
runtime error: applying zero offset to null pointer.
``` c++
// ./nanomq/nng/src/core/list.c:
void *
nni_list_first(const nni_list *list)
{
	nni_list_node *node = list->ll_head.ln_next;

	if (node == &list->ll_head) {
		return (NULL);
	}
	return (ITEM(list, node)); // null pointer.
}
```
**To Reproduce**
Build with UBSan: -DCMAKE_CXX_FLAGS="-g -O1 -fsanitize=address,undefined"
Start two nanomq server with different tcp address but the same ws address. (remove the pid file in /tmp/nanomq/nanomq.pid)

server 1
```bash
./nanomq
```
server2
```bash
./nanomq tart --url nmq-tcp://0.0.0.0:4453
```

Server Logs as follow

**Additional context**
```
2024-04-05 21:58:36 [2627426] ERROR /home/user/nanomq/nng/src/supplemental/nanolib/conf_ver2.c:1202 conf_parse_ver2: Configure file [(null)] or [/etc/nanomq.conf] not found or unreadable
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1141 print_conf: This NanoMQ instance configured as:
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1144 print_conf: tcp url:                  nmq-tcp://0.0.0.0:4453 
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1148 print_conf: websocket url:            nmq-ws://0.0.0.0:8083/mqtt
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1166 print_conf: daemon:                   false
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1168 print_conf: num_taskq_thread:         32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1170 print_conf: max_taskq_thread:         32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1171 print_conf: parallel:                 32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1172 print_conf: property_size:            32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1173 print_conf: max_packet_size:          1048576
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1175 print_conf: client_max_packet_size:   1048576
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1176 print_conf: msq_len:                  2048
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1177 print_conf: qos_duration:             10
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1178 print_conf: keepalive_backoff:        1.500000
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1215 print_conf: allow_anonymous:          true
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1219 print_conf: acl_nomatch:              allow
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1221 print_conf: enable_acl_cache:         on
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1223 print_conf: acl_cache_max_size:       32
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1224 print_conf: acl_cache_ttl:            60
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nng/src/supplemental/nanolib/conf.c:1227 print_conf: acl_deny_action:          ignore
2024-04-05 21:58:36 [2627426] INFO  /home/user/nanomq/nanomq/apps/broker.c:1272 store_pid: 2627426
nng_listen ws: Address in use
/home/user/nanomq/nng/src/core/list.c:39:10: runtime error: applying zero offset to null pointer
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /home/user/nanomq/nng/src/core/list.c:39:10 in 
```

--- end body ---
