From 581d9c34cc244d6b9a8f6b08cf0629ddb3a22a6f Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sat, 23 Dec 2023 10:32:04 -0600 Subject: [PATCH] fix: gcc-13 warnings pt. 2 (#6404) * fix: tr_priority_t usage warnings * build: disable -Wnull-dereference warnings when building GTest * fix: -Wunused-result warning in tr_spawn_async() * fix: -Warray-bounds warning in NetTest::compact4() --- gtk/FileList.cc | 13 ++++----- gtk/OptionsDialog.cc | 2 +- libtransmission/net.h | 1 + libtransmission/resume.cc | 4 +-- libtransmission/subprocess-posix.cc | 4 +-- libtransmission/transmission.h | 16 +++++------ macosx/FilePriorityCell.mm | 2 +- tests/gtest/CMakeLists.txt | 8 ++++++ tests/libtransmission/net-test.cc | 42 ++++++++++++++--------------- 9 files changed, 49 insertions(+), 43 deletions(-) diff --git a/gtk/FileList.cc b/gtk/FileList.cc index 976af298a..7d93ffeb0 100644 --- a/gtk/FileList.cc +++ b/gtk/FileList.cc @@ -725,24 +725,25 @@ bool FileList::Impl::onViewPathToggled(Gtk::TreeViewColumn* col, Gtk::TreeModel: if (cid == file_cols.priority.index()) { - auto priority = iter->get_value(file_cols.priority); + auto const old_priority = iter->get_value(file_cols.priority); + auto new_priority = TR_PRI_NORMAL; - switch (priority) + switch (old_priority) { case TR_PRI_NORMAL: - priority = TR_PRI_HIGH; + new_priority = TR_PRI_HIGH; break; case TR_PRI_HIGH: - priority = TR_PRI_LOW; + new_priority = TR_PRI_LOW; break; default: - priority = TR_PRI_NORMAL; + new_priority = TR_PRI_NORMAL; break; } - tr_torrentSetFilePriorities(tor, indexBuf.data(), indexBuf.size(), priority); + tr_torrentSetFilePriorities(tor, indexBuf.data(), indexBuf.size(), new_priority); } else { diff --git a/gtk/OptionsDialog.cc b/gtk/OptionsDialog.cc index ef8ad5639..6f55bf979 100644 --- a/gtk/OptionsDialog.cc +++ b/gtk/OptionsDialog.cc @@ -118,7 +118,7 @@ void OptionsDialog::Impl::addResponseCB(int response) { if (response == TR_GTK_RESPONSE_TYPE(ACCEPT)) { - tr_torrentSetPriority(tor_, gtr_combo_box_get_active_enum(*priority_combo_)); + tr_torrentSetPriority(tor_, static_cast(gtr_combo_box_get_active_enum(*priority_combo_))); if (run_check_->get_active()) { diff --git a/libtransmission/net.h b/libtransmission/net.h index 7fb7c7a86..ad9066721 100644 --- a/libtransmission/net.h +++ b/libtransmission/net.h @@ -242,6 +242,7 @@ struct tr_address } addr; static auto constexpr CompactAddrBytes = std::array{ 4U, 16U }; + static auto constexpr CompactAddrMaxBytes = 16U; static_assert(std::size(CompactAddrBytes) == NUM_TR_AF_INET_TYPES); [[nodiscard]] static auto any(tr_address_type type) noexcept diff --git a/libtransmission/resume.cc b/libtransmission/resume.cc index 2f9bdd692..e6f094c7c 100644 --- a/libtransmission/resume.cc +++ b/libtransmission/resume.cc @@ -729,9 +729,9 @@ tr_resume::fields_t load_from_file(tr_torrent* tor, tr_torrent::ResumeHelper& he } if ((fields_to_load & tr_resume::BandwidthPriority) != 0 && tr_variantDictFindInt(&top, TR_KEY_bandwidth_priority, &i) && - tr_isPriority(i)) + tr_isPriority(static_cast(i))) { - tr_torrentSetPriority(tor, i); + tr_torrentSetPriority(tor, static_cast(i)); fields_loaded |= tr_resume::BandwidthPriority; } diff --git a/libtransmission/subprocess-posix.cc b/libtransmission/subprocess-posix.cc index 4f03b3cb5..0b407cd2e 100644 --- a/libtransmission/subprocess-posix.cc +++ b/libtransmission/subprocess-posix.cc @@ -164,8 +164,8 @@ bool tr_spawn_async( if (!tr_spawn_async_in_child(cmd, env, work_dir)) { - (void)write(pipe_fds[1], &errno, sizeof(errno)); - _exit(0); + auto const ok = write(pipe_fds[1], &errno, sizeof(errno)) != -1; + _exit(ok ? EXIT_SUCCESS : EXIT_FAILURE); } } diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index f0bc99934..1314fdc94 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -53,8 +53,6 @@ struct tr_torrent; struct tr_torrent_metainfo; struct tr_variant; -using tr_priority_t = int8_t; - #define TR_RPC_SESSION_ID_HEADER "X-Transmission-Session-Id" enum tr_verify_added_mode @@ -74,6 +72,13 @@ enum tr_encryption_mode TR_ENCRYPTION_REQUIRED }; +enum tr_priority_t : int8_t +{ + TR_PRI_LOW = -1, + TR_PRI_NORMAL = 0, /* since Normal is 0, memset initializes nicely */ + TR_PRI_HIGH = 1 +}; + #define TR_RATIO_NA (-1) #define TR_RATIO_INF (-2) @@ -1010,13 +1015,6 @@ void tr_torrentSetPeerLimit(tr_torrent* tor, uint16_t max_connected_peers); // --- File Priorities -enum : tr_priority_t -{ - TR_PRI_LOW = -1, - TR_PRI_NORMAL = 0, /* since Normal is 0, memset initializes nicely */ - TR_PRI_HIGH = 1 -}; - /** * @brief Set a batch of files to a particular priority. * diff --git a/macosx/FilePriorityCell.mm b/macosx/FilePriorityCell.mm index 4ac1eeebd..92fa6bc62 100644 --- a/macosx/FilePriorityCell.mm +++ b/macosx/FilePriorityCell.mm @@ -47,7 +47,7 @@ static CGFloat const kImageOverlap = 1.0; [super setSelected:flag forSegment:segment]; //only for when clicking manually - NSInteger priority; + tr_priority_t priority; switch (segment) { case 0: diff --git a/tests/gtest/CMakeLists.txt b/tests/gtest/CMakeLists.txt index d67b68c6f..77eef5320 100644 --- a/tests/gtest/CMakeLists.txt +++ b/tests/gtest/CMakeLists.txt @@ -2,6 +2,14 @@ set(GTEST_ROOT_DIR ${TR_THIRD_PARTY_SOURCE_DIR}/googletest/googletest) add_library(gtestall STATIC) +# GTest 1.12 triggers nullptr warnings in gcc 13 +set(CACHE_ID "${CMAKE_CXX_COMPILER_ID}_CXX_HAS-Wnull-dereference") +string(TOLOWER "${CACHE_ID}" CACHE_ID) +check_c_compiler_flag(-Wnull-dereference ${CACHE_ID}) +if(${CACHE_ID}) + target_compile_options(gtestall PRIVATE -Wno-null-dereference) +endif() + target_sources(gtestall PRIVATE ${GTEST_ROOT_DIR}/src/gtest-all.cc diff --git a/tests/libtransmission/net-test.cc b/tests/libtransmission/net-test.cc index e6d4aa95d..4e208a4fe 100644 --- a/tests/libtransmission/net-test.cc +++ b/tests/libtransmission/net-test.cc @@ -71,49 +71,47 @@ TEST_F(NetTest, compact4) EXPECT_EQ(ExpectedPort, port); // ...serialize it back again - auto compact4 = std::array{}; - auto out = std::data(compact4); + auto buf = std::array{}; + auto out = std::data(buf); out = socket_address.to_compact(out); - EXPECT_EQ(std::size(Compact4), static_cast(out - std::data(compact4))); - EXPECT_EQ(Compact4, compact4); + EXPECT_EQ(std::size(Compact4), static_cast(out - std::data(buf))); + EXPECT_TRUE(std::equal(std::begin(Compact4), std::end(Compact4), std::data(buf))); /// tr_address --> compact - compact4.fill(std::byte{}); - out = std::data(compact4); + buf.fill(std::byte{}); + out = std::data(buf); out = addr.to_compact(out); - EXPECT_EQ(std::size(Compact4) - tr_port::CompactPortBytes, static_cast(out - std::data(compact4))); - EXPECT_TRUE(std::equal( - std::data(Compact4), - std::data(Compact4) + std::size(Compact4) - tr_port::CompactPortBytes, - std::data(compact4))); + EXPECT_EQ(std::size(Compact4) - tr_port::CompactPortBytes, static_cast(out - std::data(buf))); + EXPECT_TRUE( + std::equal(std::data(Compact4), std::data(Compact4) + std::size(Compact4) - tr_port::CompactPortBytes, std::data(buf))); EXPECT_TRUE(std::all_of( - std::begin(compact4) + std::size(Compact4) - tr_port::CompactPortBytes, - std::end(compact4), + std::begin(buf) + std::size(Compact4) - tr_port::CompactPortBytes, + std::end(buf), [](std::byte const& byte) { return static_cast(byte) == 0U; })); /// sockaddr --> compact auto [ss, sslen] = socket_address.to_sockaddr(); - compact4.fill(std::byte{}); - out = std::data(compact4); + buf.fill(std::byte{}); + out = std::data(buf); out = tr_socket_address::to_compact(out, &ss); - EXPECT_EQ(out, std::data(compact4) + std::size(compact4)); - EXPECT_EQ(Compact4, compact4); + EXPECT_EQ(std::size(Compact4), static_cast(out - std::data(buf))); + EXPECT_TRUE(std::equal(std::begin(Compact4), std::end(Compact4), std::data(buf))); /// compact <--> tr_pex // extract them into a tr_pex struct... - auto const pex = tr_pex::from_compact_ipv4(std::data(compact4), std::size(compact4), nullptr, 0U); + auto const pex = tr_pex::from_compact_ipv4(std::data(buf), out - std::data(buf), nullptr, 0U); ASSERT_EQ(1U, std::size(pex)); EXPECT_EQ(addr, pex.front().socket_address.address()); EXPECT_EQ(port, pex.front().socket_address.port()); // ...serialize that back again too - std::fill(std::begin(compact4), std::end(compact4), std::byte{}); - out = std::data(compact4); + buf.fill(std::byte{}); + out = std::data(buf); out = tr_pex::to_compact(out, std::data(pex), std::size(pex)); - EXPECT_EQ(std::data(compact4) + std::size(compact4), out); - EXPECT_EQ(Compact4, compact4); + EXPECT_EQ(std::size(Compact4), static_cast(out - std::data(buf))); + EXPECT_TRUE(std::equal(std::begin(Compact4), std::end(Compact4), std::data(buf))); } TEST_F(NetTest, compact6)