diff --git a/.cppcheck_suppress b/.cppcheck_suppress index 2145129..fc80470 100644 --- a/.cppcheck_suppress +++ b/.cppcheck_suppress @@ -35,9 +35,12 @@ missingInclude *:*CLI11.hpp *:*json.hpp *:*boost_unordered.hpp +*:fmt/*.h # Problem caused by external files toomanyconfigs # More problems caused by external files -- with too many ifdefs normalCheckLevelMaxBranches # This seems not to work with the designs used here duplInheritedMember +# Seems like iterator variables for std::views disagree with this +constStatement diff --git a/src/adapter_matcher.cpp b/src/adapter_matcher.cpp index 0ac539a..822e9e5 100644 --- a/src/adapter_matcher.cpp +++ b/src/adapter_matcher.cpp @@ -131,6 +131,7 @@ y: {}, type: "line", name: "{}", }})"; + // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) assert(std::size(groups) == std::size(adap_counts)); // calcualte the x axis first const auto x = groups | std::views::transform([&](const auto &g) { @@ -146,9 +147,9 @@ name: "{}", std::ranges::transform(cumulative[curr], cumulative[prev], std::begin(cumulative[curr]), std::plus{}); #endif - const auto n_pos = max_read_len + 1 >= adapter_size - ? max_read_len - adapter_size + 1 - : max_read_len; + // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) + const auto n_pos = + max_read_len + 1 > adapter_size ? (max_read_len + 1) - adapter_size : 0U; const auto last_group_to_keep = std::ranges::find_if( groups, [&](const auto &g) { return n_pos <= g.first; }); cumulative.resize(std::distance(std::cbegin(groups), last_group_to_keep)); @@ -164,13 +165,15 @@ name: "{}", return pct_of_reads(cumul[adap_id]); }; const auto y = cumulative | std::views::transform(make_y); + // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) html_by_adapter.emplace_back(fmt::format(adapter_fmt, x, y, adap_name)); } const auto grade = grades.grade(label); const auto title = grades.get_title(label); - return fmt::format( - html_module_fmt, grade, label, title, grade, - std::format(plot_fmt, fmt::format("[{:n:}]", html_by_adapter))); + const auto the_plot = + // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) + std::format(plot_fmt, fmt::format("[{:n:}]", html_by_adapter)); + return fmt::format(html_module_fmt, grade, label, title, grade, the_plot); } auto diff --git a/src/adapter_set.cpp b/src/adapter_set.cpp index bf94c70..20b44a8 100644 --- a/src/adapter_set.cpp +++ b/src/adapter_set.cpp @@ -39,7 +39,8 @@ load_adapters(const std::string &filename) { // ADS: need to make sure this can't fail line.remove_suffix(std::size(line) - to_keep_suffix - 1); std::string cleaned_line; - for (auto itr = std::cbegin(line); itr != std::cend(line); ++itr) + for (auto itr = std::cbegin(line); itr != std::cend(line); + itr = std::next(itr)) if (!std::isblank(*itr) || (std::next(itr) != std::cend(line) && *itr != *std::next(itr))) cleaned_line += *itr; diff --git a/src/bam_file.cpp b/src/bam_file.cpp index cd152bc..bee2257 100644 --- a/src/bam_file.cpp +++ b/src/bam_file.cpp @@ -19,7 +19,9 @@ #include #include #include +#include #include +#include [[nodiscard]] auto estimate_n_reads_bam(const std::string &filename) @@ -63,8 +65,8 @@ estimate_n_reads_bam(const std::string &filename) } [[nodiscard]] auto -init_dups(const std::string &filename, - const std::uint64_t n_unique) -> dups_map_t { +init_dups(const std::string &filename, const std::uint64_t n_unique) + -> dups_map_t { static constexpr auto complem = [](const auto x) { return "TNGNNNCNNNNNNNNNNNNA"[x - 'A']; }; diff --git a/src/bam_file.hpp b/src/bam_file.hpp index 606df5d..93b52e4 100644 --- a/src/bam_file.hpp +++ b/src/bam_file.hpp @@ -62,7 +62,10 @@ class bam_file { ~bam_file() = default; // clang-format on - [[nodiscard]] operator bool() const { return !had_last_chunks; } + [[nodiscard]] + operator bool() const { + return !had_last_chunks; + } friend auto reset(bam_file &reads_file) -> void; @@ -121,8 +124,8 @@ estimate_n_reads_bam(const std::string &filename) -> std::tuple; [[nodiscard]] auto -init_dups(const std::string &filename, - const std::uint64_t n_unique) -> dups_map_t; +init_dups(const std::string &filename, const std::uint64_t n_unique) + -> dups_map_t; inline auto make_tasks(bam_file &reads_file, // diff --git a/src/base_groups.hpp b/src/base_groups.hpp index 75a561d..2dcbc06 100644 --- a/src/base_groups.hpp +++ b/src/base_groups.hpp @@ -23,8 +23,8 @@ make_base_groups(const std::uint64_t n_bases, const std::uint64_t n_initial, const std::uint64_t n_groups_target) -> base_group_vec; [[nodiscard]] auto -get_default_base_groups(const std::uint64_t n_bases, - const bool make_groups) -> base_group_vec; +get_default_base_groups(const std::uint64_t n_bases, const bool make_groups) + -> base_group_vec; [[nodiscard]] auto make_group_tag(const base_group_t g) -> std::string; @@ -32,7 +32,7 @@ make_group_tag(const base_group_t g) -> std::string; [[nodiscard]] auto make_group_tag_quoted(const base_group_t g) -> std::string; -[[nodiscard]] auto +void apply_base_groups(const base_group_vec &groups, auto &rows) { assert(std::size(rows) <= groups.back().second); auto group_itr = std::cbegin(groups); @@ -50,7 +50,7 @@ apply_base_groups(const base_group_vec &groups, auto &rows) { rows.resize(current_row); } -[[nodiscard]] auto +void apply_base_groups(const base_group_vec &groups, auto &rows, const auto &adder) { assert(std::size(rows) <= groups.back().second); auto group_itr = std::cbegin(groups); diff --git a/src/bgzf_reader.cpp b/src/bgzf_reader.cpp index 1805c5a..767a14a 100644 --- a/src/bgzf_reader.cpp +++ b/src/bgzf_reader.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,7 @@ get_unaligned_le32(const auto p) -> std::int32_t { get_isize(const auto data, const auto data_size) { static constexpr decltype(data_size) isize_size = 4; assert(data_size > isize_size); + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) const auto data_isize = data + data_size - isize_size; return data_size < isize_size ? 0 : get_unaligned_le32(data_isize); } @@ -50,7 +52,8 @@ bgzf_reader::bgzf_reader(const std::string &filename, next_in{inbuf.get()}, // end_in{inbuf.get()}, // next_out{outbuf.get()}, // - end_out{outbuf.get() + buf_size} // + // NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic) + end_out{outbuf.get() + buf_size} // {} [[nodiscard]] auto diff --git a/src/contaminants.cpp b/src/contaminants.cpp index 356879d..d6b64ef 100644 --- a/src/contaminants.cpp +++ b/src/contaminants.cpp @@ -11,6 +11,7 @@ #include #include #include +#include // for std::get #include #include @@ -197,7 +198,8 @@ load_contaminants(const std::string &filename) -> void { continue; line.remove_suffix(std::size(line) - to_keep_suffix - 1); std::string cleaned_line; - for (auto itr = std::cbegin(line); itr != std::cend(line); ++itr) + for (auto itr = std::cbegin(line); itr != std::cend(line); + itr = std::next(itr)) if (!std::isblank(*itr) || (std::next(itr) != std::cend(line) && *itr != *std::next(itr))) cleaned_line += *itr; diff --git a/src/contaminants.hpp b/src/contaminants.hpp index 186a57e..fba5a64 100644 --- a/src/contaminants.hpp +++ b/src/contaminants.hpp @@ -4,6 +4,7 @@ #define SRC_CONTAMINANTS_HPP_ #include +#include // for std::pair #include #include // IWYU pragma: keep #include diff --git a/src/duplication_results.cpp b/src/duplication_results.cpp index 85d8efb..2e3dd17 100644 --- a/src/duplication_results.cpp +++ b/src/duplication_results.cpp @@ -11,6 +11,7 @@ #include "run_mode.hpp" #define FMT_HEADER_ONLY +#include "fmt/base.h" #include "fmt/format.h" #include "fmt/ranges.h" @@ -124,8 +125,8 @@ duplication_results::get_overrepresented(const std::uint64_t n_reads) const } auto -duplication_results::initialize(const run_mode &mode, - const file_info &info) -> void { +duplication_results::initialize(const run_mode &mode, const file_info &info) + -> void { read_skip = info.n_reads_est < max_n_reads_total ? 0 @@ -282,8 +283,8 @@ get_grade_duplication(const dup_summary_t &summary) -> std::string { } [[nodiscard]] auto -duplication_report(const dup_summary_t &summary, - const file_grades &grades) -> std::string { +duplication_report(const dup_summary_t &summary, const file_grades &grades) + -> std::string { static constexpr auto label = "duplication"; static constexpr auto start_tag = ">>Sequence Duplication Levels\t{}\n" "#Total Deduplicated Percentage\t{:.6f}\n"; @@ -305,9 +306,10 @@ duplication_report(const dup_summary_t &summary, std::max(static_cast(1), reduce(summary.hist_mass))); auto r = std::format(start_tag, grades.grade(label), pct(frac_dedup)); r += header; - for (const auto [label, mass] : + for (const auto [bin_label, mass] : std::views::zip(bin_labels, binned_mass_pct) | std::views::drop(1)) - r += std::format("{}\t{:.3g}\n", label, mass); // Percentage format is .3g + r += + std::format("{}\t{:.3g}\n", bin_label, mass); // Percentage format is .3g return r + end_module_tag; } @@ -345,8 +347,8 @@ overrepresented_html(const std::vector &overrep, } [[nodiscard]] auto -duplication_html(const dup_summary_t &summary, - const file_grades &grades) -> std::string { +duplication_html(const dup_summary_t &summary, const file_grades &grades) + -> std::string { static constexpr auto label = "duplication"; static constexpr auto plot_format = R"(