mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 13:25:45 +02:00
lib: deprecate memset_zero template, use C99 compound literals instead
Sprinkle in some asserts to make sure compilers aren't getting creative. This may introduce a new compiler dependency, as I suspect older versions of GCC don't support this syntax. It definitely needs a new compiler flag to suppress a warning when some fields are not explicitly initialized. If we've omitted a field, it's because it's a field we don't know (or care) about, and we want that thing initialized to zero. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
parent
c698fd7211
commit
6325f9ed72
@ -11,14 +11,6 @@
|
||||
namespace crucible {
|
||||
using namespace std;
|
||||
|
||||
// Zero-initialize a base class object (usually a C struct)
|
||||
template <class Base>
|
||||
void
|
||||
memset_zero(Base *that)
|
||||
{
|
||||
memset(that, 0, sizeof(Base));
|
||||
}
|
||||
|
||||
// int->hex conversion with sprintf
|
||||
string to_hex(uint64_t i);
|
||||
|
||||
|
12
lib/fd.cc
12
lib/fd.cc
@ -477,9 +477,9 @@ namespace crucible {
|
||||
return pwrite_or_die(fd, text.data(), text.size(), offset);
|
||||
}
|
||||
|
||||
Stat::Stat()
|
||||
Stat::Stat() :
|
||||
stat( (stat) { } )
|
||||
{
|
||||
memset_zero<stat>(this);
|
||||
}
|
||||
|
||||
Stat &
|
||||
@ -498,15 +498,15 @@ namespace crucible {
|
||||
return *this;
|
||||
}
|
||||
|
||||
Stat::Stat(int fd)
|
||||
Stat::Stat(int fd) :
|
||||
stat( (stat) { } )
|
||||
{
|
||||
memset_zero<stat>(this);
|
||||
fstat(fd);
|
||||
}
|
||||
|
||||
Stat::Stat(const string &filename)
|
||||
Stat::Stat(const string &filename) :
|
||||
stat( (stat) { } )
|
||||
{
|
||||
memset_zero<stat>(this);
|
||||
lstat(filename);
|
||||
}
|
||||
|
||||
|
89
lib/fs.cc
89
lib/fs.cc
@ -32,17 +32,24 @@ namespace crucible {
|
||||
#endif
|
||||
}
|
||||
|
||||
BtrfsExtentInfo::BtrfsExtentInfo(int dst_fd, off_t dst_offset)
|
||||
BtrfsExtentInfo::BtrfsExtentInfo(int dst_fd, off_t dst_offset) :
|
||||
btrfs_ioctl_same_extent_info( (btrfs_ioctl_same_extent_info) { } )
|
||||
{
|
||||
memset_zero<btrfs_ioctl_same_extent_info>(this);
|
||||
assert(fd == 0);
|
||||
assert(logical_offset == 0);
|
||||
assert(bytes_deduped == 0);
|
||||
assert(status == 0);
|
||||
assert(reserved == 0);
|
||||
fd = dst_fd;
|
||||
logical_offset = dst_offset;
|
||||
}
|
||||
|
||||
BtrfsExtentSame::BtrfsExtentSame(int src_fd, off_t src_offset, off_t src_length) :
|
||||
btrfs_ioctl_same_args( (btrfs_ioctl_same_args) { } ),
|
||||
m_fd(src_fd)
|
||||
{
|
||||
memset_zero<btrfs_ioctl_same_args>(this);
|
||||
assert(logical_offset == 0);
|
||||
assert(length == 0);
|
||||
logical_offset = src_offset;
|
||||
length = src_length;
|
||||
}
|
||||
@ -126,12 +133,12 @@ namespace crucible {
|
||||
void
|
||||
btrfs_clone_range(int src_fd, off_t src_offset, off_t src_length, int dst_fd, off_t dst_offset)
|
||||
{
|
||||
struct btrfs_ioctl_clone_range_args args;
|
||||
memset_zero(&args);
|
||||
args.src_fd = src_fd;
|
||||
args.src_offset = src_offset;
|
||||
args.src_length = src_length;
|
||||
args.dest_offset = dst_offset;
|
||||
btrfs_ioctl_clone_range_args args ( (btrfs_ioctl_clone_range_args) {
|
||||
.src_fd = src_fd,
|
||||
.src_offset = ranged_cast<uint64_t, off_t>(src_offset),
|
||||
.src_length = ranged_cast<uint64_t, off_t>(src_length),
|
||||
.dest_offset = ranged_cast<uint64_t, off_t>(dst_offset),
|
||||
} );
|
||||
DIE_IF_MINUS_ONE(ioctl(dst_fd, BTRFS_IOC_CLONE_RANGE, &args));
|
||||
}
|
||||
|
||||
@ -257,10 +264,13 @@ namespace crucible {
|
||||
}
|
||||
|
||||
BtrfsIoctlLogicalInoArgs::BtrfsIoctlLogicalInoArgs(uint64_t new_logical, size_t new_size) :
|
||||
btrfs_ioctl_logical_ino_args( (btrfs_ioctl_logical_ino_args) { } ),
|
||||
m_container_size(new_size),
|
||||
m_container(new_size)
|
||||
{
|
||||
memset_zero<btrfs_ioctl_logical_ino_args>(this);
|
||||
assert(logical == 0);
|
||||
assert(size == 0);
|
||||
assert(flags == 0);
|
||||
logical = new_logical;
|
||||
}
|
||||
|
||||
@ -396,9 +406,10 @@ namespace crucible {
|
||||
}
|
||||
|
||||
BtrfsIoctlInoPathArgs::BtrfsIoctlInoPathArgs(uint64_t inode, size_t new_size) :
|
||||
btrfs_ioctl_ino_path_args( (btrfs_ioctl_ino_path_args) { } ),
|
||||
m_container_size(new_size)
|
||||
{
|
||||
memset_zero<btrfs_ioctl_ino_path_args>(this);
|
||||
assert(inum == 0);
|
||||
inum = inode;
|
||||
}
|
||||
|
||||
@ -458,9 +469,10 @@ namespace crucible {
|
||||
return os;
|
||||
}
|
||||
|
||||
BtrfsIoctlInoLookupArgs::BtrfsIoctlInoLookupArgs(uint64_t new_objectid)
|
||||
BtrfsIoctlInoLookupArgs::BtrfsIoctlInoLookupArgs(uint64_t new_objectid) :
|
||||
btrfs_ioctl_ino_lookup_args( (btrfs_ioctl_ino_lookup_args) { } )
|
||||
{
|
||||
memset_zero<btrfs_ioctl_ino_lookup_args>(this);
|
||||
assert(objectid == 0);
|
||||
objectid = new_objectid;
|
||||
}
|
||||
|
||||
@ -478,9 +490,9 @@ namespace crucible {
|
||||
}
|
||||
}
|
||||
|
||||
BtrfsIoctlDefragRangeArgs::BtrfsIoctlDefragRangeArgs()
|
||||
BtrfsIoctlDefragRangeArgs::BtrfsIoctlDefragRangeArgs() :
|
||||
btrfs_ioctl_defrag_range_args( (btrfs_ioctl_defrag_range_args) { } )
|
||||
{
|
||||
memset_zero<btrfs_ioctl_defrag_range_args>(this);
|
||||
}
|
||||
|
||||
bool
|
||||
@ -537,9 +549,9 @@ namespace crucible {
|
||||
return os;
|
||||
}
|
||||
|
||||
FiemapExtent::FiemapExtent()
|
||||
FiemapExtent::FiemapExtent() :
|
||||
fiemap_extent( (fiemap_extent) { } )
|
||||
{
|
||||
memset_zero<fiemap_extent>(this);
|
||||
}
|
||||
|
||||
FiemapExtent::FiemapExtent(const fiemap_extent &that)
|
||||
@ -660,14 +672,15 @@ namespace crucible {
|
||||
return os << "\n}";
|
||||
}
|
||||
|
||||
Fiemap::Fiemap(uint64_t start, uint64_t length)
|
||||
{
|
||||
memset_zero<fiemap>(this);
|
||||
fm_start = start;
|
||||
fm_length = length;
|
||||
// FIEMAP is slow and full of lines.
|
||||
Fiemap::Fiemap(uint64_t start, uint64_t length) :
|
||||
fiemap( (fiemap) {
|
||||
.fm_start = start,
|
||||
.fm_length = length,
|
||||
// FIEMAP is slow and full of lies.
|
||||
// This makes FIEMAP even slower, but reduces the lies a little.
|
||||
fm_flags = FIEMAP_FLAG_SYNC;
|
||||
.fm_flags = FIEMAP_FLAG_SYNC,
|
||||
})
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
@ -727,19 +740,20 @@ namespace crucible {
|
||||
}
|
||||
|
||||
BtrfsIoctlSearchKey::BtrfsIoctlSearchKey(size_t buf_size) :
|
||||
btrfs_ioctl_search_key( (btrfs_ioctl_search_key) {
|
||||
.max_objectid = numeric_limits<decltype(max_objectid)>::max(),
|
||||
.max_offset = numeric_limits<decltype(max_offset)>::max(),
|
||||
.max_transid = numeric_limits<decltype(max_transid)>::max(),
|
||||
.max_type = numeric_limits<decltype(max_type)>::max(),
|
||||
.nr_items = 1,
|
||||
}),
|
||||
m_buf_size(buf_size)
|
||||
{
|
||||
memset_zero<btrfs_ioctl_search_key>(this);
|
||||
max_objectid = numeric_limits<decltype(max_objectid)>::max();
|
||||
max_offset = numeric_limits<decltype(max_offset)>::max();
|
||||
max_transid = numeric_limits<decltype(max_transid)>::max();
|
||||
max_type = numeric_limits<decltype(max_type)>::max();
|
||||
nr_items = 1;
|
||||
}
|
||||
|
||||
BtrfsIoctlSearchHeader::BtrfsIoctlSearchHeader()
|
||||
BtrfsIoctlSearchHeader::BtrfsIoctlSearchHeader() :
|
||||
btrfs_ioctl_search_header( (btrfs_ioctl_search_header) { } )
|
||||
{
|
||||
memset_zero<btrfs_ioctl_search_header>(this);
|
||||
}
|
||||
|
||||
size_t
|
||||
@ -1084,9 +1098,9 @@ namespace crucible {
|
||||
return rv;
|
||||
}
|
||||
|
||||
Statvfs::Statvfs()
|
||||
Statvfs::Statvfs() :
|
||||
statvfs( (statvfs) { } )
|
||||
{
|
||||
memset_zero<statvfs>(this);
|
||||
}
|
||||
|
||||
Statvfs::Statvfs(int fd) :
|
||||
@ -1137,10 +1151,11 @@ namespace crucible {
|
||||
return os << " }";
|
||||
};
|
||||
|
||||
BtrfsIoctlFsInfoArgs::BtrfsIoctlFsInfoArgs()
|
||||
BtrfsIoctlFsInfoArgs::BtrfsIoctlFsInfoArgs() :
|
||||
btrfs_ioctl_fs_info_args_v2( (btrfs_ioctl_fs_info_args_v2) {
|
||||
.flags = BTRFS_FS_INFO_FLAG_CSUM_INFO,
|
||||
})
|
||||
{
|
||||
memset_zero<btrfs_ioctl_fs_info_args_v2>(this);
|
||||
flags = BTRFS_FS_INFO_FLAG_CSUM_INFO;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -10,4 +10,4 @@ CCFLAGS = -Wall -Wextra -Werror -O3
|
||||
CCFLAGS += -I../include -D_FILE_OFFSET_BITS=64
|
||||
|
||||
BEES_CFLAGS = $(CCFLAGS) -std=c99 $(CFLAGS)
|
||||
BEES_CXXFLAGS = $(CCFLAGS) -std=c++11 -Wold-style-cast $(CXXFLAGS)
|
||||
BEES_CXXFLAGS = $(CCFLAGS) -std=c++11 -Wold-style-cast -Wno-missing-field-initializers $(CXXFLAGS)
|
||||
|
Loading…
x
Reference in New Issue
Block a user