Skip to content

Commit 84cc8bc

Browse files
committed
Fix some clang static analyzer warnings
1 parent 4f8f18d commit 84cc8bc

File tree

12 files changed

+94
-81
lines changed

12 files changed

+94
-81
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
### Fixed
88
* <How do the end-user experience this issue? what was the impact?> ([#????](https://github.com/realm/realm-core/issues/????), since v?.?.?)
9-
* None.
9+
* Fix some clang static analyzer warnings. None of them were actual bugs ([PR #6675](https://github.com/realm/realm-core/pull/6675)).
1010

1111
### Breaking changes
1212
* None.

src/realm/bplustree.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -742,9 +742,9 @@ void BPlusTreeBase::bptree_erase(size_t n, BPlusTreeNode::EraseFunc func)
742742
ref_type new_root_ref = node->clear_first_bp_node_ref();
743743
node->destroy_deep();
744744

745-
auto new_root = create_root_from_ref(new_root_ref);
746-
747-
replace_root(std::move(new_root));
745+
if (auto new_root = create_root_from_ref(new_root_ref)) {
746+
replace_root(std::move(new_root));
747+
}
748748
root_size = m_root->get_node_size();
749749
}
750750
}
@@ -757,7 +757,7 @@ std::unique_ptr<BPlusTreeNode> BPlusTreeBase::create_root_from_ref(ref_type ref)
757757

758758
if (reuse_root) {
759759
m_root->init_from_ref(ref);
760-
return std::move(m_root);
760+
return nullptr;
761761
}
762762

763763
if (is_leaf) {

src/realm/bplustree.hpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,10 +172,10 @@ class BPlusTreeBase {
172172

173173
void init_from_ref(ref_type ref)
174174
{
175-
auto new_root = create_root_from_ref(ref);
176-
new_root->bp_set_parent(m_parent, m_ndx_in_parent);
177-
178-
m_root = std::move(new_root);
175+
if (auto new_root = create_root_from_ref(ref)) {
176+
new_root->bp_set_parent(m_parent, m_ndx_in_parent);
177+
m_root = std::move(new_root);
178+
}
179179

180180
invalidate_leaf_cache();
181181
m_size = m_root->get_tree_size();
@@ -187,9 +187,10 @@ class BPlusTreeBase {
187187
if (!ref) {
188188
return false;
189189
}
190-
auto new_root = create_root_from_ref(ref);
191-
new_root->bp_set_parent(m_parent, m_ndx_in_parent);
192-
m_root = std::move(new_root);
190+
if (auto new_root = create_root_from_ref(ref)) {
191+
new_root->bp_set_parent(m_parent, m_ndx_in_parent);
192+
m_root = std::move(new_root);
193+
}
193194
invalidate_leaf_cache();
194195
m_size = m_root->get_tree_size();
195196
return true;
@@ -374,6 +375,11 @@ class BPlusTree : public BPlusTreeBase {
374375
REALM_NOINLINE T get_uncached(size_t n) const
375376
{
376377
T value;
378+
#ifdef __clang_analyzer__
379+
// Clang's static analyzer can't see that value will always be initialized
380+
// inside bptree_access()
381+
value = {};
382+
#endif
377383

378384
auto func = [&value](BPlusTreeNode* node, size_t ndx) {
379385
LeafNode* leaf = static_cast<LeafNode*>(node);

src/realm/object-store/c_api/realm.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,8 @@ RLM_API bool realm_remove_table(realm_t* realm, const char* table_name, bool* ta
305305
"Attempt to remove a table that is currently part of the schema");
306306
}
307307
(*realm)->read_group().remove_table(table->get_key());
308-
*table_deleted = true;
308+
if (table_deleted)
309+
*table_deleted = true;
309310
}
310311
return true;
311312
});

src/realm/sync/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,10 @@ set(NOINST_HEADERS
8080
noinst/sync_metadata_schema.hpp
8181
)
8282

83-
set(SYNC_HEADERS ${IMPL_INSTALL_HEADESR}
83+
set(SYNC_HEADERS
84+
${IMPL_INSTALL_HEADESR}
8485
${SYNC_INSTALL_HEADERS}
86+
${SYNC_NETWORK_INSTALL_HEADERS}
8587
${NOINST_HEADERS})
8688

8789
add_library(Sync STATIC ${SYNC_SOURCES} ${SYNC_HEADERS})

src/realm/sync/network/network.hpp

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1998,7 +1998,7 @@ class Service::PostOper : public PostOperBase {
19981998
public:
19991999
PostOper(std::size_t size, Impl& service, H&& handler)
20002000
: PostOperBase{size, service}
2001-
, m_handler{std::move(handler)}
2001+
, m_handler{std::forward<H>(handler)}
20022002
{
20032003
}
20042004
void recycle_and_execute() override final
@@ -2256,7 +2256,7 @@ class Service::BasicStreamOps {
22562256
char* begin = buffer;
22572257
char* end = buffer + size;
22582258
LendersReadOperPtr op = Service::alloc<ReadOper<H>>(stream.lowest_layer().m_read_oper, stream, is_read_some,
2259-
begin, end, std::move(handler)); // Throws
2259+
begin, end, std::forward<H>(handler)); // Throws
22602260
stream.lowest_layer().m_desc.initiate_oper(std::move(op)); // Throws
22612261
}
22622262

@@ -2265,8 +2265,9 @@ class Service::BasicStreamOps {
22652265
{
22662266
const char* begin = data;
22672267
const char* end = data + size;
2268-
LendersWriteOperPtr op = Service::alloc<WriteOper<H>>(
2269-
stream.lowest_layer().m_write_oper, stream, is_write_some, begin, end, std::move(handler)); // Throws
2268+
LendersWriteOperPtr op =
2269+
Service::alloc<WriteOper<H>>(stream.lowest_layer().m_write_oper, stream, is_write_some, begin, end,
2270+
std::forward<H>(handler)); // Throws
22702271
stream.lowest_layer().m_desc.initiate_oper(std::move(op)); // Throws
22712272
}
22722273

@@ -2278,7 +2279,7 @@ class Service::BasicStreamOps {
22782279
char* end = buffer + size;
22792280
LendersBufferedReadOperPtr op =
22802281
Service::alloc<BufferedReadOper<H>>(stream.lowest_layer().m_read_oper, stream, begin, end, delim, rab,
2281-
std::move(handler)); // Throws
2282+
std::forward<H>(handler)); // Throws
22822283
stream.lowest_layer().m_desc.initiate_oper(std::move(op)); // Throws
22832284
}
22842285
};
@@ -2554,7 +2555,7 @@ class Service::BasicStreamOps<S>::ReadOper : public ReadOperBase {
25542555
public:
25552556
ReadOper(std::size_t size, S& stream, bool is_read_some, char* begin, char* end, H&& handler)
25562557
: ReadOperBase{size, stream, is_read_some, begin, end}
2557-
, m_handler{std::move(handler)}
2558+
, m_handler{std::forward<H>(handler)}
25582559
{
25592560
}
25602561
void recycle_and_execute() override final
@@ -2584,7 +2585,7 @@ class Service::BasicStreamOps<S>::WriteOper : public WriteOperBase {
25842585
public:
25852586
WriteOper(std::size_t size, S& stream, bool is_write_some, const char* begin, const char* end, H&& handler)
25862587
: WriteOperBase{size, stream, is_write_some, begin, end}
2587-
, m_handler{std::move(handler)}
2588+
, m_handler{std::forward<H>(handler)}
25882589
{
25892590
}
25902591
void recycle_and_execute() override final
@@ -2615,7 +2616,7 @@ class Service::BasicStreamOps<S>::BufferedReadOper : public BufferedReadOperBase
26152616
BufferedReadOper(std::size_t size, S& stream, char* begin, char* end, int delim, ReadAheadBuffer& rab,
26162617
H&& handler)
26172618
: BufferedReadOperBase{size, stream, begin, end, delim, rab}
2618-
, m_handler{std::move(handler)}
2619+
, m_handler{std::forward<H>(handler)}
26192620
{
26202621
}
26212622
void recycle_and_execute() override final
@@ -2703,7 +2704,7 @@ template <class H>
27032704
inline Service::PostOperBase* Service::post_oper_constr(void* addr, std::size_t size, Impl& service, void* cookie)
27042705
{
27052706
H& handler = *static_cast<H*>(cookie);
2706-
return new (addr) PostOper<H>(size, service, std::move(handler)); // Throws
2707+
return new (addr) PostOper<H>(size, service, std::forward<H>(handler)); // Throws
27072708
}
27082709

27092710
inline bool Service::AsyncOper::in_use() const noexcept
@@ -2769,10 +2770,8 @@ inline void Service::AsyncOper::do_recycle_and_execute(bool orphaned, H& handler
27692770
// happens. For that reason, copying and moving of arguments must not
27702771
// happen until we are in a scope (this scope) that catches and deals
27712772
// correctly with such exceptions.
2772-
do_recycle_and_execute_helper(orphaned, was_recycled, std::move(handler),
2773+
do_recycle_and_execute_helper(orphaned, was_recycled, std::forward<H>(handler),
27732774
std::forward<Args>(args)...); // Throws
2774-
2775-
// Removed catch to prevent truncating the stack trace on exception
27762775
}
27772776

27782777
template <class H, class... Args>
@@ -2805,7 +2804,7 @@ class Resolver::ResolveOper : public Service::ResolveOperBase {
28052804
public:
28062805
ResolveOper(std::size_t size, Resolver& r, Query q, H&& handler)
28072806
: ResolveOperBase{size, r, std::move(q)}
2808-
, m_handler{std::move(handler)}
2807+
, m_handler{std::forward<H>(handler)}
28092808
{
28102809
}
28112810
void recycle_and_execute() override final
@@ -2847,7 +2846,7 @@ template <class H>
28472846
void Resolver::async_resolve(Query query, H&& handler)
28482847
{
28492848
Service::LendersResolveOperPtr op = Service::alloc<ResolveOper<H>>(m_resolve_oper, *this, std::move(query),
2850-
std::move(handler)); // Throws
2849+
std::forward<H>(handler)); // Throws
28512850
initiate_oper(std::move(op)); // Throws
28522851
}
28532852

@@ -3086,7 +3085,7 @@ class Socket::ConnectOper : public ConnectOperBase {
30863085
public:
30873086
ConnectOper(std::size_t size, Socket& sock, H&& handler)
30883087
: ConnectOperBase{size, sock}
3089-
, m_handler{std::move(handler)}
3088+
, m_handler{std::forward<H>(handler)}
30903089
{
30913090
}
30923091
void recycle_and_execute() override final
@@ -3214,50 +3213,51 @@ inline std::size_t Socket::write_some(const char* data, std::size_t size, std::e
32143213
template <class H>
32153214
inline void Socket::async_connect(const Endpoint& ep, H&& handler)
32163215
{
3217-
LendersConnectOperPtr op = Service::alloc<ConnectOper<H>>(m_write_oper, *this, std::move(handler)); // Throws
3216+
LendersConnectOperPtr op =
3217+
Service::alloc<ConnectOper<H>>(m_write_oper, *this, std::forward<H>(handler)); // Throws
32183218
m_desc.initiate_oper(std::move(op), ep); // Throws
32193219
}
32203220

32213221
template <class H>
32223222
inline void Socket::async_read(char* buffer, std::size_t size, H&& handler)
32233223
{
32243224
bool is_read_some = false;
3225-
StreamOps::async_read(*this, buffer, size, is_read_some, std::move(handler)); // Throws
3225+
StreamOps::async_read(*this, buffer, size, is_read_some, std::forward<H>(handler)); // Throws
32263226
}
32273227

32283228
template <class H>
32293229
inline void Socket::async_read(char* buffer, std::size_t size, ReadAheadBuffer& rab, H&& handler)
32303230
{
32313231
int delim = std::char_traits<char>::eof();
3232-
StreamOps::async_buffered_read(*this, buffer, size, delim, rab, std::move(handler)); // Throws
3232+
StreamOps::async_buffered_read(*this, buffer, size, delim, rab, std::forward<H>(handler)); // Throws
32333233
}
32343234

32353235
template <class H>
32363236
inline void Socket::async_read_until(char* buffer, std::size_t size, char delim, ReadAheadBuffer& rab, H&& handler)
32373237
{
32383238
int delim_2 = std::char_traits<char>::to_int_type(delim);
3239-
StreamOps::async_buffered_read(*this, buffer, size, delim_2, rab, std::move(handler)); // Throws
3239+
StreamOps::async_buffered_read(*this, buffer, size, delim_2, rab, std::forward<H>(handler)); // Throws
32403240
}
32413241

32423242
template <class H>
32433243
inline void Socket::async_write(const char* data, std::size_t size, H&& handler)
32443244
{
32453245
bool is_write_some = false;
3246-
StreamOps::async_write(*this, data, size, is_write_some, std::move(handler)); // Throws
3246+
StreamOps::async_write(*this, data, size, is_write_some, std::forward<H>(handler)); // Throws
32473247
}
32483248

32493249
template <class H>
32503250
inline void Socket::async_read_some(char* buffer, std::size_t size, H&& handler)
32513251
{
32523252
bool is_read_some = true;
3253-
StreamOps::async_read(*this, buffer, size, is_read_some, std::move(handler)); // Throws
3253+
StreamOps::async_read(*this, buffer, size, is_read_some, std::forward<H>(handler)); // Throws
32543254
}
32553255

32563256
template <class H>
32573257
inline void Socket::async_write_some(const char* data, std::size_t size, H&& handler)
32583258
{
32593259
bool is_write_some = true;
3260-
StreamOps::async_write(*this, data, size, is_write_some, std::move(handler)); // Throws
3260+
StreamOps::async_write(*this, data, size, is_write_some, std::forward<H>(handler)); // Throws
32613261
}
32623262

32633263
inline void Socket::shutdown(shutdown_type what)
@@ -3394,7 +3394,7 @@ class Acceptor::AcceptOper : public AcceptOperBase {
33943394
public:
33953395
AcceptOper(std::size_t size, Acceptor& a, Socket& s, Endpoint* e, H&& handler)
33963396
: AcceptOperBase{size, a, s, e}
3397-
, m_handler{std::move(handler)}
3397+
, m_handler{std::forward<H>(handler)}
33983398
{
33993399
}
34003400
void recycle_and_execute() override final
@@ -3456,13 +3456,13 @@ template <class H>
34563456
inline void Acceptor::async_accept(Socket& sock, H&& handler)
34573457
{
34583458
Endpoint* ep = nullptr;
3459-
async_accept(sock, ep, std::move(handler)); // Throws
3459+
async_accept(sock, ep, std::forward<H>(handler)); // Throws
34603460
}
34613461

34623462
template <class H>
34633463
inline void Acceptor::async_accept(Socket& sock, Endpoint& ep, H&& handler)
34643464
{
3465-
async_accept(sock, &ep, std::move(handler)); // Throws
3465+
async_accept(sock, &ep, std::forward<H>(handler)); // Throws
34663466
}
34673467

34683468
inline std::error_code Acceptor::accept(Socket& socket, Endpoint* ep, std::error_code& ec)
@@ -3491,7 +3491,7 @@ inline void Acceptor::async_accept(Socket& sock, Endpoint* ep, H&& handler)
34913491
if (REALM_UNLIKELY(sock.is_open()))
34923492
throw util::runtime_error("Socket is already open");
34933493
LendersAcceptOperPtr op = Service::alloc<AcceptOper<H>>(m_read_oper, *this, sock, ep,
3494-
std::move(handler)); // Throws
3494+
std::forward<H>(handler)); // Throws
34953495
m_desc.initiate_oper(std::move(op)); // Throws
34963496
}
34973497

@@ -3502,7 +3502,7 @@ class DeadlineTimer::WaitOper : public Service::WaitOperBase {
35023502
public:
35033503
WaitOper(std::size_t size, DeadlineTimer& timer, clock::time_point expiration_time, H&& handler)
35043504
: Service::WaitOperBase{size, timer, expiration_time}
3505-
, m_handler{std::move(handler)}
3505+
, m_handler{std::forward<H>(handler)}
35063506
{
35073507
}
35083508
void recycle_and_execute() override final
@@ -3542,7 +3542,7 @@ inline void DeadlineTimer::async_wait(std::chrono::duration<R, P> delay, H&& han
35423542
throw util::overflow_error("Expiration time overflow");
35433543
clock::time_point expiration_time = now + delay;
35443544
initiate_oper(Service::alloc<WaitOper<H>>(m_wait_oper, *this, expiration_time,
3545-
std::move(handler))); // Throws
3545+
std::forward<H>(handler))); // Throws
35463546
}
35473547

35483548
// ---------------- ReadAheadBuffer ----------------

src/realm/table.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ void Table::remove_recursive(CascadeState& cascade_state)
560560
REALM_ASSERT(group);
561561
cascade_state.m_group = group;
562562

563+
std::vector<std::pair<TableKey, ObjKey>> to_delete;
563564
do {
564565
cascade_state.send_notifications();
565566

@@ -572,14 +573,15 @@ void Table::remove_recursive(CascadeState& cascade_state)
572573
}
573574
cascade_state.m_to_be_nullified.clear();
574575

575-
auto to_delete = std::move(cascade_state.m_to_be_deleted);
576-
for (auto obj : to_delete) {
577-
auto table = group->get_table(obj.first);
576+
to_delete.swap(cascade_state.m_to_be_deleted);
577+
for (auto [table_key, obj_key] : to_delete) {
578+
auto table = group->get_table(table_key);
578579
// This might add to the list of objects that should be deleted
579-
REALM_ASSERT(!obj.second.is_unresolved());
580-
table->m_clusters.erase(obj.second, cascade_state);
580+
REALM_ASSERT(!obj_key.is_unresolved());
581+
table->m_clusters.erase(obj_key, cascade_state);
581582
}
582583
nullify_links(cascade_state);
584+
to_delete.clear();
583585
} while (!cascade_state.m_to_be_deleted.empty() || !cascade_state.m_to_be_nullified.empty());
584586
}
585587

@@ -1679,7 +1681,7 @@ void copy_list<Timestamp>(ref_type sub_table_ref, Obj& obj, ColKey col, Allocato
16791681

16801682
void Table::create_columns()
16811683
{
1682-
size_t cnt;
1684+
size_t cnt = 0;
16831685
auto get_column_cnt = [&cnt](const Cluster* cluster) {
16841686
cnt = cluster->nb_columns();
16851687
return IteratorControl::Stop;

src/realm/util/thread.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ inline void Mutex::unlock() noexcept
557557
#else
558558
int r = pthread_mutex_unlock(&m_impl);
559559
REALM_ASSERT(r == 0);
560+
static_cast<void>(r);
560561
#endif
561562
}
562563

@@ -780,6 +781,7 @@ inline void CondVar::notify() noexcept
780781
#else
781782
int r = pthread_cond_signal(&m_impl);
782783
REALM_ASSERT(r == 0);
784+
static_cast<void>(r);
783785
#endif
784786
}
785787

@@ -790,6 +792,7 @@ inline void CondVar::notify_all() noexcept
790792
#else
791793
int r = pthread_cond_broadcast(&m_impl);
792794
REALM_ASSERT(r == 0);
795+
static_cast<void>(r);
793796
#endif
794797
}
795798

0 commit comments

Comments
 (0)