summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-02-20 19:26:27 +0100
committerAndreas Kling <kling@serenityos.org>2021-02-21 00:02:21 +0100
commit01f1e480e5bc476e103322e25a0f57e812d78b22 (patch)
tree63da614d0e3ea9d0c259e8b3e897f69bcffe5952 /Userland
parent0c0127dc3fd2428f1c24a71d17671f361401df1f (diff)
downloadserenity-01f1e480e5bc476e103322e25a0f57e812d78b22.zip
LibELF: Fix various clang-tidy warnings
Remove a bunch of unused code, unnecessary const, and make some non-object-specific member functions static.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibCoreDump/Reader.cpp1
-rw-r--r--Userland/Libraries/LibELF/DynamicLinker.cpp4
-rw-r--r--Userland/Libraries/LibELF/DynamicLoader.cpp10
-rw-r--r--Userland/Libraries/LibELF/DynamicLoader.h12
-rw-r--r--Userland/Libraries/LibELF/DynamicObject.cpp32
-rw-r--r--Userland/Libraries/LibELF/DynamicObject.h37
-rw-r--r--Userland/Libraries/LibELF/Image.cpp28
-rw-r--r--Userland/Libraries/LibELF/Image.h20
8 files changed, 60 insertions, 84 deletions
diff --git a/Userland/Libraries/LibCoreDump/Reader.cpp b/Userland/Libraries/LibCoreDump/Reader.cpp
index ef6dd837f7..f041248832 100644
--- a/Userland/Libraries/LibCoreDump/Reader.cpp
+++ b/Userland/Libraries/LibCoreDump/Reader.cpp
@@ -29,7 +29,6 @@
#include <LibCoreDump/Reader.h>
#include <signal_numbers.h>
#include <string.h>
-#include <sys/stat.h>
namespace CoreDump {
diff --git a/Userland/Libraries/LibELF/DynamicLinker.cpp b/Userland/Libraries/LibELF/DynamicLinker.cpp
index 1ad1952941..1018a38ca6 100644
--- a/Userland/Libraries/LibELF/DynamicLinker.cpp
+++ b/Userland/Libraries/LibELF/DynamicLinker.cpp
@@ -33,17 +33,13 @@
#include <AK/LogStream.h>
#include <AK/ScopeGuard.h>
#include <LibC/mman.h>
-#include <LibC/stdio.h>
-#include <LibC/sys/internals.h>
#include <LibC/unistd.h>
#include <LibELF/AuxiliaryVector.h>
#include <LibELF/DynamicLinker.h>
#include <LibELF/DynamicLoader.h>
#include <LibELF/DynamicObject.h>
-#include <LibELF/Image.h>
#include <dlfcn.h>
#include <fcntl.h>
-#include <string.h>
#include <sys/types.h>
#include <syscall.h>
diff --git a/Userland/Libraries/LibELF/DynamicLoader.cpp b/Userland/Libraries/LibELF/DynamicLoader.cpp
index be8920b123..6c0e1bf504 100644
--- a/Userland/Libraries/LibELF/DynamicLoader.cpp
+++ b/Userland/Libraries/LibELF/DynamicLoader.cpp
@@ -60,7 +60,7 @@ RefPtr<DynamicLoader> DynamicLoader::try_create(int fd, String filename)
}
ASSERT(stat.st_size >= 0);
- size_t size = static_cast<size_t>(stat.st_size);
+ auto size = static_cast<size_t>(stat.st_size);
if (size < sizeof(Elf32_Ehdr))
return {};
@@ -203,12 +203,11 @@ bool DynamicLoader::load_stage_2(unsigned flags, size_t total_tls_size)
void DynamicLoader::do_main_relocations(size_t total_tls_size)
{
- auto do_single_relocation = [&](ELF::DynamicObject::Relocation relocation) {
+ auto do_single_relocation = [&](const ELF::DynamicObject::Relocation& relocation) {
switch (do_relocation(total_tls_size, relocation)) {
case RelocationResult::Failed:
dbgln("Loader.so: {} unresolved symbol '{}'", m_filename, relocation.symbol().name());
ASSERT_NOT_REACHED();
- break;
case RelocationResult::ResolveLater:
m_unresolved_relocations.append(relocation);
break;
@@ -394,7 +393,7 @@ void DynamicLoader::load_program_headers()
// FIXME: Initialize the values in the TLS section. Currently, it is zeroed.
}
-DynamicLoader::RelocationResult DynamicLoader::do_relocation(size_t total_tls_size, ELF::DynamicObject::Relocation relocation)
+DynamicLoader::RelocationResult DynamicLoader::do_relocation(size_t total_tls_size, const ELF::DynamicObject::Relocation& relocation)
{
dbgln_if(DYNAMIC_LOAD_DEBUG, "Relocation symbol: {}, type: {}", relocation.symbol().name(), relocation.type());
FlatPtr* patch_ptr = nullptr;
@@ -516,7 +515,6 @@ DynamicLoader::RelocationResult DynamicLoader::do_relocation(size_t total_tls_si
dbgln("Found a new exciting relocation type {}", relocation.type());
// printf("DynamicLoader: Found unknown relocation type %d\n", relocation.type());
ASSERT_NOT_REACHED();
- break;
}
return RelocationResult::Success;
}
@@ -530,7 +528,7 @@ void DynamicLoader::setup_plt_trampoline()
ASSERT(m_dynamic_object->has_plt());
VirtualAddress got_address = m_dynamic_object->plt_got_base_address();
- FlatPtr* got_ptr = (FlatPtr*)got_address.as_ptr();
+ auto* got_ptr = (FlatPtr*)got_address.as_ptr();
got_ptr[1] = (FlatPtr)m_dynamic_object.ptr();
got_ptr[2] = (FlatPtr)&_plt_trampoline;
diff --git a/Userland/Libraries/LibELF/DynamicLoader.h b/Userland/Libraries/LibELF/DynamicLoader.h
index 1f70ab3d7c..54dac90884 100644
--- a/Userland/Libraries/LibELF/DynamicLoader.h
+++ b/Userland/Libraries/LibELF/DynamicLoader.h
@@ -38,8 +38,6 @@
namespace ELF {
-#define ALIGN_ROUND_UP(x, align) ((((size_t)(x)) + align - 1) & (~(align - 1)))
-
class DynamicLoader : public RefCounted<DynamicLoader> {
public:
static RefPtr<DynamicLoader> try_create(int fd, String filename);
@@ -62,13 +60,6 @@ public:
// Intended for use by dlsym or other internal methods
void* symbol_for_name(const StringView&);
- void dump();
-
- // Requested program interpreter from program headers. May be empty string
- StringView program_interpreter() const { return m_program_interpreter; }
-
- VirtualAddress text_segment_load_addresss() const { return m_text_segment_load_address; }
-
void set_tls_offset(size_t offset) { m_tls_offset = offset; };
size_t tls_size() const { return m_tls_size; }
size_t tls_offset() const { return m_tls_offset; }
@@ -127,7 +118,7 @@ private:
Success = 1,
ResolveLater = 2,
};
- RelocationResult do_relocation(size_t total_tls_size, DynamicObject::Relocation relocation);
+ RelocationResult do_relocation(size_t total_tls_size, const DynamicObject::Relocation&);
size_t calculate_tls_size() const;
Optional<DynamicObject::SymbolLookupResult> lookup_symbol(const ELF::DynamicObject::Symbol&) const;
@@ -148,7 +139,6 @@ private:
VirtualAddress m_relro_segment_address;
size_t m_relro_segment_size { 0 };
- VirtualAddress m_tls_segment_address;
VirtualAddress m_dynamic_section_address;
size_t m_tls_offset { 0 };
diff --git a/Userland/Libraries/LibELF/DynamicObject.cpp b/Userland/Libraries/LibELF/DynamicObject.cpp
index d52c2913c3..17fc1fa450 100644
--- a/Userland/Libraries/LibELF/DynamicObject.cpp
+++ b/Userland/Libraries/LibELF/DynamicObject.cpp
@@ -41,8 +41,8 @@ DynamicObject::DynamicObject(VirtualAddress base_address, VirtualAddress dynamic
: m_base_address(base_address)
, m_dynamic_address(dynamic_section_addresss)
{
- Elf32_Ehdr* header = (Elf32_Ehdr*)base_address.as_ptr();
- Elf32_Phdr* pheader = (Elf32_Phdr*)(base_address.as_ptr() + header->e_phoff);
+ auto* header = (Elf32_Ehdr*)base_address.as_ptr();
+ auto* pheader = (Elf32_Phdr*)(base_address.as_ptr() + header->e_phoff);
m_elf_base_address = VirtualAddress(pheader->p_vaddr - pheader->p_offset);
if (header->e_type == ET_DYN)
m_is_elf_dynamic = true;
@@ -190,7 +190,7 @@ void DynamicObject::parse()
m_symbol_count = num_hash_chains;
}
-const DynamicObject::Relocation DynamicObject::RelocationSection::relocation(unsigned index) const
+DynamicObject::Relocation DynamicObject::RelocationSection::relocation(unsigned index) const
{
ASSERT(index < entry_count());
unsigned offset_in_section = index * entry_size();
@@ -198,57 +198,57 @@ const DynamicObject::Relocation DynamicObject::RelocationSection::relocation(uns
return Relocation(m_dynamic, *relocation_address, offset_in_section);
}
-const DynamicObject::Relocation DynamicObject::RelocationSection::relocation_at_offset(unsigned offset) const
+DynamicObject::Relocation DynamicObject::RelocationSection::relocation_at_offset(unsigned offset) const
{
ASSERT(offset <= (m_section_size_bytes - m_entry_size));
auto relocation_address = (Elf32_Rel*)address().offset(offset).as_ptr();
return Relocation(m_dynamic, *relocation_address, offset);
}
-const DynamicObject::Symbol DynamicObject::symbol(unsigned index) const
+DynamicObject::Symbol DynamicObject::symbol(unsigned index) const
{
auto symbol_section = Section(*this, m_symbol_table_offset, (m_symbol_count * m_size_of_symbol_table_entry), m_size_of_symbol_table_entry, "DT_SYMTAB");
auto symbol_entry = (Elf32_Sym*)symbol_section.address().offset(index * symbol_section.entry_size()).as_ptr();
return Symbol(*this, index, *symbol_entry);
}
-const DynamicObject::Section DynamicObject::init_section() const
+DynamicObject::Section DynamicObject::init_section() const
{
return Section(*this, m_init_offset, sizeof(void (*)()), sizeof(void (*)()), "DT_INIT");
}
-const DynamicObject::Section DynamicObject::fini_section() const
+DynamicObject::Section DynamicObject::fini_section() const
{
return Section(*this, m_fini_offset, sizeof(void (*)()), sizeof(void (*)()), "DT_FINI");
}
-const DynamicObject::Section DynamicObject::init_array_section() const
+DynamicObject::Section DynamicObject::init_array_section() const
{
return Section(*this, m_init_array_offset, m_init_array_size, sizeof(void (*)()), "DT_INIT_ARRAY");
}
-const DynamicObject::Section DynamicObject::fini_array_section() const
+DynamicObject::Section DynamicObject::fini_array_section() const
{
return Section(*this, m_fini_array_offset, m_fini_array_size, sizeof(void (*)()), "DT_FINI_ARRAY");
}
-const DynamicObject::HashSection DynamicObject::hash_section() const
+DynamicObject::HashSection DynamicObject::hash_section() const
{
const char* section_name = m_hash_type == HashType::SYSV ? "DT_HASH" : "DT_GNU_HASH";
return HashSection(Section(*this, m_hash_table_offset, 0, 0, section_name), m_hash_type);
}
-const DynamicObject::RelocationSection DynamicObject::relocation_section() const
+DynamicObject::RelocationSection DynamicObject::relocation_section() const
{
return RelocationSection(Section(*this, m_relocation_table_offset, m_size_of_relocation_table, m_size_of_relocation_entry, "DT_REL"));
}
-const DynamicObject::RelocationSection DynamicObject::plt_relocation_section() const
+DynamicObject::RelocationSection DynamicObject::plt_relocation_section() const
{
return RelocationSection(Section(*this, m_plt_relocation_offset_location, m_size_of_plt_relocation_entry_list, m_size_of_relocation_entry, "DT_JMPREL"));
}
-u32 DynamicObject::HashSection::calculate_elf_hash(const StringView& name) const
+u32 DynamicObject::HashSection::calculate_elf_hash(const StringView& name)
{
// SYSV ELF hash algorithm
// Note that the GNU HASH algorithm has less collisions
@@ -267,7 +267,7 @@ u32 DynamicObject::HashSection::calculate_elf_hash(const StringView& name) const
return hash;
}
-u32 DynamicObject::HashSection::calculate_gnu_hash(const StringView& name) const
+u32 DynamicObject::HashSection::calculate_gnu_hash(const StringView& name)
{
// GNU ELF hash algorithm
u32 hash = 5381;
@@ -283,7 +283,7 @@ auto DynamicObject::HashSection::lookup_symbol(const StringView& name) const ->
return (this->*(m_lookup_function))(name);
}
-const DynamicObject::Symbol DynamicObject::HashSection::lookup_elf_symbol(const StringView& name) const
+DynamicObject::Symbol DynamicObject::HashSection::lookup_elf_symbol(const StringView& name) const
{
u32 hash_value = calculate_elf_hash(name);
@@ -310,7 +310,7 @@ const DynamicObject::Symbol DynamicObject::HashSection::lookup_elf_symbol(const
return Symbol::create_undefined(m_dynamic);
}
-const DynamicObject::Symbol DynamicObject::HashSection::lookup_gnu_symbol(const StringView& name) const
+DynamicObject::Symbol DynamicObject::HashSection::lookup_gnu_symbol(const StringView& name) const
{
// Algorithm reference: https://ent-voy.blogspot.com/2011/02/
// TODO: Handle 64bit bloomwords for ELF_CLASS64
diff --git a/Userland/Libraries/LibELF/DynamicObject.h b/Userland/Libraries/LibELF/DynamicObject.h
index 0bbe231aea..a72b35ccb4 100644
--- a/Userland/Libraries/LibELF/DynamicObject.h
+++ b/Userland/Libraries/LibELF/DynamicObject.h
@@ -50,7 +50,7 @@ public:
class DynamicEntry {
public:
- DynamicEntry(const Elf32_Dyn& dyn)
+ explicit DynamicEntry(const Elf32_Dyn& dyn)
: m_dyn(dyn)
{
}
@@ -157,13 +157,13 @@ public:
class RelocationSection : public Section {
public:
- RelocationSection(const Section& section)
+ explicit RelocationSection(const Section& section)
: Section(section.m_dynamic, section.m_section_offset, section.m_section_size_bytes, section.m_entry_size, section.m_name)
{
}
unsigned relocation_count() const { return entry_count(); }
- const Relocation relocation(unsigned index) const;
- const Relocation relocation_at_offset(unsigned offset) const;
+ Relocation relocation(unsigned index) const;
+ Relocation relocation_at_offset(unsigned offset) const;
template<typename F>
void for_each_relocation(F) const;
};
@@ -183,7 +183,7 @@ public:
unsigned offset() const { return m_rel.r_offset; }
unsigned type() const { return ELF32_R_TYPE(m_rel.r_info); }
unsigned symbol_index() const { return ELF32_R_SYM(m_rel.r_info); }
- const Symbol symbol() const { return m_dynamic.symbol(symbol_index()); }
+ Symbol symbol() const { return m_dynamic.symbol(symbol_index()); }
VirtualAddress address() const
{
if (m_dynamic.elf_is_dynamic())
@@ -216,41 +216,40 @@ public:
break;
default:
ASSERT_NOT_REACHED();
- break;
}
}
Symbol lookup_symbol(const StringView& name) const;
private:
- u32 calculate_elf_hash(const StringView& name) const;
- u32 calculate_gnu_hash(const StringView& name) const;
+ static u32 calculate_elf_hash(const StringView& name);
+ static u32 calculate_gnu_hash(const StringView& name);
- const DynamicObject::Symbol lookup_elf_symbol(const StringView& name) const;
- const DynamicObject::Symbol lookup_gnu_symbol(const StringView& name) const;
+ DynamicObject::Symbol lookup_elf_symbol(const StringView& name) const;
+ DynamicObject::Symbol lookup_gnu_symbol(const StringView& name) const;
- typedef const DynamicObject::Symbol (HashSection::*LookupFunction)(const StringView&) const;
+ typedef DynamicObject::Symbol (HashSection::*LookupFunction)(const StringView&) const;
LookupFunction m_lookup_function {};
};
unsigned symbol_count() const { return m_symbol_count; }
- const Symbol symbol(unsigned) const;
+ Symbol symbol(unsigned) const;
typedef void (*InitializationFunction)();
bool has_init_section() const { return m_init_offset != 0; }
bool has_init_array_section() const { return m_init_array_offset != 0; }
- const Section init_section() const;
+ Section init_section() const;
InitializationFunction init_section_function() const;
- const Section fini_section() const;
- const Section init_array_section() const;
- const Section fini_array_section() const;
+ Section fini_section() const;
+ Section init_array_section() const;
+ Section fini_array_section() const;
- const HashSection hash_section() const;
+ HashSection hash_section() const;
- const RelocationSection relocation_section() const;
- const RelocationSection plt_relocation_section() const;
+ RelocationSection relocation_section() const;
+ RelocationSection plt_relocation_section() const;
bool should_process_origin() const { return m_dt_flags & DF_ORIGIN; }
bool requires_symbolic_symbol_resolution() const { return m_dt_flags & DF_SYMBOLIC; }
diff --git a/Userland/Libraries/LibELF/Image.cpp b/Userland/Libraries/LibELF/Image.cpp
index 7f39c3ca95..41adddc815 100644
--- a/Userland/Libraries/LibELF/Image.cpp
+++ b/Userland/Libraries/LibELF/Image.cpp
@@ -188,7 +188,7 @@ bool Image::parse()
// Then create a name-to-index map.
for (unsigned i = 0; i < section_count(); ++i) {
- auto& section = this->section(i);
+ auto section = this->section(i);
m_sections.set(section.name(), move(i));
}
@@ -250,7 +250,7 @@ const Elf32_Shdr& Image::section_header(unsigned index) const
return *reinterpret_cast<const Elf32_Shdr*>(raw_data(header().e_shoff + (index * header().e_shentsize)));
}
-const Image::Symbol Image::symbol(unsigned index) const
+Image::Symbol Image::symbol(unsigned index) const
{
ASSERT(m_valid);
ASSERT(index < symbol_count());
@@ -258,33 +258,28 @@ const Image::Symbol Image::symbol(unsigned index) const
return Symbol(*this, index, raw_syms[index]);
}
-const Image::Section Image::section(unsigned index) const
+Image::Section Image::section(unsigned index) const
{
ASSERT(m_valid);
ASSERT(index < section_count());
return Section(*this, index);
}
-const Image::ProgramHeader Image::program_header(unsigned index) const
+Image::ProgramHeader Image::program_header(unsigned index) const
{
ASSERT(m_valid);
ASSERT(index < program_header_count());
return ProgramHeader(*this, index);
}
-FlatPtr Image::program_header_table_offset() const
-{
- return header().e_phoff;
-}
-
-const Image::Relocation Image::RelocationSection::relocation(unsigned index) const
+Image::Relocation Image::RelocationSection::relocation(unsigned index) const
{
ASSERT(index < relocation_count());
auto* rels = reinterpret_cast<const Elf32_Rel*>(m_image.raw_data(offset()));
return Relocation(m_image, rels[index]);
}
-const Image::RelocationSection Image::Section::relocations() const
+Image::RelocationSection Image::Section::relocations() const
{
StringBuilder builder;
builder.append(".rel");
@@ -300,7 +295,7 @@ const Image::RelocationSection Image::Section::relocations() const
return static_cast<const RelocationSection>(relocation_section);
}
-const Image::Section Image::lookup_section(const String& name) const
+Image::Section Image::lookup_section(const String& name) const
{
ASSERT(m_valid);
if (auto it = m_sections.find(name); it != m_sections.end())
@@ -310,14 +305,14 @@ const Image::Section Image::lookup_section(const String& name) const
StringView Image::Symbol::raw_data() const
{
- auto& section = this->section();
+ auto section = this->section();
return { section.raw_data() + (value() - section.address()), size() };
}
Optional<Image::Symbol> Image::find_demangled_function(const String& name) const
{
Optional<Image::Symbol> found;
- for_each_symbol([&](const Image::Symbol symbol) {
+ for_each_symbol([&](const Image::Symbol& symbol) {
if (symbol.type() != STT_FUNC)
return IterationDecision::Continue;
if (symbol.is_undefined())
@@ -344,7 +339,7 @@ Optional<Image::Symbol> Image::find_symbol(u32 address, u32* out_offset) const
SortedSymbol* sorted_symbols = nullptr;
if (m_sorted_symbols.is_empty()) {
m_sorted_symbols.ensure_capacity(symbol_count);
- for_each_symbol([this](auto& symbol) {
+ for_each_symbol([this](const auto& symbol) {
m_sorted_symbols.append({ symbol.value(), symbol.name(), {}, symbol });
return IterationDecision::Continue;
});
@@ -376,10 +371,9 @@ String Image::symbolicate(u32 address, u32* out_offset) const
return "??";
}
SortedSymbol* sorted_symbols = nullptr;
-
if (m_sorted_symbols.is_empty()) {
m_sorted_symbols.ensure_capacity(symbol_count);
- for_each_symbol([this](auto& symbol) {
+ for_each_symbol([this](const auto& symbol) {
m_sorted_symbols.append({ symbol.value(), symbol.name(), {}, symbol });
return IterationDecision::Continue;
});
diff --git a/Userland/Libraries/LibELF/Image.h b/Userland/Libraries/LibELF/Image.h
index 3250cf4deb..d477e09978 100644
--- a/Userland/Libraries/LibELF/Image.h
+++ b/Userland/Libraries/LibELF/Image.h
@@ -77,7 +77,7 @@ public:
unsigned index() const { return m_index; }
unsigned type() const { return ELF32_ST_TYPE(m_sym.st_info); }
unsigned bind() const { return ELF32_ST_BIND(m_sym.st_info); }
- const Section section() const { return m_image.section(section_index()); }
+ Section section() const { return m_image.section(section_index()); }
bool is_undefined() const { return section_index() == 0; }
StringView raw_data() const;
@@ -137,7 +137,7 @@ public:
const char* raw_data() const { return m_image.raw_data(m_section_header.sh_offset); }
ReadonlyBytes bytes() const { return { raw_data(), size() }; }
bool is_undefined() const { return m_section_index == SHN_UNDEF; }
- const RelocationSection relocations() const;
+ RelocationSection relocations() const;
u32 flags() const { return m_section_header.sh_flags; }
bool is_writable() const { return flags() & SHF_WRITE; }
bool is_executable() const { return flags() & PF_X; }
@@ -151,12 +151,12 @@ public:
class RelocationSection : public Section {
public:
- RelocationSection(const Section& section)
+ explicit RelocationSection(const Section& section)
: Section(section.m_image, section.m_section_index)
{
}
unsigned relocation_count() const { return entry_count(); }
- const Relocation relocation(unsigned index) const;
+ Relocation relocation(unsigned index) const;
template<typename F>
void for_each_relocation(F) const;
};
@@ -174,7 +174,7 @@ public:
unsigned offset() const { return m_rel.r_offset; }
unsigned type() const { return ELF32_R_TYPE(m_rel.r_info); }
unsigned symbol_index() const { return ELF32_R_SYM(m_rel.r_info); }
- const Symbol symbol() const { return m_image.symbol(symbol_index()); }
+ Symbol symbol() const { return m_image.symbol(symbol_index()); }
private:
const Image& m_image;
@@ -185,9 +185,9 @@ public:
unsigned section_count() const;
unsigned program_header_count() const;
- const Symbol symbol(unsigned) const;
- const Section section(unsigned) const;
- const ProgramHeader program_header(unsigned const) const;
+ Symbol symbol(unsigned) const;
+ Section section(unsigned) const;
+ ProgramHeader program_header(unsigned) const;
FlatPtr program_header_table_offset() const;
template<typename F>
@@ -201,7 +201,7 @@ public:
// NOTE: Returns section(0) if section with name is not found.
// FIXME: I don't love this API.
- const Section lookup_section(const String& name) const;
+ Section lookup_section(const String& name) const;
bool is_executable() const { return header().e_type == ET_EXEC; }
bool is_relocatable() const { return header().e_type == ET_REL; }
@@ -258,7 +258,7 @@ inline void Image::for_each_section_of_type(unsigned type, F func) const
{
auto section_count = this->section_count();
for (unsigned i = 0; i < section_count; ++i) {
- auto& section = this->section(i);
+ auto section = this->section(i);
if (section.type() == type) {
if (func(section) == IterationDecision::Break)
break;