diff options
29 files changed, 183 insertions, 230 deletions
diff --git a/Jamroot.jam b/Jamroot.jam index 0edd310..8677573 100644 --- a/Jamroot.jam +++ b/Jamroot.jam @@ -16,6 +16,11 @@ project <variant>debug:<cxxflags>"-W -Wall -Werror -Wextra" <variant>coverage:<cxxflags>"--coverage" <variant>coverage:<linkflags>"--coverage" + <toolset>tidy:<checkxx>boost-* + <toolset>tidy:<checkxx>bugprone-* + <toolset>tidy:<checkxx>clang-* + <toolset>tidy:<checkxx>misc-* + <toolset>tidy:<checkxx>modernize-* ; build-project netfs ; diff --git a/netfs/daemon/daemon.cpp b/netfs/daemon/daemon.cpp index 27dfbb9..2962ede 100644 --- a/netfs/daemon/daemon.cpp +++ b/netfs/daemon/daemon.cpp @@ -7,10 +7,6 @@ #include <sys/stat.h> #include <safeMapFind.h> -NetFSDaemon::NetFSDaemon() -{ -} - NetFSDaemon::~NetFSDaemon() { if (adapter) { @@ -24,8 +20,8 @@ NetFSDaemon::hostname() auto props = ic->getProperties(); auto hostNameOverride = props->getProperty("NetFSD.HostNameOverride"); if (hostNameOverride.empty()) { - char buf[128]; - gethostname(buf, sizeof(buf)); + std::string buf(128, 0); + gethostname(buf.data(), buf.size()); return buf; } return hostNameOverride; diff --git a/netfs/daemon/daemon.h b/netfs/daemon/daemon.h index 57e2023..bc12973 100644 --- a/netfs/daemon/daemon.h +++ b/netfs/daemon/daemon.h @@ -9,7 +9,6 @@ class DLL_PUBLIC NetFSDaemon : public IceBox::Service { public: - NetFSDaemon(); virtual ~NetFSDaemon(); virtual void start(const std::string&, const Ice::CommunicatorPtr&, const Ice::StringSeq&) override; diff --git a/netfs/daemon/daemonDirectory.cpp b/netfs/daemon/daemonDirectory.cpp index b03bd1f..44aa765 100644 --- a/netfs/daemon/daemonDirectory.cpp +++ b/netfs/daemon/daemonDirectory.cpp @@ -1,6 +1,6 @@ #include <Ice/ObjectAdapter.h> #include <dirent.h> -#include <errno.h> +#include <cerrno> #include <map> #include <sys/stat.h> #include <sys/types.h> @@ -13,10 +13,6 @@ DirectoryServer::DirectoryServer(DIR * d, EntryTypeConverter & t) : { } -DirectoryServer::~DirectoryServer() -{ -} - void DirectoryServer::close(const Ice::Current & ice) { diff --git a/netfs/daemon/daemonDirectory.h b/netfs/daemon/daemonDirectory.h index 5e549fe..b4da8f2 100644 --- a/netfs/daemon/daemonDirectory.h +++ b/netfs/daemon/daemonDirectory.h @@ -8,7 +8,6 @@ class DirectoryServer : public NetFS::DirectoryV2, EntryTypeConverter { public: DirectoryServer(DIR * od, EntryTypeConverter &); - virtual ~DirectoryServer(); virtual void close(const Ice::Current&) override; virtual NetFS::NameList readdir(const Ice::Current&) override; diff --git a/netfs/daemon/daemonFile.cpp b/netfs/daemon/daemonFile.cpp index 0df3c2a..1113904 100644 --- a/netfs/daemon/daemonFile.cpp +++ b/netfs/daemon/daemonFile.cpp @@ -1,5 +1,5 @@ #include <Ice/ObjectAdapter.h> -#include <errno.h> +#include <cerrno> #include <map> #include <fcntl.h> #include <typeConverter.h> @@ -13,10 +13,6 @@ FileServer::FileServer(int f, EntryTypeConverter & t) : { } -FileServer::~FileServer() -{ -} - void FileServer::ftruncate(const NetFS::ReqEnv re, Ice::Long size, const Ice::Current&) { diff --git a/netfs/daemon/daemonFile.h b/netfs/daemon/daemonFile.h index 9a01abf..ee4ae7d 100644 --- a/netfs/daemon/daemonFile.h +++ b/netfs/daemon/daemonFile.h @@ -7,7 +7,6 @@ class FileServer : public NetFS::File, EntryTypeConverter { public: FileServer(int fd, EntryTypeConverter &); - virtual ~FileServer(); virtual void close(const Ice::Current&) override; virtual void ftruncate(const NetFS::ReqEnv, Ice::Long size, const Ice::Current&) override; diff --git a/netfs/daemon/daemonService.cpp b/netfs/daemon/daemonService.cpp index a516cb2..30dac0a 100644 --- a/netfs/daemon/daemonService.cpp +++ b/netfs/daemon/daemonService.cpp @@ -4,7 +4,7 @@ #include <safeMapFind.h> ServiceServer::ServiceServer(NetFS::Daemon::ConfigurationPtr c) : - config(c) + config(std::move(c)) { } diff --git a/netfs/daemon/daemonVolume.cpp b/netfs/daemon/daemonVolume.cpp index 1a3680f..fd2f895 100644 --- a/netfs/daemon/daemonVolume.cpp +++ b/netfs/daemon/daemonVolume.cpp @@ -1,9 +1,9 @@ #include <Ice/ObjectAdapter.h> -#include <errno.h> +#include <cerrno> #include <map> #include <unistd.h> #include <sys/stat.h> -#include <limits.h> +#include <climits> #include <fcntl.h> #include "daemonVolume.h" #include "daemonFile.h" @@ -23,10 +23,6 @@ VolumeServer::VolumeServer(const std::filesystem::path & r, const EntCache<User> { } -VolumeServer::~VolumeServer() -{ -} - void VolumeServer::disconnect(const Ice::Current & ice) { @@ -135,14 +131,15 @@ VolumeServer::readlink(const NetFS::ReqEnv re, const std::string path, const Ice { ModeCheck mc(re, root, userLookup, groupLookup); errno = 0; - char buf[PATH_MAX]; + std::string buf(PATH_MAX, 0); std::filesystem::path p(resolvePath(std::move(path))); mc.AssertRead(p); - ssize_t rc = ::readlink(p.c_str(), buf, PATH_MAX); + ssize_t rc = ::readlink(p.c_str(), buf.data(), PATH_MAX); if (rc == -1) { throw NetFS::SystemError(errno); } - return std::string(buf, rc); + buf.resize(rc); + return buf; } void @@ -175,14 +172,10 @@ VolumeServer::utimens(const NetFS::ReqEnv re, const std::string path, { ModeCheck mc(re, root, userLookup, groupLookup); errno = 0; - struct timespec times[2]; - times[0].tv_sec = s0; - times[0].tv_nsec = ns0; - times[1].tv_sec = s1; - times[1].tv_nsec = ns1; + std::array<struct timespec, 2> times { { { s0, ns0 }, { s1, ns1 } } }; std::filesystem::path p(resolvePath(std::move(path))); mc.AssertWrite(p); - if (::utimensat(0, p.c_str(), times, AT_SYMLINK_NOFOLLOW) != 0) { + if (::utimensat(0, p.c_str(), times.data(), AT_SYMLINK_NOFOLLOW) != 0) { throw NetFS::SystemError(errno); } } diff --git a/netfs/daemon/daemonVolume.h b/netfs/daemon/daemonVolume.h index 6e29893..5087654 100644 --- a/netfs/daemon/daemonVolume.h +++ b/netfs/daemon/daemonVolume.h @@ -10,7 +10,6 @@ class VolumeServer : public NetFS::Volume { public: VolumeServer(const std::filesystem::path & root, const EntCache<User> &, const EntCache<Group> &); - virtual ~VolumeServer(); virtual NetFS::DirectoryPrxPtr opendir(const NetFS::ReqEnv, const std::string path, const Ice::Current&) override; diff --git a/netfs/fuse/fuseApp.cpp b/netfs/fuse/fuseApp.cpp index 79fa0dd..ef1ca7f 100644 --- a/netfs/fuse/fuseApp.cpp +++ b/netfs/fuse/fuseApp.cpp @@ -1,5 +1,5 @@ #include <Glacier2/Router.h> -#include <string.h> +#include <cstring> #include "fuseApp.h" #include "lockHelpers.h" #include "cache.impl.h" @@ -14,8 +14,8 @@ namespace AdHoc { template class CallCacheable<struct stat, std::string>; } -NetFS::FuseApp::FuseApp(const Ice::StringSeq & a) : - iceArgs(a), +NetFS::FuseApp::FuseApp(Ice::StringSeq a) : + iceArgs(std::move(a)), sessionOpened(false), openHandleId(0), converter(userLookup, groupLookup) @@ -77,7 +77,7 @@ NetFS::FuseApp::init(struct fuse_conn_info *) { ic = Ice::initialize(iceArgs); fcr = configurator(); - return NULL; + return nullptr; } NetFS::Client::ResourcePtr @@ -204,7 +204,7 @@ NetFS::FuseApp::verifyConnection() session->ice_ping(); } catch (const Ice::Exception &) { - session = NULL; + session = nullptr; sessionOpened = false; } } @@ -213,7 +213,7 @@ NetFS::FuseApp::verifyConnection() service->ice_ping(); } catch (const Ice::Exception &) { - service = NULL; + service = nullptr; } } if (volume) { @@ -221,13 +221,13 @@ NetFS::FuseApp::verifyConnection() volume->ice_ping(); } catch (const Ice::Exception &) { - volume = NULL; + volume = nullptr; } } } int -NetFS::FuseApp::onError(const std::exception & e) throw() +NetFS::FuseApp::onError(const std::exception & e) noexcept { if (dynamic_cast<const Ice::SocketException *>(&e) || dynamic_cast<const Ice::TimeoutException *>(&e)) { log(LOG_ERR, e.what()); @@ -245,7 +245,7 @@ NetFS::FuseApp::onError(const std::exception & e) throw() } if (dynamic_cast<const Ice::RequestFailedException *>(&e)) { try { - volume = NULL; + volume = nullptr; connectToVolume(); connectHandles(); return 0; diff --git a/netfs/fuse/fuseApp.h b/netfs/fuse/fuseApp.h index 23738b3..df342b6 100644 --- a/netfs/fuse/fuseApp.h +++ b/netfs/fuse/fuseApp.h @@ -20,7 +20,7 @@ namespace NetFS { private: class OpenDir { public: - OpenDir(DirectoryPrxPtr remote, const std::string & path); + OpenDir(DirectoryPrxPtr remote, std::string path); DirectoryPrxPtr remote; DirectoryV2PrxPtr remoteV2; @@ -31,7 +31,7 @@ namespace NetFS { class OpenFile { public: - OpenFile(FilePrxPtr remote, const std::string & path, int flags); + OpenFile(FilePrxPtr remote, std::string path, int flags); void flush(); void wait() const; @@ -49,7 +49,7 @@ namespace NetFS { typedef std::map<int, OpenFilePtr> OpenFiles; public: - FuseApp(const Ice::StringSeq &); + FuseApp(Ice::StringSeq); ~FuseApp(); private: diff --git a/netfs/fuse/fuseAppBase.cpp b/netfs/fuse/fuseAppBase.cpp index 3eadd8f..4485aec 100644 --- a/netfs/fuse/fuseAppBase.cpp +++ b/netfs/fuse/fuseAppBase.cpp @@ -1,19 +1,13 @@ #include "fuseAppBase.h" -#include <errno.h> -#include <assert.h> -#include <stdio.h> +#include <cerrno> +#include <cassert> +#include <cstdio> #include <unistd.h> -#include <stdlib.h> +#include <cstdlib> #include <typeinfo> FuseAppBase * FuseAppBase::fuseApp; -FuseAppBase::FuseAppBase() -{ -} -FuseAppBase::~FuseAppBase() -{ -} // LCOV_EXCL_START // These are all excluded from coverage because it is impossible // to call them in a realistic manner. They exist only as the default @@ -21,7 +15,7 @@ FuseAppBase::~FuseAppBase() // unless it is overridden. void * FuseAppBase::init(fuse_conn_info*) { - return NULL; + return nullptr; } int FuseAppBase::opt_parse(void*, const char *, int, fuse_args*) { @@ -155,6 +149,7 @@ int FuseAppBase::lock(const char *, struct fuse_file_info *, int, struct flock * { return -ENOSYS; } +// NOLINTNEXTLINE(modernize-avoid-c-arrays) int FuseAppBase::utimens(const char *, const struct timespec[2]) { return -ENOSYS; @@ -188,11 +183,11 @@ int FuseAppBase::fallocate(const char *, int, off_t, off_t, struct fuse_file_inf return -ENOSYS; } // LCOV_EXCL_STOP -void FuseAppBase::log(int level, const char * message) const throw() +void FuseAppBase::log(int level, const char * message) const noexcept { logf(level, "%s", message); } -void FuseAppBase::logf(int level, const char * fmt, ...) const throw() +void FuseAppBase::logf(int level, const char * fmt, ...) const noexcept { va_list args; va_start(args, fmt); @@ -200,7 +195,7 @@ void FuseAppBase::logf(int level, const char * fmt, ...) const throw() va_end(args); } -int FuseAppBase::onError(const std::exception & e) throw() +int FuseAppBase::onError(const std::exception & e) noexcept { logf(LOG_ERR, "Unknown exception (what: %s)", e.what()); return -ENOSYS; @@ -222,12 +217,10 @@ void FuseAppBase::fuseDestroy(void *) struct fuse_args FuseAppBase::runint(int argc, char ** argv) { - struct fuse_opt fuse_opts[] = { - { NULL, 0, 0 } - }; + std::array<fuse_opt, 1> fuse_opts {}; fuseApp = this; struct fuse_args args = FUSE_ARGS_INIT(argc, argv); - if (fuse_opt_parse(&args, fuseApp, fuse_opts, + if (fuse_opt_parse(&args, fuseApp, fuse_opts.data(), &internalHelper<decltype(&FuseAppBase::opt_parse), &FuseAppBase::opt_parse>) == -1) { exit(1); } diff --git a/netfs/fuse/fuseAppBase.h b/netfs/fuse/fuseAppBase.h index f0866bb..2775c00 100644 --- a/netfs/fuse/fuseAppBase.h +++ b/netfs/fuse/fuseAppBase.h @@ -15,8 +15,7 @@ class DLL_PUBLIC FuseAppBase { public: - FuseAppBase(); - virtual ~FuseAppBase() = 0; + virtual ~FuseAppBase() = default; virtual void * init (struct fuse_conn_info * info); virtual int opt_parse(void *, const char * arg, int key, struct fuse_args *); virtual int access(const char *, int); diff --git a/netfs/fuse/fuseDirs.cpp b/netfs/fuse/fuseDirs.cpp index 3d77101..58dab8e 100644 --- a/netfs/fuse/fuseDirs.cpp +++ b/netfs/fuse/fuseDirs.cpp @@ -3,10 +3,10 @@ #include <entCache.h> namespace NetFS { -FuseApp::OpenDir::OpenDir(DirectoryPrxPtr r, const std::string & p) : - remote(r), - remoteV2(r->ice_getFacet() >= "v02" ? Ice::uncheckedCast<DirectoryV2Prx>(r) : nullptr), - path(p) +FuseApp::OpenDir::OpenDir(DirectoryPrxPtr r, std::string p) : + remote(std::move(r)), + remoteV2(remote->ice_getFacet() >= "v02" ? Ice::uncheckedCast<DirectoryV2Prx>(r) : nullptr), + path(std::move(p)) { } @@ -52,16 +52,16 @@ FuseApp::readdir(const char * p, void * buf, fuse_fill_dir_t filler, off_t, stru auto od = getProxy<OpenDirPtr>(fi->fh); std::string path(p); path += "/"; - auto expiry = time(NULL) + 2; + auto expiry = time(nullptr) + 2; if (fcr->ListDir && od->remoteV2) { for (const auto & e : od->remoteV2->listdir()) { - filler(buf, e.first.c_str(), NULL, 0); + filler(buf, e.first.c_str(), nullptr, 0); statCache.add(path + e.first, converter.convert(e.second), expiry); } } else { for (const auto & e : od->remote->readdir()) { - filler(buf, e.c_str(), NULL, 0); + filler(buf, e.c_str(), nullptr, 0); } } return 0; diff --git a/netfs/fuse/fuseFiles.cpp b/netfs/fuse/fuseFiles.cpp index bbb7548..4ea7f47 100644 --- a/netfs/fuse/fuseFiles.cpp +++ b/netfs/fuse/fuseFiles.cpp @@ -1,4 +1,4 @@ -#include <string.h> +#include <cstring> #include "fuseApp.impl.h" #include "fuseFiles.h" #include "lockHelpers.h" @@ -11,9 +11,9 @@ FuseApp::OpenFile::WriteState::WriteState() : { } -FuseApp::OpenFile::OpenFile(FilePrxPtr r, const std::string & p, int f) : - remote(r), - path(p), +FuseApp::OpenFile::OpenFile(FilePrxPtr r, std::string p, int f) : + remote(std::move(r)), + path(std::move(p)), flags(f) { } diff --git a/netfs/fuse/fuseMisc.cpp b/netfs/fuse/fuseMisc.cpp index 5ece9a1..3d72f5c 100644 --- a/netfs/fuse/fuseMisc.cpp +++ b/netfs/fuse/fuseMisc.cpp @@ -1,5 +1,5 @@ #include "fuseApp.h" -#include <string.h> +#include <cstring> #include <entCache.h> int @@ -113,6 +113,7 @@ NetFS::FuseApp::rename(const char * p1, const char * p2) } int +// NOLINTNEXTLINE(modernize-avoid-c-arrays) NetFS::FuseApp::utimens(const char * path, const struct timespec times[2]) { try { diff --git a/netfs/fuse/netfs.cpp b/netfs/fuse/netfs.cpp index 2039eed..731327f 100644 --- a/netfs/fuse/netfs.cpp +++ b/netfs/fuse/netfs.cpp @@ -9,7 +9,7 @@ class FuseImpl : public NetFS::FuseApp { openlog("netfs", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER); } - ~FuseImpl() + ~FuseImpl() override { closelog(); } @@ -19,6 +19,7 @@ class FuseImpl : public NetFS::FuseApp { return ::fuse_get_context(); } + // NOLINTNEXTLINE(modernize-avoid-c-arrays) int fuse_opt_parse(struct fuse_args * args, void * data, const struct fuse_opt opts[], fuse_opt_proc_t proc) override { return ::fuse_opt_parse(args, data, opts, proc); @@ -29,7 +30,7 @@ class FuseImpl : public NetFS::FuseApp { return ::fuse_main(argc, argv, ops, this); } - void vlogf(int priority, const char * fmt, va_list args) const throw() override + void vlogf(int priority, const char * fmt, va_list args) const noexcept override { vsyslog(priority, fmt, args); } diff --git a/netfs/ice/entryResolver.h b/netfs/ice/entryResolver.h index 1a20ec3..b5efbc3 100644 --- a/netfs/ice/entryResolver.h +++ b/netfs/ice/entryResolver.h @@ -7,7 +7,10 @@ template <class entry_t> class EntryResolver { public: - typedef std::string name_t; + virtual ~EntryResolver() = default; + + using name_t = std::string; + virtual void getID(const name_t &, id_t *) const = 0; virtual void getName(const id_t &, name_t *) const = 0; }; diff --git a/netfs/ice/typeConverter.cpp b/netfs/ice/typeConverter.cpp index 46e8ff1..373877c 100644 --- a/netfs/ice/typeConverter.cpp +++ b/netfs/ice/typeConverter.cpp @@ -1,4 +1,5 @@ #include "typeConverter.h" +#include <boost/numeric/conversion/cast.hpp> EntryTypeConverter::EntryTypeConverter(const EntryResolver<uid_t> & u, const EntryResolver<gid_t> & g) : userLookup(u), @@ -6,6 +7,15 @@ EntryTypeConverter::EntryTypeConverter(const EntryResolver<uid_t> & u, const Ent { } +// Wrapper function to assure no unexpected corruption occurs +// during narrowing assignments. +// (bugprone-narrowing-conversions) +template<typename T, typename S> +inline void safeAssign(T & t, const S & s) +{ + t = boost::numeric_cast<T>(s); +} + struct stat EntryTypeConverter::convert(const NetFS::Attr & a) const { @@ -74,17 +84,17 @@ NetFS::VFS TypeConverter::convert(const struct statvfs & s) const { NetFS::VFS t; - t.blockSize = s.f_bsize; - t.fragmentSize = s.f_frsize; + safeAssign(t.blockSize, s.f_bsize); + safeAssign(t.fragmentSize, s.f_frsize); t.blocks = s.f_blocks; t.freeBlocks = s.f_bfree; t.availBlocks = s.f_bavail; t.files = s.f_files; t.freeFiles = s.f_ffree; t.availFiles = s.f_favail; - t.FSID = s.f_fsid; - t.flags = s.f_flag; - t.maxNameLen = s.f_namemax; + safeAssign(t.FSID, s.f_fsid); + safeAssign(t.flags, s.f_flag); + safeAssign(t.maxNameLen, s.f_namemax); return t; } diff --git a/netfs/lib/entCache.cpp b/netfs/lib/entCache.cpp index fbdba3e..25e8902 100644 --- a/netfs/lib/entCache.cpp +++ b/netfs/lib/entCache.cpp @@ -5,16 +5,6 @@ #include <grp.h> #include <visibility.h> -template<class entry_t> -EntCache<entry_t>::EntCache() : - fillTime(0) -{ -} - -template<class entry_t> -EntCache<entry_t>::~EntCache() -{ -} template<class entry_t> void @@ -38,7 +28,7 @@ typename EntCache<entry_t>::entry_ptr EntCache<entry_t>::getEntry(const key_t & key) const { typename EntCache<entry_t>::entry_ptr ent; - if (fillTime + 60 > time(NULL)) { + if (fillTime + 60 > time(nullptr)) { ent = getEntryNoFill<key_t>(key); } if (!ent) { @@ -62,12 +52,12 @@ EntCache<entry_t>::getEntryNoFill(const key_t & key) const if (i != collection.end()) { return *i; } - return NULL; + return nullptr; } -User::User(uid_t u, const std::string & n, gid_t g) : +User::User(uid_t u, std::string n, gid_t g) : id(u), - name(n), + name(std::move(n)), group(g) { } @@ -81,18 +71,18 @@ EntCache<User>::fillCache() const Lock(lock); setpwent(); idcache.clear(); - char buf[BUFLEN]; + std::array<char, BUFLEN> buf; struct passwd pwbuf, * pwp; - while (getpwent_r(&pwbuf, buf, BUFLEN, &pwp) == 0) { + while (getpwent_r(&pwbuf, buf.data(), buf.size(), &pwp) == 0) { idcache.insert(std::make_shared<User>(pwp->pw_uid, pwp->pw_name, pwp->pw_gid)); } endpwent(); time(&fillTime); } -Group::Group(gid_t g, const std::string & n) : +Group::Group(gid_t g, std::string n) : id(g), - name(n) + name(std::move(n)) { } @@ -102,11 +92,11 @@ EntCache<Group>::fillCache() const { Lock(lock); setgrent(); - char buf[BUFLEN]; + std::array<char, BUFLEN> buf; idcache.clear(); struct group grpbuf, * grp; EntCache<User> instance; - while (getgrent_r(&grpbuf, buf, BUFLEN, &grp) == 0) { + while (getgrent_r(&grpbuf, buf.data(), buf.size(), &grp) == 0) { auto g = std::make_shared<Group>(grp->gr_gid, grp->gr_name); for (auto member = grp->gr_mem; *member; member++) { try { @@ -127,15 +117,11 @@ DLL_PUBLIC Group::hasMember(uid_t u) const return (members.find(u) != members.end()); } -template DLL_PUBLIC EntCache<User>::EntCache(); -template DLL_PUBLIC EntCache<User>::~EntCache(); template std::shared_ptr<User> DLL_PUBLIC EntCache<User>::getEntry<std::string>(const std::string &) const; template std::shared_ptr<User> DLL_PUBLIC EntCache<User>::getEntry<uid_t>(const uid_t &) const; template DLL_PUBLIC void EntCache<User>::getName(const gid_t &, std::string *) const; template DLL_PUBLIC void EntCache<User>::getID(const std::string &, gid_t *) const; -template DLL_PUBLIC EntCache<Group>::EntCache(); -template DLL_PUBLIC EntCache<Group>::~EntCache(); template std::shared_ptr<Group> DLL_PUBLIC EntCache<Group>::getEntry<std::string>(const std::string &) const; template std::shared_ptr<Group> DLL_PUBLIC EntCache<Group>::getEntry<gid_t>(const gid_t &) const; template DLL_PUBLIC void EntCache<Group>::getName(const gid_t &, std::string *) const; diff --git a/netfs/lib/entCache.h b/netfs/lib/entCache.h index 4c34a32..2833141 100644 --- a/netfs/lib/entCache.h +++ b/netfs/lib/entCache.h @@ -11,7 +11,7 @@ class User { public: - User(uid_t, const std::string &, gid_t); + User(uid_t, std::string, gid_t); uid_t id; std::string name; gid_t group; @@ -19,7 +19,7 @@ class User { class Group { public: - Group(gid_t, const std::string &); + Group(gid_t, std::string); bool hasMember(uid_t) const; @@ -31,12 +31,9 @@ class Group { template<class entry_t> class EntCache : public EntryResolver<decltype(entry_t::id)> { public: - typedef decltype(entry_t::id) id_t; - typedef decltype(entry_t::name) name_t; - typedef std::shared_ptr<entry_t> entry_ptr; - - EntCache(); - virtual ~EntCache(); + using id_t = decltype(entry_t::id); + using name_t = decltype(entry_t::name); + using entry_ptr = std::shared_ptr<entry_t>; void getID(const name_t &, id_t *) const override; void getName(const id_t &, name_t *) const override; @@ -48,20 +45,20 @@ class EntCache : public EntryResolver<decltype(entry_t::id)> { template<class key_t> entry_ptr getEntryNoFill(const key_t &) const; - typedef boost::multi_index::multi_index_container<std::shared_ptr<entry_t>, + using IDs = boost::multi_index::multi_index_container<std::shared_ptr<entry_t>, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag<id_t>, BOOST_MULTI_INDEX_MEMBER(entry_t, const id_t, id), std::less<>>, boost::multi_index::ordered_unique< boost::multi_index::tag<std::string>, BOOST_MULTI_INDEX_MEMBER(entry_t, const std::string, name), std::less<>> - > > IDs; + > >; mutable IDs idcache; mutable std::shared_mutex lock; - mutable time_t fillTime; + mutable time_t fillTime {0}; }; -typedef EntCache<User> UserEntCache; -typedef EntCache<Group> GroupEntCache; +using UserEntCache = EntCache<User>; +using GroupEntCache = EntCache<Group>; #endif diff --git a/netfs/unittests/Jamfile.jam b/netfs/unittests/Jamfile.jam index a5dfbdf..3f82c04 100644 --- a/netfs/unittests/Jamfile.jam +++ b/netfs/unittests/Jamfile.jam @@ -2,6 +2,11 @@ import testing ; lib boost_utf : : <name>boost_unit_test_framework ; +project + : requirements + <toolset>tidy:<xcheckxx>misc-non-private-member-variables-in-classes + ; + path-constant me : . ; lib testMocks : diff --git a/netfs/unittests/mockDaemon.cpp b/netfs/unittests/mockDaemon.cpp index 14b843f..50a313a 100644 --- a/netfs/unittests/mockDaemon.cpp +++ b/netfs/unittests/mockDaemon.cpp @@ -5,9 +5,9 @@ const std::filesystem::path TestExportRoot(binDir / UniqueExport::get(getpid())); -MockDaemon::MockDaemon(const std::string & ep) : +MockDaemon::MockDaemon(std::string ep) : NetFSDaemon(), - testEndpoint(ep) + testEndpoint(std::move(ep)) { } @@ -22,9 +22,9 @@ MockDaemon::ReadConfiguration(const std::filesystem::path & path) const return c; } -MockDaemonHost::MockDaemonHost(const std::string & ep, const Ice::StringSeq & ps) : - testEndpoint(ep), - params(ps), +MockDaemonHost::MockDaemonHost(std::string ep, Ice::StringSeq ps) : + testEndpoint(std::move(ep)), + params(std::move(ps)), daemon(nullptr) { std::filesystem::remove_all(TestExportRoot); diff --git a/netfs/unittests/mockDaemon.h b/netfs/unittests/mockDaemon.h index dd0a0ad..074d53f 100644 --- a/netfs/unittests/mockDaemon.h +++ b/netfs/unittests/mockDaemon.h @@ -9,7 +9,7 @@ AdHocFormatter(UniqueExport, "testExport-%?"); class DLL_PUBLIC MockDaemon : public NetFSDaemon { public: - MockDaemon(const std::string & ep); + MockDaemon(std::string ep); const std::string testEndpoint; @@ -19,7 +19,7 @@ class DLL_PUBLIC MockDaemon : public NetFSDaemon { class DLL_PUBLIC MockDaemonHost { public: - MockDaemonHost(const std::string & ep, const Ice::StringSeq & ps = {}); + MockDaemonHost(std::string ep, Ice::StringSeq ps = {}); ~MockDaemonHost(); void restart(); diff --git a/netfs/unittests/mockFuse.cpp b/netfs/unittests/mockFuse.cpp index d7b66a6..9e9ac87 100644 --- a/netfs/unittests/mockFuse.cpp +++ b/netfs/unittests/mockFuse.cpp @@ -1,9 +1,9 @@ #include "mockFuse.h" #include <boost/test/test_tools.hpp> -FuseMock::FuseMock(const std::string & ep, const Ice::StringSeq & a) : - NetFS::FuseApp(a), - testEndpoint(ep) +FuseMock::FuseMock(std::string ep, Ice::StringSeq a) : + NetFS::FuseApp(std::move(a)), + testEndpoint(std::move(ep)) { ::memset(&context, 0, sizeof(fuse_context)); context.pid = getpid(); @@ -18,6 +18,7 @@ FuseMock::fuse_get_context() } int +// NOLINTNEXTLINE(modernize-avoid-c-arrays) FuseMock::fuse_opt_parse(struct fuse_args * args, void * data, const struct fuse_opt [], fuse_opt_proc_t proc) { for (int n = 0; n < args->argc; n += 1) { @@ -29,7 +30,7 @@ FuseMock::fuse_opt_parse(struct fuse_args * args, void * data, const struct fuse int FuseMock::main(int, char **, const struct fuse_operations * o) { - o->init(NULL); + o->init(nullptr); ops = *o; return 0; } @@ -47,24 +48,19 @@ FuseMock::ReadConfiguration(const std::filesystem::path & path) const } void -FuseMock::vlogf(int, const char * fmt, va_list args) const throw() +FuseMock::vlogf(int, const char * fmt, va_list args) const noexcept { BOOST_TEST_MESSAGE(vstringf(fmt, args)); } -FuseMockHost::FuseMockHost(const std::string & ep, const Ice::StringSeq & a) : - app(new FuseMock(ep, a)), +FuseMockHost::FuseMockHost(std::string ep, const Ice::StringSeq & a) : + app(std::make_unique<FuseMock>(std::move(ep), a)), fuse(&app->ops) { std::vector<char *> argv; for (auto & arg : a) { argv.push_back(const_cast<char *>(arg.c_str())); } - FuseAppBase::run(a.size(), &argv.front(), app); -} - -FuseMockHost::~FuseMockHost() -{ - delete app; + FuseAppBase::run(a.size(), &argv.front(), app.get()); } diff --git a/netfs/unittests/mockFuse.h b/netfs/unittests/mockFuse.h index 9b3d2e0..7e4f3ad 100644 --- a/netfs/unittests/mockFuse.h +++ b/netfs/unittests/mockFuse.h @@ -6,7 +6,7 @@ class DLL_PUBLIC FuseMock : public NetFS::FuseApp { public: - FuseMock(const std::string &, const Ice::StringSeq &); + FuseMock(std::string, Ice::StringSeq); struct fuse_context * fuse_get_context() override; int fuse_opt_parse(struct fuse_args * args, void * data, const struct fuse_opt [], fuse_opt_proc_t proc) override; @@ -25,11 +25,10 @@ class DLL_PUBLIC FuseMock : public NetFS::FuseApp { class DLL_PUBLIC FuseMockHost { public: - FuseMockHost(const std::string &, const Ice::StringSeq &); - ~FuseMockHost(); + FuseMockHost(std::string, const Ice::StringSeq &); private: - FuseMock * app; + std::unique_ptr<FuseMock> app; public: const fuse_operations * fuse; diff --git a/netfs/unittests/testCore.cpp b/netfs/unittests/testCore.cpp index 06ab752..07b5ce6 100644 --- a/netfs/unittests/testCore.cpp +++ b/netfs/unittests/testCore.cpp @@ -8,6 +8,7 @@ #include <ostream> #include <algorithm> #include <fuseFiles.h> +#include <climits> const auto testExport = UniqueExport::get(getpid()); const std::string testEndpoint("tcp -h localhost -p 12012"); @@ -22,8 +23,21 @@ operator==(const struct stat & a, const struct stat & b) } namespace std { + template<size_t l> + bool operator==(const std::array<char, l> & a, const char * b) + { + return strncmp(a.data(), b, l) == 0; + } + AdHocFormatter(StatDebug, "dev: %? inode: %?"); // LCOV_EXCL_START + template<typename T, size_t l> + ostream & operator<<(ostream & s, const std::array<T, l> & a) + { + std::copy(a.begin(), a.end(), std::ostream_iterator<T>(s)); + return s; + } + ostream & operator<<(ostream & s, const struct stat & ss) { return StatDebug::write(s, ss.st_dev, ss.st_ino); @@ -108,12 +122,8 @@ BOOST_AUTO_TEST_CASE ( clientInitialised ) BOOST_AUTO_TEST_CASE( testNavigation ) { - struct stat attr, rootattr, insideattr; - memset(&attr, 0, sizeof(attr)); - memset(&rootattr, 0, sizeof(rootattr)); - memset(&insideattr, 0, sizeof(insideattr)); - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); + struct stat attr {}, rootattr {}, insideattr {}; + struct fuse_file_info fi {}; int fd = fuse->create("/inside", 0666, &fi); BOOST_REQUIRE(fd >= 0); fuse->release("/inside", &fi); @@ -148,8 +158,7 @@ BOOST_AUTO_TEST_CASE( testSandboxing ) std::filesystem::remove(binDir / "outside"); std::filesystem::remove(binDir / "sub" / "outside"); std::filesystem::remove(binDir / "sub"); - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); + struct fuse_file_info fi {}; BOOST_REQUIRE_EQUAL(fuse->create("../outside", 0666, &fi), -EPERM); BOOST_REQUIRE(!std::filesystem::exists(binDir / "outside")); BOOST_REQUIRE_EQUAL(fuse->create("/../outside", 0666, &fi), -EPERM); @@ -173,8 +182,7 @@ BOOST_AUTO_TEST_CASE( testSandboxing ) void enableWriteOnDir(const fuse_operations * fuse, const char * dir) { - struct stat st; - memset(&st, 0, sizeof(st)); + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->chmod(dir, 0700), 0); BOOST_REQUIRE_EQUAL(fuse->getattr(dir, &st), 0); BOOST_REQUIRE_EQUAL(st.st_mode, 0700 | S_IFDIR); @@ -183,8 +191,7 @@ enableWriteOnDir(const fuse_operations * fuse, const char * dir) void disableWriteOnDir(const fuse_operations * fuse, const char * dir) { - struct stat st; - memset(&st, 0, sizeof(st)); + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->chmod(dir, 0500), 0); BOOST_REQUIRE_EQUAL(fuse->getattr(dir, &st), 0); BOOST_REQUIRE_EQUAL(st.st_mode, 0500 | S_IFDIR); @@ -192,10 +199,8 @@ disableWriteOnDir(const fuse_operations * fuse, const char * dir) BOOST_AUTO_TEST_CASE( directories ) { - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); - struct stat st; - memset(&st, 0, sizeof(st)); + struct fuse_file_info fi {}; + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->mkdir("/test", 0700), 0); BOOST_REQUIRE(std::filesystem::is_directory(binDir / testExport / "test")); BOOST_REQUIRE_EQUAL(fuse->mkdir("/test", 0700), -EEXIST); @@ -238,11 +243,8 @@ BOOST_AUTO_TEST_CASE( directories ) BOOST_AUTO_TEST_CASE( files ) { - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); - struct stat st, st2; - memset(&st, 0, sizeof(st)); - memset(&st2, 0, sizeof(st2)); + struct fuse_file_info fi {}; + struct stat st {}, st2 {}; fi.flags = O_RDWR; BOOST_REQUIRE_EQUAL(fuse->open("/test", &fi), -ENOENT); BOOST_REQUIRE_EQUAL(fuse->create("/test", 0600, &fi), 0); @@ -266,21 +268,20 @@ BOOST_AUTO_TEST_CASE( files ) BOOST_REQUIRE_EQUAL(fuse->write("/test2", "BUFFER some", 11, 10, &fi), 11); BOOST_REQUIRE_EQUAL(fuse->fgetattr("/test2", &st2, &fi), 0); BOOST_REQUIRE_EQUAL(st2.st_size, 21); - char buf[11]; - memset(&buf, 0, sizeof(buf)); - BOOST_REQUIRE_EQUAL(fuse->read("/test2", buf, 10, 5, &fi), 10); + std::array<char, 11> buf {}; + BOOST_REQUIRE_EQUAL(fuse->read("/test2", buf.data(), 10, 5, &fi), 10); BOOST_REQUIRE_EQUAL(buf, "test BUFFE"); BOOST_REQUIRE_EQUAL(fuse->ftruncate("/test2", 11, &fi), 0); BOOST_REQUIRE_EQUAL(fuse->fgetattr("/test2", &st2, &fi), 0); BOOST_REQUIRE_EQUAL(st2.st_size, 11); - memset(&buf, 0, sizeof(buf)); - BOOST_REQUIRE_EQUAL(fuse->read("/test2", buf, 10, 5, &fi), 6); + buf = {}; + BOOST_REQUIRE_EQUAL(fuse->read("/test2", buf.data(), 10, 5, &fi), 6); BOOST_REQUIRE_EQUAL(buf, "test B"); BOOST_REQUIRE_EQUAL(fuse->truncate("/test2", 7), 0); BOOST_REQUIRE_EQUAL(fuse->fgetattr("/test2", &st2, &fi), 0); BOOST_REQUIRE_EQUAL(st2.st_size, 7); - memset(&buf, 0, sizeof(buf)); - BOOST_REQUIRE_EQUAL(fuse->read("/test2", buf, 10, 5, &fi), 2); + buf = {}; + BOOST_REQUIRE_EQUAL(fuse->read("/test2", buf.data(), 10, 5, &fi), 2); BOOST_REQUIRE_EQUAL(buf, "te"); BOOST_REQUIRE_EQUAL(fuse->release("/test2", &fi), 0); @@ -297,12 +298,10 @@ BOOST_AUTO_TEST_CASE( files ) BOOST_AUTO_TEST_CASE( bgwriteOverlapped, * boost::unit_test::timeout(2) ) { - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); - struct stat st; - memset(&st, 0, sizeof(st)); + struct fuse_file_info fi {}; + struct stat st {}; fi.flags = O_RDWR; - auto s = sizeof(int32_t); + constexpr auto s = sizeof(int32_t); auto N = 20; BOOST_REQUIRE_EQUAL(fuse->create("/test", 0600, &fi), 0); for (int32_t n = 0; n < N; n += 1) { @@ -310,9 +309,9 @@ BOOST_AUTO_TEST_CASE( bgwriteOverlapped, * boost::unit_test::timeout(2) ) } BOOST_REQUIRE_EQUAL(fuse->fgetattr("/test", &st, &fi), 0); BOOST_REQUIRE_EQUAL(st.st_size, N + s - 1); - char buf[s]; - BOOST_REQUIRE_EQUAL(fuse->read("/test", buf, s, (N - 1), &fi), s); - BOOST_REQUIRE_EQUAL(*(int*)buf, N - 1); + std::array<char, s> buf; + BOOST_REQUIRE_EQUAL(fuse->read("/test", buf.data(), s, (N - 1), &fi), s); + BOOST_REQUIRE_EQUAL(*(int*)buf.data(), N - 1); BOOST_REQUIRE_EQUAL(fuse->release("/test", &fi), 0); BOOST_REQUIRE_EQUAL(fuse->getattr("/test", &st), 0); BOOST_REQUIRE_EQUAL(st.st_size, N + s - 1); @@ -320,12 +319,10 @@ BOOST_AUTO_TEST_CASE( bgwriteOverlapped, * boost::unit_test::timeout(2) ) BOOST_AUTO_TEST_CASE( bgwriteDistinct, * boost::unit_test::timeout(2) ) { - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); - struct stat st; - memset(&st, 0, sizeof(st)); + struct fuse_file_info fi {}; + struct stat st {}; fi.flags = O_RDWR; - auto s = sizeof(int32_t); + constexpr auto s = sizeof(int32_t); auto N = 20; BOOST_REQUIRE_EQUAL(fuse->create("/test", 0600, &fi), 0); for (int32_t n = 0; n < N; n += 1) { @@ -333,9 +330,9 @@ BOOST_AUTO_TEST_CASE( bgwriteDistinct, * boost::unit_test::timeout(2) ) } BOOST_REQUIRE_EQUAL(fuse->fgetattr("/test", &st, &fi), 0); BOOST_REQUIRE_EQUAL(st.st_size, N * s); - char buf[s]; - BOOST_REQUIRE_EQUAL(fuse->read("/test", buf, s, (N - 1) * s, &fi), s); - BOOST_REQUIRE_EQUAL(*(int*)buf, N - 1); + std::array<char, s> buf; + BOOST_REQUIRE_EQUAL(fuse->read("/test", buf.data(), s, (N - 1) * s, &fi), s); + BOOST_REQUIRE_EQUAL(*(int*)buf.data(), N - 1); BOOST_REQUIRE_EQUAL(fuse->release("/test", &fi), 0); BOOST_REQUIRE_EQUAL(fuse->getattr("/test", &st), 0); BOOST_REQUIRE_EQUAL(st.st_size, N * s); @@ -343,12 +340,12 @@ BOOST_AUTO_TEST_CASE( bgwriteDistinct, * boost::unit_test::timeout(2) ) BOOST_AUTO_TEST_CASE( symlinks ) { - char buf[BUFSIZ]; + std::array<char, PATH_MAX> buf; BOOST_REQUIRE_EQUAL(fuse->mkdir("/dir", 0700), 0); - BOOST_REQUIRE_EQUAL(fuse->readlink("/dir", buf, BUFSIZ), -EINVAL); + BOOST_REQUIRE_EQUAL(fuse->readlink("/dir", buf.data(), buf.size()), -EINVAL); BOOST_REQUIRE_EQUAL(fuse->symlink("/test2", "/test3"), 0); BOOST_REQUIRE_EQUAL(fuse->symlink("/test2", "/test3"), -EEXIST); - BOOST_REQUIRE_EQUAL(fuse->readlink("/test3", buf, BUFSIZ), 0); + BOOST_REQUIRE_EQUAL(fuse->readlink("/test3", buf.data(), buf.size()), 0); BOOST_REQUIRE_EQUAL("/test2", buf); BOOST_REQUIRE_EQUAL(fuse->unlink("/test3"), 0); BOOST_REQUIRE_EQUAL(fuse->unlink("/test3"), -ENOENT); @@ -359,8 +356,7 @@ BOOST_AUTO_TEST_CASE( symlinks ) BOOST_AUTO_TEST_CASE( access ) { - struct stat st; - memset(&st, 0, sizeof(st)); + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->access("/", F_OK), 0); BOOST_REQUIRE_EQUAL(fuse->access("/missing", F_OK), -ENOENT); // Basic assertions @@ -386,8 +382,7 @@ BOOST_AUTO_TEST_CASE( access ) BOOST_AUTO_TEST_CASE( permissionsDirs ) { - struct stat st; - memset(&st, 0, sizeof(st)); + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->mkdir("/dir", 0700), 0); BOOST_REQUIRE_EQUAL(fuse->mkdir("/dir/yes", 0000), 0); BOOST_REQUIRE_EQUAL(fuse->getattr("/dir/yes", &st), 0); @@ -403,10 +398,8 @@ BOOST_AUTO_TEST_CASE( permissionsDirs ) BOOST_AUTO_TEST_CASE( permissionsFiles ) { - struct stat st; - memset(&st, 0, sizeof(st)); - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); + struct stat st {}; + struct fuse_file_info fi {}; fi.flags = O_RDWR; BOOST_REQUIRE_EQUAL(fuse->mkdir("/dir", 0700), 0); BOOST_REQUIRE_NE(fuse->create("/dir/yes", 0000, &fi), -1); @@ -426,8 +419,7 @@ BOOST_AUTO_TEST_CASE( mknod ) { BOOST_REQUIRE_EQUAL(fuse->mknod("/nod", 0600 | S_IFIFO, 0), 0); BOOST_REQUIRE_EQUAL(fuse->mknod("/nod", 0600 | S_IFIFO, 0), -EEXIST); - struct stat st; - memset(&st, 0, sizeof(st)); + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->getattr("/nod", &st), 0); BOOST_REQUIRE_EQUAL(st.st_mode, 0600 | S_IFIFO); BOOST_REQUIRE_EQUAL(fuse->unlink("/nod"), 0); @@ -439,8 +431,7 @@ BOOST_AUTO_TEST_CASE( mknod ) BOOST_AUTO_TEST_CASE( renameToDir ) { - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); + struct fuse_file_info fi {}; BOOST_REQUIRE_EQUAL(fuse->create("/file", 0600, &fi), 0); BOOST_REQUIRE_EQUAL(fuse->release("/file", &fi), 0); BOOST_REQUIRE_EQUAL(fuse->mkdir("/dir", 0700), 0); @@ -461,8 +452,7 @@ BOOST_AUTO_TEST_CASE( chown ) { BOOST_REQUIRE_EQUAL(fuse->mkdir("/dir", 0777), 0); BOOST_REQUIRE_EQUAL(fuse->chown("/dir", getuid(), getgid()), 0); - struct stat st; - memset(&st, 0, sizeof(st)); + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->getattr("/dir", &st), 0); BOOST_REQUIRE_EQUAL(st.st_uid, getuid()); BOOST_REQUIRE_EQUAL(st.st_gid, getgid()); @@ -473,16 +463,11 @@ BOOST_AUTO_TEST_CASE( chown ) BOOST_AUTO_TEST_CASE( utimens ) { BOOST_REQUIRE_EQUAL(fuse->mknod("/file", 0600, 0), 0); - struct timespec times[2]; - times[0].tv_sec = 1; - times[0].tv_nsec = 100; - times[1].tv_sec = 2; - times[1].tv_nsec = 200; - BOOST_REQUIRE_EQUAL(fuse->utimens("/file", times), 0); + std::array<timespec, 2> times { { {1, 100}, { 2, 200 } } }; + BOOST_REQUIRE_EQUAL(fuse->utimens("/file", times.data()), 0); times[1].tv_nsec = -200; - BOOST_REQUIRE_EQUAL(fuse->utimens("/file", times), -EINVAL); - struct stat st; - memset(&st, 0, sizeof(st)); + BOOST_REQUIRE_EQUAL(fuse->utimens("/file", times.data()), -EINVAL); + struct stat st {}; BOOST_REQUIRE_EQUAL(fuse->getattr("/file", &st), 0); BOOST_REQUIRE_EQUAL(st.st_atime, 1); BOOST_REQUIRE_EQUAL(st.st_atim.tv_sec, 1); @@ -508,8 +493,7 @@ BOOST_FIXTURE_TEST_SUITE( NetfsAltCore, AltCore ); BOOST_AUTO_TEST_CASE( noListDir ) { - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); + struct fuse_file_info fi {}; BOOST_REQUIRE_EQUAL(fuse->mkdir("/test", 0700), 0); BOOST_REQUIRE(std::filesystem::is_directory(binDir / testExport / "test")); BOOST_REQUIRE_EQUAL(fuse->mkdir("/test", 0700), -EEXIST); @@ -548,18 +532,15 @@ BOOST_AUTO_TEST_CASE( noListDir ) BOOST_AUTO_TEST_CASE( testFGWrites ) { - struct fuse_file_info fi; - memset(&fi, 0, sizeof(fi)); - struct stat st; - memset(&st, 0, sizeof(st)); + struct fuse_file_info fi {}; + struct stat st {}; fi.flags = O_RDWR; BOOST_REQUIRE_EQUAL(fuse->create("/test", 0600, &fi), 0); BOOST_REQUIRE_EQUAL(fuse->write("/test", "some test buffer", 16, 0, &fi), 16); BOOST_REQUIRE_EQUAL(fuse->getattr("/test", &st), 0); BOOST_REQUIRE_EQUAL(st.st_size, 16); - char buf[11]; - memset(&buf, 0, sizeof(buf)); - BOOST_REQUIRE_EQUAL(fuse->read("/test", buf, 10, 5, &fi), 10); + std::array<char, 11> buf {}; + BOOST_REQUIRE_EQUAL(fuse->read("/test", buf.data(), 10, 5, &fi), 10); BOOST_REQUIRE_EQUAL(buf, "test buffe"); BOOST_REQUIRE_EQUAL(fuse->release("/test", &fi), 0); } diff --git a/netfs/unittests/testEdgeCases.cpp b/netfs/unittests/testEdgeCases.cpp index 0cfb888..1c6c3e6 100644 --- a/netfs/unittests/testEdgeCases.cpp +++ b/netfs/unittests/testEdgeCases.cpp @@ -35,11 +35,11 @@ BOOST_AUTO_TEST_CASE ( createAndDaemonRestart ) BOOST_REQUIRE_EQUAL(st.st_gid, getgid()); BOOST_TEST_CHECKPOINT("Write some data"); - char someData[890]; + std::array<char, 890> someData; for (auto & d : someData) { d = rand(); } - BOOST_REQUIRE_EQUAL(sizeof(someData), fuse.fuse->write(fileName, someData, sizeof(someData), 0, &fh)); + BOOST_REQUIRE_EQUAL(sizeof(someData), fuse.fuse->write(fileName, someData.data(), someData.size(), 0, &fh)); BOOST_REQUIRE_EQUAL(0, fuse.fuse->fgetattr(fileName, &st, &fh)); BOOST_REQUIRE_EQUAL(st.st_size, sizeof(someData)); |