- Add Clang 8 and GCC 9 to CI

- Switch clang-tidy to Clang 9
- Fix compiler and clang-tidy warnings produced by the previous points
This commit is contained in:
Sebastian Messmer 2019-06-08 13:06:17 -07:00
parent 12ce925213
commit efac089c76
41 changed files with 191 additions and 125 deletions

View File

@ -45,6 +45,8 @@ references:
deb-src http://apt.llvm.org/trusty/ llvm-toolchain-trusty-6.0 main deb-src http://apt.llvm.org/trusty/ llvm-toolchain-trusty-6.0 main
deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-7 main deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-7 main
deb-src http://apt.llvm.org/trusty/ llvm-toolchain-trusty-7 main deb-src http://apt.llvm.org/trusty/ llvm-toolchain-trusty-7 main
deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-8 main
deb-src http://apt.llvm.org/trusty/ llvm-toolchain-trusty-8 main
EOF EOF
sudo chmod o-w /etc/apt/sources.list.d/clang.list sudo chmod o-w /etc/apt/sources.list.d/clang.list
@ -57,8 +59,8 @@ references:
# They aren't set automatically unfortunately # They aren't set automatically unfortunately
sudo ln -s /usr/bin/$CC /usr/bin/clang sudo ln -s /usr/bin/$CC /usr/bin/clang
sudo ln -s /usr/bin/$CXX /usr/bin/clang++ sudo ln -s /usr/bin/$CXX /usr/bin/clang++
sudo ln -s /usr/bin/clang-tidy-7 /usr/bin/clang-tidy sudo ln -s /usr/bin/clang-tidy-8 /usr/bin/clang-tidy
sudo ln -s /usr/bin/run-clang-tidy-7.py /usr/bin/run-clang-tidy.py sudo ln -s /usr/bin/run-clang-tidy-8.py /usr/bin/run-clang-tidy.py
# Need a c++14 compliant STL for clang # Need a c++14 compliant STL for clang
sudo apt-get install -y g++-5 sudo apt-get install -y g++-5
@ -299,6 +301,30 @@ jobs:
GTEST_ARGS: "" GTEST_ARGS: ""
CMAKE_FLAGS: "" CMAKE_FLAGS: ""
RUN_TESTS: true RUN_TESTS: true
gcc_9_debug:
<<: *job_definition
environment:
CC: gcc-9
CXX: g++-9
BUILD_TOOLSET: gcc
APT_COMPILER_PACKAGE: "g++-9"
CXXFLAGS: ""
BUILD_TYPE: "Debug"
GTEST_ARGS: ""
CMAKE_FLAGS: ""
RUN_TESTS: true
gcc_9_release:
<<: *job_definition
environment:
CC: gcc-9
CXX: g++-9
BUILD_TOOLSET: gcc
APT_COMPILER_PACKAGE: "g++-9"
CXXFLAGS: ""
BUILD_TYPE: "Release"
GTEST_ARGS: ""
CMAKE_FLAGS: ""
RUN_TESTS: true
clang_4_debug: clang_4_debug:
<<: *job_definition <<: *job_definition
environment: environment:
@ -395,13 +421,37 @@ jobs:
GTEST_ARGS: "" GTEST_ARGS: ""
CMAKE_FLAGS: "" CMAKE_FLAGS: ""
RUN_TESTS: true RUN_TESTS: true
clang_8_debug:
<<: *job_definition
environment:
CC: clang-8
CXX: clang++-8
BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: clang-8
CXXFLAGS: ""
BUILD_TYPE: "Debug"
GTEST_ARGS: ""
CMAKE_FLAGS: ""
RUN_TESTS: true
clang_8_release:
<<: *job_definition
environment:
CC: clang-8
CXX: clang++-8
BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: clang-8
CXXFLAGS: ""
BUILD_TYPE: "Release"
GTEST_ARGS: ""
CMAKE_FLAGS: ""
RUN_TESTS: true
clang_werror: clang_werror:
<<: *job_definition <<: *job_definition
environment: environment:
CC: clang-7 CC: clang-8
CXX: clang++-7 CXX: clang++-8
BUILD_TOOLSET: clang BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: clang-7 APT_COMPILER_PACKAGE: clang-8
CXXFLAGS: "" CXXFLAGS: ""
BUILD_TYPE: "Release" BUILD_TYPE: "Release"
GTEST_ARGS: "" GTEST_ARGS: ""
@ -410,10 +460,10 @@ jobs:
gcc_werror: gcc_werror:
<<: *job_definition <<: *job_definition
environment: environment:
CC: gcc-8 CC: gcc-9
CXX: g++-8 CXX: g++-9
BUILD_TOOLSET: gcc BUILD_TOOLSET: gcc
APT_COMPILER_PACKAGE: "g++-8" APT_COMPILER_PACKAGE: "g++-9"
CXXFLAGS: "" CXXFLAGS: ""
BUILD_TYPE: "Release" BUILD_TYPE: "Release"
GTEST_ARGS: "" GTEST_ARGS: ""
@ -422,10 +472,10 @@ jobs:
no_compatibility: no_compatibility:
<<: *job_definition <<: *job_definition
environment: environment:
CC: clang-7 CC: clang-8
CXX: clang++-7 CXX: clang++-8
BUILD_TOOLSET: clang BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: clang-7 APT_COMPILER_PACKAGE: clang-8
CXXFLAGS: "-DCRYFS_NO_COMPATIBILITY" CXXFLAGS: "-DCRYFS_NO_COMPATIBILITY"
BUILD_TYPE: "Debug" BUILD_TYPE: "Debug"
GTEST_ARGS: "" GTEST_ARGS: ""
@ -434,10 +484,10 @@ jobs:
address_sanitizer: address_sanitizer:
<<: *job_definition <<: *job_definition
environment: environment:
CC: clang-7 CC: clang-8
CXX: clang++-7 CXX: clang++-8
BUILD_TOOLSET: clang BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: clang-7 APT_COMPILER_PACKAGE: clang-8
CXXFLAGS: "-O2 -fsanitize=address -fno-omit-frame-pointer -fno-common -fsanitize-address-use-after-scope" CXXFLAGS: "-O2 -fsanitize=address -fno-omit-frame-pointer -fno-common -fsanitize-address-use-after-scope"
BUILD_TYPE: "Debug" BUILD_TYPE: "Debug"
ASAN_OPTIONS: "detect_leaks=1 check_initialization_order=1 detect_stack_use_after_return=1 detect_invalid_pointer_pairs=1 atexit=1" ASAN_OPTIONS: "detect_leaks=1 check_initialization_order=1 detect_stack_use_after_return=1 detect_invalid_pointer_pairs=1 atexit=1"
@ -448,10 +498,10 @@ jobs:
ub_sanitizer: ub_sanitizer:
<<: *job_definition <<: *job_definition
environment: environment:
CC: clang-7 CC: clang-8
CXX: clang++-7 CXX: clang++-8
BUILD_TOOLSET: clang BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: clang-7 APT_COMPILER_PACKAGE: clang-8
CXXFLAGS: "-O2 -fno-sanitize-recover=undefined,nullability,implicit-conversion,unsigned-integer-overflow -fno-omit-frame-pointer -fno-common" CXXFLAGS: "-O2 -fno-sanitize-recover=undefined,nullability,implicit-conversion,unsigned-integer-overflow -fno-omit-frame-pointer -fno-common"
BUILD_TYPE: "Debug" BUILD_TYPE: "Debug"
GTEST_ARGS: "" GTEST_ARGS: ""
@ -460,10 +510,10 @@ jobs:
thread_sanitizer: thread_sanitizer:
<<: *job_definition <<: *job_definition
environment: environment:
CC: clang-7 CC: clang-8
CXX: clang++-7 CXX: clang++-8
BUILD_TOOLSET: clang BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: clang-7 APT_COMPILER_PACKAGE: clang-8
OMP_NUM_THREADS: "1" OMP_NUM_THREADS: "1"
CXXFLAGS: "-O2 -fsanitize=thread -fno-omit-frame-pointer" CXXFLAGS: "-O2 -fsanitize=thread -fno-omit-frame-pointer"
BUILD_TYPE: "Debug" BUILD_TYPE: "Debug"
@ -496,10 +546,10 @@ jobs:
- store_artifacts: - store_artifacts:
path: /tmp/clang-tidy-fixes path: /tmp/clang-tidy-fixes
environment: environment:
CC: clang-7 CC: clang-8
CXX: clang++-7 CXX: clang++-8
BUILD_TOOLSET: clang BUILD_TOOLSET: clang
APT_COMPILER_PACKAGE: "clang-7 clang-tidy-7" APT_COMPILER_PACKAGE: "clang-8 clang-tidy-8"
workflows: workflows:
version: 2 version: 2
@ -522,6 +572,10 @@ workflows:
<<: *enable_for_tags <<: *enable_for_tags
- gcc_8_release: - gcc_8_release:
<<: *enable_for_tags <<: *enable_for_tags
- gcc_9_debug:
<<: *enable_for_tags
- gcc_9_release:
<<: *enable_for_tags
- clang_4_debug: - clang_4_debug:
<<: *enable_for_tags <<: *enable_for_tags
- clang_4_release: - clang_4_release:
@ -538,6 +592,10 @@ workflows:
<<: *enable_for_tags <<: *enable_for_tags
- clang_7_release: - clang_7_release:
<<: *enable_for_tags <<: *enable_for_tags
- clang_8_debug:
<<: *enable_for_tags
- clang_8_release:
<<: *enable_for_tags
- clang_werror: - clang_werror:
<<: *enable_for_tags <<: *enable_for_tags
- gcc_werror: - gcc_werror:

View File

@ -25,8 +25,13 @@ Checks: |
-cppcoreguidelines-pro-bounds-array-to-pointer-decay, -cppcoreguidelines-pro-bounds-array-to-pointer-decay,
-cppcoreguidelines-pro-type-vararg, -cppcoreguidelines-pro-type-vararg,
-cppcoreguidelines-avoid-goto, -cppcoreguidelines-avoid-goto,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-macro-usage,
-cppcoreguidelines-non-private-member-variables-in-classes,
-clang-analyzer-optin.cplusplus.VirtualCall, -clang-analyzer-optin.cplusplus.VirtualCall,
-clang-analyzer-cplusplus.NewDeleteLeaks,
-misc-macro-parentheses, -misc-macro-parentheses,
-misc-non-private-member-variables-in-classes,
-misc-unused-raii -misc-unused-raii
WarningsAsErrors: '*' WarningsAsErrors: '*'
HeaderFilterRegex: '/src/|/test/' HeaderFilterRegex: '/src/|/test/'

View File

@ -215,7 +215,7 @@ namespace blobstore {
if (endIndex > beginIndex) { if (endIndex > beginIndex) {
onBacktrackFromSubtree(newNode.get()); onBacktrackFromSubtree(newNode.get());
} }
return std::move(newNode); return newNode;
} }
uint32_t LeafTraverser::_maxLeavesForTreeDepth(uint8_t depth) const { uint32_t LeafTraverser::_maxLeavesForTreeDepth(uint8_t depth) const {

View File

@ -48,7 +48,7 @@ public:
_removeFromQueue(found->second); _removeFromQueue(found->second);
auto value = found->second.release(); auto value = found->second.release();
_entries.erase(found); _entries.erase(found);
return std::move(value); return value;
} }
boost::optional<Value> pop() { boost::optional<Value> pop() {
@ -83,7 +83,7 @@ private:
} }
void init(const Key *key_, Value value_) { void init(const Key *key_, Value value_) {
key = key_; key = key_;
new(__value) Value(std::move(value_)); new(__value.data()) Value(std::move(value_));
} }
Value release() { Value release() {
Value value = std::move(*_value()); Value value = std::move(*_value());
@ -98,9 +98,9 @@ private:
const Key *key; const Key *key;
private: private:
Value *_value() { Value *_value() {
return reinterpret_cast<Value*>(__value); return reinterpret_cast<Value*>(__value.data());
} }
alignas(Value) char __value[sizeof(Value)]; alignas(Value) std::array<char, sizeof(Value)> __value;
DISALLOW_COPY_AND_ASSIGN(Entry); DISALLOW_COPY_AND_ASSIGN(Entry);
}; };

View File

@ -29,6 +29,6 @@ namespace cpputils {
}; };
Data result(size); Data result(size);
std::memcpy(result.data(), data.dataOffset(sizeof(size)), size); std::memcpy(result.data(), data.dataOffset(sizeof(size)), size);
return std::move(result); return result;
} }
} }

View File

@ -71,7 +71,7 @@ boost::optional<Data> CFB_Cipher<BlockCipher, KeySize>::decrypt(const CryptoPP::
// TODO Shouldn't we pass in ciphertextSize instead of plaintext.size() here as last argument (and also in the if above)? // TODO Shouldn't we pass in ciphertextSize instead of plaintext.size() here as last argument (and also in the if above)?
decryption.ProcessData(static_cast<CryptoPP::byte*>(plaintext.data()), ciphertextData, plaintext.size()); decryption.ProcessData(static_cast<CryptoPP::byte*>(plaintext.data()), ciphertextData, plaintext.size());
} }
return std::move(plaintext); return plaintext;
} }
} }

View File

@ -81,7 +81,7 @@ boost::optional<Data> GCM_Cipher<BlockCipher, KeySize>::decrypt(const CryptoPP::
CryptoPP::AuthenticatedDecryptionFilter::DEFAULT_FLAGS, TAG_SIZE CryptoPP::AuthenticatedDecryptionFilter::DEFAULT_FLAGS, TAG_SIZE
) )
); );
return std::move(plaintext); return plaintext;
} catch (const CryptoPP::HashVerificationFilter::HashVerificationFailed &e) { } catch (const CryptoPP::HashVerificationFilter::HashVerificationFailed &e) {
return boost::none; return boost::none;
} }

View File

@ -92,7 +92,7 @@ namespace cpputils {
Data result(plaintextSize(ciphertextSize)); Data result(plaintextSize(ciphertextSize));
_xor(static_cast<CryptoPP::byte *>(result.data()), ciphertext + sizeof(uint64_t), plaintextSize(ciphertextSize), encKey.value ^ iv); _xor(static_cast<CryptoPP::byte *>(result.data()), ciphertext + sizeof(uint64_t), plaintextSize(ciphertextSize), encKey.value ^ iv);
return std::move(result); return result;
} }
static constexpr const char *NAME = "FakeAuthenticatedCipher"; static constexpr const char *NAME = "FakeAuthenticatedCipher";
@ -101,7 +101,7 @@ namespace cpputils {
static uint64_t _checksum(const CryptoPP::byte *data, FakeKey encKey, std::size_t size) { static uint64_t _checksum(const CryptoPP::byte *data, FakeKey encKey, std::size_t size) {
uint64_t checksum = 34343435 * encKey.value; // some init value uint64_t checksum = 34343435 * encKey.value; // some init value
for (unsigned int i = 0; i < size; ++i) { for (size_t i = 0; i < size; ++i) {
checksum ^= (static_cast<uint64_t>(data[i]) << (56 - 8 * (i%8))); checksum ^= (static_cast<uint64_t>(data[i]) << (56 - 8 * (i%8)));
} }

View File

@ -37,7 +37,7 @@ private:
FixedSizeData(): _data() {} FixedSizeData(): _data() {}
template<size_t _SIZE> friend class FixedSizeData; template<size_t _SIZE> friend class FixedSizeData;
unsigned char _data[BINARY_LENGTH]; std::array<unsigned char, BINARY_LENGTH> _data;
}; };
template<size_t SIZE> bool operator==(const FixedSizeData<SIZE> &lhs, const FixedSizeData<SIZE> &rhs); template<size_t SIZE> bool operator==(const FixedSizeData<SIZE> &lhs, const FixedSizeData<SIZE> &rhs);
@ -51,7 +51,7 @@ template<size_t SIZE> constexpr size_t FixedSizeData<SIZE>::STRING_LENGTH;
template<size_t SIZE> template<size_t SIZE>
FixedSizeData<SIZE> FixedSizeData<SIZE>::Null() { FixedSizeData<SIZE> FixedSizeData<SIZE>::Null() {
FixedSizeData<SIZE> result; FixedSizeData<SIZE> result;
std::memset(result._data, 0, BINARY_LENGTH); std::memset(result._data.data(), 0, BINARY_LENGTH);
return result; return result;
} }
@ -62,7 +62,7 @@ FixedSizeData<SIZE> FixedSizeData<SIZE>::FromString(const std::string &data) {
{ {
CryptoPP::StringSource _1(data, true, CryptoPP::StringSource _1(data, true,
new CryptoPP::HexDecoder( new CryptoPP::HexDecoder(
new CryptoPP::ArraySink(result._data, BINARY_LENGTH) new CryptoPP::ArraySink(result._data.data(), BINARY_LENGTH)
) )
); );
} }
@ -72,7 +72,7 @@ FixedSizeData<SIZE> FixedSizeData<SIZE>::FromString(const std::string &data) {
template<size_t SIZE> template<size_t SIZE>
std::string FixedSizeData<SIZE>::ToString() const { std::string FixedSizeData<SIZE>::ToString() const {
std::string result; std::string result;
CryptoPP::ArraySource(_data, BINARY_LENGTH, true, CryptoPP::ArraySource(_data.data(), BINARY_LENGTH, true,
new CryptoPP::HexEncoder( new CryptoPP::HexEncoder(
new CryptoPP::StringSink(result) new CryptoPP::StringSink(result)
) )
@ -83,7 +83,7 @@ std::string FixedSizeData<SIZE>::ToString() const {
template<size_t SIZE> template<size_t SIZE>
const unsigned char *FixedSizeData<SIZE>::data() const { const unsigned char *FixedSizeData<SIZE>::data() const {
return _data; return _data.data();
} }
template<size_t SIZE> template<size_t SIZE>
@ -93,13 +93,13 @@ unsigned char *FixedSizeData<SIZE>::data() {
template<size_t SIZE> template<size_t SIZE>
void FixedSizeData<SIZE>::ToBinary(void *target) const { void FixedSizeData<SIZE>::ToBinary(void *target) const {
std::memcpy(target, _data, BINARY_LENGTH); std::memcpy(target, _data.data(), BINARY_LENGTH);
} }
template<size_t SIZE> template<size_t SIZE>
FixedSizeData<SIZE> FixedSizeData<SIZE>::FromBinary(const void *source) { FixedSizeData<SIZE> FixedSizeData<SIZE>::FromBinary(const void *source) {
FixedSizeData<SIZE> result; FixedSizeData<SIZE> result;
std::memcpy(result._data, source, BINARY_LENGTH); std::memcpy(result._data.data(), source, BINARY_LENGTH);
return result; return result;
} }
@ -107,7 +107,7 @@ template<size_t SIZE> template<size_t size>
FixedSizeData<size> FixedSizeData<SIZE>::take() const { FixedSizeData<size> FixedSizeData<SIZE>::take() const {
static_assert(size <= SIZE, "Out of bounds"); static_assert(size <= SIZE, "Out of bounds");
FixedSizeData<size> result; FixedSizeData<size> result;
std::memcpy(result._data, _data, size); std::memcpy(result._data.data(), _data.data(), size);
return result; return result;
} }
@ -115,7 +115,7 @@ template<size_t SIZE> template<size_t size>
FixedSizeData<SIZE-size> FixedSizeData<SIZE>::drop() const { FixedSizeData<SIZE-size> FixedSizeData<SIZE>::drop() const {
static_assert(size <= SIZE, "Out of bounds"); static_assert(size <= SIZE, "Out of bounds");
FixedSizeData<SIZE-size> result; FixedSizeData<SIZE-size> result;
std::memcpy(result._data, _data+size, SIZE-size); std::memcpy(result._data.data(), _data.data()+size, SIZE-size);
return result; return result;
} }

View File

@ -67,7 +67,7 @@ unsigned int IOStreamConsole::ask(const string &question, const vector<string> &
throw std::invalid_argument("options should have at least one entry"); throw std::invalid_argument("options should have at least one entry");
} }
_output << question << "\n"; _output << question << "\n";
for (unsigned int i = 0; i < options.size(); ++i) { for (size_t i = 0; i < options.size(); ++i) {
_output << " [" << (i+1) << "] " << options[i] << "\n"; _output << " [" << (i+1) << "] " << options[i] << "\n";
} }
int choice = _askForChoice("Your choice [1-" + std::to_string(options.size()) + "]: ", _parseUIntWithMinMax(1, options.size())); int choice = _askForChoice("Your choice [1-" + std::to_string(options.size()) + "]: ", _parseUIntWithMinMax(1, options.size()));

View File

@ -2,6 +2,7 @@
#include <cstdio> #include <cstdio>
#include <stdexcept> #include <stdexcept>
#include <cerrno> #include <cerrno>
#include <array>
#if defined(__APPLE__) #if defined(__APPLE__)
@ -44,9 +45,9 @@ namespace cpputils {
string getOutput() { string getOutput() {
string output; string output;
char buffer[1024]; std::array<char, 1024> buffer{};
while (fgets(buffer, sizeof(buffer), _subprocess) != nullptr) { while (fgets(buffer.data(), buffer.size(), _subprocess) != nullptr) {
output += buffer; output += buffer.data();
} }
return output; return output;
} }

View File

@ -5,15 +5,16 @@
#include <sys/time.h> #include <sys/time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <errno.h> #include <errno.h>
#include <array>
#include <cpp-utils/system/stat.h> #include <cpp-utils/system/stat.h>
namespace cpputils { namespace cpputils {
int set_filetime(const char *filepath, timespec lastAccessTime, timespec lastModificationTime) { int set_filetime(const char *filepath, timespec lastAccessTime, timespec lastModificationTime) {
struct timeval casted_times[2]; std::array<struct timeval, 2> casted_times{};
TIMESPEC_TO_TIMEVAL(&casted_times[0], &lastAccessTime); TIMESPEC_TO_TIMEVAL(&casted_times[0], &lastAccessTime);
TIMESPEC_TO_TIMEVAL(&casted_times[1], &lastModificationTime); TIMESPEC_TO_TIMEVAL(&casted_times[1], &lastModificationTime);
int retval = ::utimes(filepath, casted_times); int retval = ::utimes(filepath, casted_times.data());
if (0 == retval) { if (0 == retval) {
return 0; return 0;
} else { } else {

View File

@ -71,11 +71,11 @@ int pthread_getname_np_gcompat(pthread_t thread, char *name, size_t len) {
#endif #endif
std::string get_thread_name(pthread_t thread) { std::string get_thread_name(pthread_t thread) {
char name[MAX_NAME_LEN]; std::array<char, MAX_NAME_LEN> name{};
#if defined(__GLIBC__) || defined(__APPLE__) #if defined(__GLIBC__) || defined(__APPLE__)
int result = pthread_getname_np(thread, name, MAX_NAME_LEN); int result = pthread_getname_np(thread, name.data(), MAX_NAME_LEN);
#else #else
int result = pthread_getname_np_gcompat(thread, name, MAX_NAME_LEN); int result = pthread_getname_np_gcompat(thread, name.data(), MAX_NAME_LEN);
#endif #endif
if (0 != result) { if (0 != result) {
throw std::runtime_error("Error getting thread name with pthread_getname_np. Code: " + std::to_string(result)); throw std::runtime_error("Error getting thread name with pthread_getname_np. Code: " + std::to_string(result));
@ -83,7 +83,7 @@ std::string get_thread_name(pthread_t thread) {
// pthread_getname_np returns a null terminated string with maximum 16 bytes. // pthread_getname_np returns a null terminated string with maximum 16 bytes.
// but just to be safe against a buggy implementation, let's set the last byte to zero. // but just to be safe against a buggy implementation, let's set the last byte to zero.
name[MAX_NAME_LEN - 1] = '\0'; name[MAX_NAME_LEN - 1] = '\0';
return name; return name.data();
} }
} }

View File

@ -399,7 +399,7 @@ namespace cryfs_cli {
return false; return false;
} }
int Cli::main(int argc, const char *argv[], unique_ref<HttpClient> httpClient, std::function<void()> onMounted) { int Cli::main(int argc, const char **argv, unique_ref<HttpClient> httpClient, std::function<void()> onMounted) {
cpputils::showBacktraceOnCrash(); cpputils::showBacktraceOnCrash();
cpputils::set_thread_name("cryfs"); cpputils::set_thread_name("cryfs");

View File

@ -18,7 +18,7 @@ namespace cryfs_cli {
class Cli final { class Cli final {
public: public:
Cli(cpputils::RandomGenerator &keyGenerator, const cpputils::SCryptSettings& scryptSettings, std::shared_ptr<cpputils::Console> console); Cli(cpputils::RandomGenerator &keyGenerator, const cpputils::SCryptSettings& scryptSettings, std::shared_ptr<cpputils::Console> console);
int main(int argc, const char *argv[], cpputils::unique_ref<cpputils::HttpClient> httpClient, std::function<void()> onMounted); int main(int argc, const char **argv, cpputils::unique_ref<cpputils::HttpClient> httpClient, std::function<void()> onMounted);
private: private:
void _checkForUpdates(cpputils::unique_ref<cpputils::HttpClient> httpClient); void _checkForUpdates(cpputils::unique_ref<cpputils::HttpClient> httpClient);

View File

@ -20,11 +20,11 @@ using boost::optional;
using boost::none; using boost::none;
using namespace cpputils::logging; using namespace cpputils::logging;
Parser::Parser(int argc, const char *argv[]) Parser::Parser(int argc, const char **argv)
:_options(_argsToVector(argc, argv)) { :_options(_argsToVector(argc, argv)) {
} }
vector<string> Parser::_argsToVector(int argc, const char *argv[]) { vector<string> Parser::_argsToVector(int argc, const char **argv) {
vector<string> result; vector<string> result;
for(int i = 0; i < argc; ++i) { for(int i = 0; i < argc; ++i) {
result.push_back(argv[i]); result.push_back(argv[i]);

View File

@ -10,12 +10,12 @@ namespace cryfs_cli {
namespace program_options { namespace program_options {
class Parser final { class Parser final {
public: public:
Parser(int argc, const char *argv[]); Parser(int argc, const char **argv);
ProgramOptions parse(const std::vector<std::string> &supportedCiphers) const; ProgramOptions parse(const std::vector<std::string> &supportedCiphers) const;
private: private:
static std::vector<std::string> _argsToVector(int argc, const char *argv[]); static std::vector<std::string> _argsToVector(int argc, const char **argv);
static std::vector<const char*> _to_const_char_vector(const std::vector<std::string> &options); static std::vector<const char*> _to_const_char_vector(const std::vector<std::string> &options);
static void _addAllowedOptions(boost::program_options::options_description *desc); static void _addAllowedOptions(boost::program_options::options_description *desc);
static void _addPositionalOptionForBaseDir(boost::program_options::options_description *desc, static void _addPositionalOptionForBaseDir(boost::program_options::options_description *desc,

View File

@ -18,7 +18,7 @@ void _showVersion() {
} }
} }
void Cli::main(int argc, const char* argv[]) { void Cli::main(int argc, const char **argv) {
_showVersion(); _showVersion();
ProgramOptions options = Parser(argc, argv).parse(); ProgramOptions options = Parser(argc, argv).parse();

View File

@ -6,7 +6,7 @@ namespace cryfs_unmount {
class Cli final { class Cli final {
public: public:
void main(int argc, const char* argv[]); void main(int argc, const char **argv);
}; };
} }

View File

@ -17,11 +17,11 @@ using std::endl;
using std::string; using std::string;
using namespace cpputils::logging; using namespace cpputils::logging;
Parser::Parser(int argc, const char *argv[]) Parser::Parser(int argc, const char **argv)
:_options(_argsToVector(argc, argv)) { :_options(_argsToVector(argc, argv)) {
} }
vector<string> Parser::_argsToVector(int argc, const char *argv[]) { vector<string> Parser::_argsToVector(int argc, const char **argv) {
vector<string> result; vector<string> result;
for (int i = 0; i < argc; ++i) { for (int i = 0; i < argc; ++i) {
result.push_back(argv[i]); result.push_back(argv[i]);

View File

@ -10,12 +10,12 @@ namespace cryfs_unmount {
namespace program_options { namespace program_options {
class Parser final { class Parser final {
public: public:
Parser(int argc, const char *argv[]); Parser(int argc, const char **argv);
ProgramOptions parse() const; ProgramOptions parse() const;
private: private:
static std::vector<std::string> _argsToVector(int argc, const char *argv[]); static std::vector<std::string> _argsToVector(int argc, const char **argv);
static std::vector<const char*> _to_const_char_vector(const std::vector<std::string> &options); static std::vector<const char*> _to_const_char_vector(const std::vector<std::string> &options);
static void _addAllowedOptions(boost::program_options::options_description *desc); static void _addAllowedOptions(boost::program_options::options_description *desc);
static void _addPositionalOptionForBaseDir(boost::program_options::options_description *desc, static void _addPositionalOptionForBaseDir(boost::program_options::options_description *desc,

View File

@ -29,7 +29,7 @@ namespace cryfs {
bool askAgain = true; bool askAgain = true;
while(askAgain) { while(askAgain) {
_console->print("\n"); _console->print("\n");
int cipherIndex = _console->ask("Which block cipher do you want to use?", ciphers); unsigned int cipherIndex = _console->ask("Which block cipher do you want to use?", ciphers);
cipherName = ciphers[cipherIndex]; cipherName = ciphers[cipherIndex];
askAgain = !_showWarningForCipherAndReturnIfOk(cipherName); askAgain = !_showWarningForCipherAndReturnIfOk(cipherName);
}; };
@ -54,7 +54,7 @@ namespace cryfs {
uint32_t CryConfigConsole::_askBlocksizeBytes() const { uint32_t CryConfigConsole::_askBlocksizeBytes() const {
vector<string> sizes = {"4KB", "8KB", "16KB", "32KB", "64KB", "512KB", "1MB", "4MB"}; vector<string> sizes = {"4KB", "8KB", "16KB", "32KB", "64KB", "512KB", "1MB", "4MB"};
int index = _console->ask("Which block size do you want to use?", sizes); unsigned int index = _console->ask("Which block size do you want to use?", sizes);
switch(index) { switch(index) {
case 0: return 4*1024; case 0: return 4*1024;
case 1: return 8*1024; case 1: return 8*1024;

View File

@ -49,7 +49,7 @@ optional<CryConfigFile> CryConfigFile::load(bf::path path, CryKeyProvider* keyPr
configFile.save(); configFile.save();
} }
//TODO For newer compilers, this works without std::move //TODO For newer compilers, this works without std::move
return std::move(configFile); return configFile;
} }
CryConfigFile CryConfigFile::create(bf::path path, CryConfig config, CryKeyProvider* keyProvider) { CryConfigFile CryConfigFile::create(bf::path path, CryConfig config, CryKeyProvider* keyProvider) {

View File

@ -28,6 +28,7 @@ unique_ref<SymlinkBlob> SymlinkBlob::InitializeSymlink(unique_ref<Blob> blob, co
} }
bf::path SymlinkBlob::_readTargetFromBlob(const FsBlobView &blob) { bf::path SymlinkBlob::_readTargetFromBlob(const FsBlobView &blob) {
// NOLINTNEXTLINE(cppcoreguidelines-avoid-c-arrays)
auto targetStr = std::make_unique<char[]>(blob.size() + 1); // +1 because of the nullbyte auto targetStr = std::make_unique<char[]>(blob.size() + 1); // +1 because of the nullbyte
blob.read(targetStr.get(), 0, blob.size()); blob.read(targetStr.get(), 0, blob.size());
targetStr[blob.size()] = '\0'; targetStr[blob.size()] = '\0';

View File

@ -175,7 +175,7 @@ vector<DirEntry>::iterator DirEntryList::_findFirst(const BlockId &hint, std::fu
return _entries.end(); return _entries.end();
} }
double startpos_percent = static_cast<double>(*static_cast<const unsigned char*>(hint.data().data())) / std::numeric_limits<unsigned char>::max(); double startpos_percent = static_cast<double>(*static_cast<const unsigned char*>(hint.data().data())) / std::numeric_limits<unsigned char>::max();
auto iter = _entries.begin() + static_cast<int>(startpos_percent * (_entries.size()-1)); auto iter = _entries.begin() + static_cast<int>(startpos_percent * static_cast<double>(_entries.size()-1));
ASSERT(iter >= _entries.begin() && iter < _entries.end(), "Startpos out of range"); ASSERT(iter >= _entries.begin() && iter < _entries.end(), "Startpos out of range");
while(iter != _entries.begin() && pred(*iter)) { while(iter != _entries.begin() && pred(*iter)) {
--iter; --iter;

View File

@ -72,8 +72,8 @@ TYPED_TEST_P(FsppOpenFileTest_Timestamps, truncate_nonempty_to_nonempty_grow) {
TYPED_TEST_P(FsppOpenFileTest_Timestamps, read_inbounds) { TYPED_TEST_P(FsppOpenFileTest_Timestamps, read_inbounds) {
auto openFile = this->CreateAndOpenFileWithSize("/myfile", fspp::num_bytes_t(10)); auto openFile = this->CreateAndOpenFileWithSize("/myfile", fspp::num_bytes_t(10));
auto operation = [&openFile] () { auto operation = [&openFile] () {
char buffer[5]; std::array<char, 5> buffer{};
openFile->read(buffer, fspp::num_bytes_t(5), fspp::num_bytes_t(0)); openFile->read(buffer.data(), fspp::num_bytes_t(5), fspp::num_bytes_t(0));
}; };
this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS(*openFile, operation, {this->ExpectUpdatesAccessTimestamp, this->ExpectDoesntUpdateModificationTimestamp, this->ExpectDoesntUpdateMetadataTimestamp}); this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS(*openFile, operation, {this->ExpectUpdatesAccessTimestamp, this->ExpectDoesntUpdateModificationTimestamp, this->ExpectDoesntUpdateMetadataTimestamp});
} }
@ -81,8 +81,8 @@ TYPED_TEST_P(FsppOpenFileTest_Timestamps, read_inbounds) {
TYPED_TEST_P(FsppOpenFileTest_Timestamps, read_outofbounds) { TYPED_TEST_P(FsppOpenFileTest_Timestamps, read_outofbounds) {
auto openFile = this->CreateAndOpenFileWithSize("/myfile", fspp::num_bytes_t(0)); auto openFile = this->CreateAndOpenFileWithSize("/myfile", fspp::num_bytes_t(0));
auto operation = [&openFile] () { auto operation = [&openFile] () {
char buffer[5]; std::array<char, 5> buffer{};
openFile->read(buffer, fspp::num_bytes_t(5), fspp::num_bytes_t(2)); openFile->read(buffer.data(), fspp::num_bytes_t(5), fspp::num_bytes_t(2));
}; };
this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS(*openFile, operation, {this->ExpectUpdatesAccessTimestamp, this->ExpectDoesntUpdateModificationTimestamp, this->ExpectDoesntUpdateMetadataTimestamp}); this->EXPECT_OPERATION_UPDATES_TIMESTAMPS_AS(*openFile, operation, {this->ExpectUpdatesAccessTimestamp, this->ExpectDoesntUpdateModificationTimestamp, this->ExpectDoesntUpdateMetadataTimestamp});
} }

View File

@ -113,8 +113,8 @@ int fusepp_ftruncate(const char *path, int64_t size, fuse_file_info *fileinfo) {
return FUSE_OBJ->ftruncate(bf::path(path), size, fileinfo); return FUSE_OBJ->ftruncate(bf::path(path), size, fileinfo);
} }
int fusepp_utimens(const char *path, const timespec times[2]) { int fusepp_utimens(const char *path, const timespec times[2]) { // NOLINT(cppcoreguidelines-avoid-c-arrays)
return FUSE_OBJ->utimens(bf::path(path), times); return FUSE_OBJ->utimens(bf::path(path), {times[0], times[1]});
} }
int fusepp_open(const char *path, fuse_file_info *fileinfo) { int fusepp_open(const char *path, fuse_file_info *fileinfo) {
@ -751,7 +751,7 @@ int Fuse::ftruncate(const bf::path &path, int64_t size, fuse_file_info *fileinfo
} }
} }
int Fuse::utimens(const bf::path &path, const timespec times[2]) { int Fuse::utimens(const bf::path &path, const std::array<timespec, 2> times) {
ThreadNameForDebugging _threadName("utimens"); ThreadNameForDebugging _threadName("utimens");
#ifdef FSPP_LOG #ifdef FSPP_LOG
LOG(DEBUG, "utimens({}, _)", path); LOG(DEBUG, "utimens({}, _)", path);

View File

@ -44,7 +44,7 @@ public:
int chown(const boost::filesystem::path &path, ::uid_t uid, ::gid_t gid); int chown(const boost::filesystem::path &path, ::uid_t uid, ::gid_t gid);
int truncate(const boost::filesystem::path &path, int64_t size); int truncate(const boost::filesystem::path &path, int64_t size);
int ftruncate(const boost::filesystem::path &path, int64_t size, fuse_file_info *fileinfo); int ftruncate(const boost::filesystem::path &path, int64_t size, fuse_file_info *fileinfo);
int utimens(const boost::filesystem::path &path, const timespec times[2]); int utimens(const boost::filesystem::path &path, const std::array<timespec, 2> times);
int open(const boost::filesystem::path &path, fuse_file_info *fileinfo); int open(const boost::filesystem::path &path, fuse_file_info *fileinfo);
int release(const boost::filesystem::path &path, fuse_file_info *fileinfo); int release(const boost::filesystem::path &path, fuse_file_info *fileinfo);
int read(const boost::filesystem::path &path, char *buf, size_t size, int64_t offset, fuse_file_info *fileinfo); int read(const boost::filesystem::path &path, char *buf, size_t size, int64_t offset, fuse_file_info *fileinfo);

View File

@ -165,7 +165,7 @@ cpputils::unique_ref<ResourceRef> ParallelAccessStore<Resource, ResourceRef, Key
auto resourceRef = createResourceRef(found->second.getReference()); auto resourceRef = createResourceRef(found->second.getReference());
resourceRef->init(this, key); resourceRef->init(this, key);
onExists(resourceRef.get()); onExists(resourceRef.get());
return std::move(resourceRef); return resourceRef;
} }
}; };
@ -190,7 +190,7 @@ boost::optional<cpputils::unique_ref<ResourceRef>> ParallelAccessStore<Resource,
} else { } else {
auto resourceRef = createResourceRef(found->second.getReference()); auto resourceRef = createResourceRef(found->second.getReference());
resourceRef->init(this, key); resourceRef->init(this, key);
return std::move(resourceRef); return resourceRef;
} }
} }

View File

@ -222,7 +222,7 @@ TEST_P(DataTreeTest_ResizeByTraversing_P, DataStaysIntact) {
if (traversalBeginIndex < oldNumberOfLeaves) { if (traversalBeginIndex < oldNumberOfLeaves) {
// Traversal wrote over part of the pre-existing data, we can only check the data before it. // Traversal wrote over part of the pre-existing data, we can only check the data before it.
if (traversalBeginIndex != 0) { if (traversalBeginIndex != 0) {
data.EXPECT_DATA_CORRECT(nodeStore->load(blockId).get().get(), traversalBeginIndex - 1); data.EXPECT_DATA_CORRECT(nodeStore->load(blockId).get().get(), static_cast<int>(traversalBeginIndex - 1));
} }
} else { } else {
// Here, traversal was entirely outside the preexisting data, we can check all preexisting data. // Here, traversal was entirely outside the preexisting data, we can check all preexisting data.

View File

@ -67,7 +67,7 @@ private:
case SizePolicy::Full: case SizePolicy::Full:
return _dataNodeStore->layout().maxBytesPerLeaf(); return _dataNodeStore->layout().maxBytesPerLeaf();
case SizePolicy::Random: case SizePolicy::Random:
return mod(_dataNodeStore->layout().maxBytesPerLeaf() - childIndex, _dataNodeStore->layout().maxBytesPerLeaf()); return mod(static_cast<int>(_dataNodeStore->layout().maxBytesPerLeaf() - childIndex), static_cast<int>(_dataNodeStore->layout().maxBytesPerLeaf()));
case SizePolicy::Unchanged: case SizePolicy::Unchanged:
return leaf->numBytes(); return leaf->numBytes();
default: default:

View File

@ -21,7 +21,7 @@ TEST_F(CacheTest_PushAndPop, PopNonExistingEntry_NonEmptyCache) {
TEST_F(CacheTest_PushAndPop, PopNonExistingEntry_FullCache) { TEST_F(CacheTest_PushAndPop, PopNonExistingEntry_FullCache) {
//Add a lot of even numbered keys //Add a lot of even numbered keys
for (unsigned int i = 0; i < MAX_ENTRIES; ++i) { for (int i = 0; i < static_cast<int>(MAX_ENTRIES); ++i) {
push(2*i, 2*i); push(2*i, 2*i);
} }
//Request an odd numbered key //Request an odd numbered key
@ -43,35 +43,35 @@ TEST_F(CacheTest_PushAndPop, MultipleEntries) {
} }
TEST_F(CacheTest_PushAndPop, FullCache) { TEST_F(CacheTest_PushAndPop, FullCache) {
for(unsigned int i = 0; i < MAX_ENTRIES; ++i) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES); ++i) {
push(i, 2*i); push(i, 2*i);
} }
for(unsigned int i = 0; i < MAX_ENTRIES; ++i) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES); ++i) {
EXPECT_EQ(static_cast<signed int>(2*i), pop(i).value()); EXPECT_EQ(2*i, pop(i).value());
} }
} }
TEST_F(CacheTest_PushAndPop, FullCache_PushNonOrdered_PopOrdered) { TEST_F(CacheTest_PushAndPop, FullCache_PushNonOrdered_PopOrdered) {
for(unsigned int i = 1; i < MAX_ENTRIES; i += 2) { for(int i = 1; i < static_cast<int>(MAX_ENTRIES); i += 2) {
push(i, 2*i); push(i, 2*i);
} }
for(unsigned int i = 0; i < MAX_ENTRIES; i += 2) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES); i += 2) {
push(i, 2*i); push(i, 2*i);
} }
for(unsigned int i = 0; i < MAX_ENTRIES; ++i) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES); ++i) {
EXPECT_EQ(static_cast<signed int>(2*i), pop(i).value()); EXPECT_EQ(2*i, pop(i).value());
} }
} }
TEST_F(CacheTest_PushAndPop, FullCache_PushOrdered_PopNonOrdered) { TEST_F(CacheTest_PushAndPop, FullCache_PushOrdered_PopNonOrdered) {
for(unsigned int i = 0; i < MAX_ENTRIES; ++i) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES); ++i) {
push(i, 2*i); push(i, 2*i);
} }
for(unsigned int i = 1; i < MAX_ENTRIES; i += 2) { for(int i = 1; i < static_cast<int>(MAX_ENTRIES); i += 2) {
EXPECT_EQ(static_cast<signed int>(2*i), pop(i).value()); EXPECT_EQ(2*i, pop(i).value());
} }
for(unsigned int i = 0; i < MAX_ENTRIES; i += 2) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES); i += 2) {
EXPECT_EQ(static_cast<signed int>(2*i), pop(i).value()); EXPECT_EQ(2*i, pop(i).value());
} }
} }
@ -95,27 +95,27 @@ TEST_F(CacheTest_PushAndPop, FullCache_PushNonOrdered_PopNonOrdered) {
for(int i = roundDownToEven(MAX_ENTRIES - 1); i >= 0; i -= 2) { for(int i = roundDownToEven(MAX_ENTRIES - 1); i >= 0; i -= 2) {
push(i, 2*i); push(i, 2*i);
} }
for(unsigned int i = 1; i < MAX_ENTRIES; i += 2) { for(int i = 1; i < static_cast<int>(MAX_ENTRIES); i += 2) {
push(i, 2*i); push(i, 2*i);
} }
for(int i = roundDownToOdd(MAX_ENTRIES-1); i >= 0; i -= 2) { for(int i = roundDownToOdd(MAX_ENTRIES-1); i >= 0; i -= 2) {
EXPECT_EQ(static_cast<signed int>(2*i), pop(i).value()); EXPECT_EQ(2*i, pop(i).value());
} }
for(unsigned int i = 0; i < MAX_ENTRIES; i += 2) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES); i += 2) {
EXPECT_EQ(static_cast<signed int>(2*i), pop(i).value()); EXPECT_EQ(2*i, pop(i).value());
} }
} }
TEST_F(CacheTest_PushAndPop, MoreThanFullCache) { TEST_F(CacheTest_PushAndPop, MoreThanFullCache) {
for(unsigned int i = 0; i < MAX_ENTRIES + 2; ++i) { for(int i = 0; i < static_cast<int>(MAX_ENTRIES + 2); ++i) {
push(i, 2*i); push(i, 2*i);
} }
//Check that the oldest two elements got deleted automatically //Check that the oldest two elements got deleted automatically
EXPECT_EQ(boost::none, pop(0)); EXPECT_EQ(boost::none, pop(0));
EXPECT_EQ(boost::none, pop(1)); EXPECT_EQ(boost::none, pop(1));
//Check the other elements are still there //Check the other elements are still there
for(unsigned int i = 2; i < MAX_ENTRIES + 2; ++i) { for(int i = 2; i < static_cast<int>(MAX_ENTRIES + 2); ++i) {
EXPECT_EQ(static_cast<signed int>(2*i), pop(i).value()); EXPECT_EQ(2*i, pop(i).value());
} }
} }

View File

@ -6,7 +6,7 @@
#include <Windows.h> #include <Windows.h>
#endif #endif
void handle_exit_signal(char* argv[]) { void handle_exit_signal(char **argv) {
const std::string kind = argv[1]; const std::string kind = argv[1];
if (kind == "exception") { if (kind == "exception") {
throw std::logic_error(argv[2]); throw std::logic_error(argv[2]);
@ -18,7 +18,7 @@ void handle_exit_signal(char* argv[]) {
DWORD code = std::atoll(argv[2]); DWORD code = std::atoll(argv[2]);
::RaiseException(code, EXCEPTION_NONCONTINUABLE, 0, NULL); ::RaiseException(code, EXCEPTION_NONCONTINUABLE, 0, NULL);
#else #else
int code = std::strtol(argv[2], nullptr, 10); int code = static_cast<int>(std::strtol(argv[2], nullptr, 10));
::raise(code); ::raise(code);
#endif #endif
} }

View File

@ -11,6 +11,6 @@ int main(int argc, char* argv[]) {
std::cout << argv[1]; std::cout << argv[1];
int exit_status = std::strtol(argv[2], nullptr, 10); int exit_status = static_cast<int>(std::strtol(argv[2], nullptr, 10));
return exit_status; return exit_status;
} }

View File

@ -10,7 +10,7 @@ public:
void EXPECT_VECTOR_EQ(std::initializer_list<std::string> expected, const std::vector<std::string> &actual) { void EXPECT_VECTOR_EQ(std::initializer_list<std::string> expected, const std::vector<std::string> &actual) {
std::vector<std::string> expectedVec(expected); std::vector<std::string> expectedVec(expected);
ASSERT_EQ(expectedVec.size(), actual.size()); ASSERT_EQ(expectedVec.size(), actual.size());
for(unsigned int i = 0; i < expectedVec.size(); ++i) { for(size_t i = 0; i < expectedVec.size(); ++i) {
EXPECT_EQ(expectedVec[i], actual[i]); EXPECT_EQ(expectedVec[i], actual[i]);
} }
} }

View File

@ -40,7 +40,7 @@ public:
cpputils::unique_ref<cpputils::HttpClient> _httpClient() { cpputils::unique_ref<cpputils::HttpClient> _httpClient() {
cpputils::unique_ref<cpputils::FakeHttpClient> httpClient = cpputils::make_unique_ref<cpputils::FakeHttpClient>(); cpputils::unique_ref<cpputils::FakeHttpClient> httpClient = cpputils::make_unique_ref<cpputils::FakeHttpClient>();
httpClient->addWebsite("https://www.cryfs.org/version_info.json", "{\"version_info\":{\"current\":\"0.8.5\"}}"); httpClient->addWebsite("https://www.cryfs.org/version_info.json", "{\"version_info\":{\"current\":\"0.8.5\"}}");
return std::move(httpClient); return httpClient;
} }
int run(const std::vector<std::string>& args, std::function<void()> onMounted) { int run(const std::vector<std::string>& args, std::function<void()> onMounted) {

View File

@ -20,6 +20,6 @@ TEST_P(FuseReadFileDescriptorTest, FileDescriptorIsCorrect) {
EXPECT_CALL(*fsimpl, read(Eq(GetParam()), _, _, _)) EXPECT_CALL(*fsimpl, read(Eq(GetParam()), _, _, _))
.Times(1).WillOnce(ReturnSuccessfulRead); .Times(1).WillOnce(ReturnSuccessfulRead);
char buf[1]; std::array<char, 1> buf{};
ReadFile(FILENAME, buf, fspp::num_bytes_t(1), fspp::num_bytes_t(0)); ReadFile(FILENAME, buf.data(), fspp::num_bytes_t(1), fspp::num_bytes_t(0));
} }

View File

@ -26,13 +26,13 @@ constexpr fspp::num_bytes_t FuseReadOverflowTest::OFFSET;
TEST_F(FuseReadOverflowTest, ReadMoreThanFileSizeFromBeginning) { TEST_F(FuseReadOverflowTest, ReadMoreThanFileSizeFromBeginning) {
char buf[READSIZE.value()]; std::array<char, READSIZE.value()> buf{};
auto retval = ReadFileReturnError(FILENAME, buf, READSIZE, fspp::num_bytes_t(0)); auto retval = ReadFileReturnError(FILENAME, buf.data(), READSIZE, fspp::num_bytes_t(0));
EXPECT_EQ(FILESIZE, retval.read_bytes); EXPECT_EQ(FILESIZE, retval.read_bytes);
} }
TEST_F(FuseReadOverflowTest, ReadMoreThanFileSizeFromMiddle) { TEST_F(FuseReadOverflowTest, ReadMoreThanFileSizeFromMiddle) {
char buf[READSIZE.value()]; std::array<char, READSIZE.value()> buf{};
auto retval = ReadFileReturnError(FILENAME, buf, READSIZE, OFFSET); auto retval = ReadFileReturnError(FILENAME, buf.data(), READSIZE, OFFSET);
EXPECT_EQ(FILESIZE-OFFSET, retval.read_bytes); EXPECT_EQ(FILESIZE-OFFSET, retval.read_bytes);
} }

View File

@ -80,7 +80,7 @@ void FuseReadDirTest::closeDir(DIR *dir) {
Action<vector<fspp::Dir::Entry>*(const char*)> FuseReadDirTest::ReturnDirEntries(vector<std::string> entries) { Action<vector<fspp::Dir::Entry>*(const char*)> FuseReadDirTest::ReturnDirEntries(vector<std::string> entries) {
vector<fspp::Dir::Entry> *direntries = new vector<fspp::Dir::Entry>(entries.size(), fspp::Dir::Entry(fspp::Dir::EntryType::FILE, "")); vector<fspp::Dir::Entry> *direntries = new vector<fspp::Dir::Entry>(entries.size(), fspp::Dir::Entry(fspp::Dir::EntryType::FILE, ""));
for(unsigned int i = 0; i < entries.size(); ++i) { for(size_t i = 0; i < entries.size(); ++i) {
(*direntries)[i].name = entries[i]; (*direntries)[i].name = entries[i];
} }
return Return(direntries); return Return(direntries);

View File

@ -5,18 +5,18 @@ using ::testing::Return;
using ::testing::WithParamInterface; using ::testing::WithParamInterface;
using ::testing::Values; using ::testing::Values;
class FuseUtimensTimeParameterTest: public FuseUtimensTest, public WithParamInterface<const timespec*> { class FuseUtimensTimeParameterTest: public FuseUtimensTest, public WithParamInterface<std::array<timespec, 2>> {
}; };
const timespec TIMEVAL1[2] = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(0,0)}; const std::array<timespec, 2> TIMEVAL1 = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(0,0)};
const timespec TIMEVAL2[2] = {FuseUtimensTest::makeTimespec(1000,0), FuseUtimensTest::makeTimespec(0,0)}; const std::array<timespec, 2> TIMEVAL2 = {FuseUtimensTest::makeTimespec(1000,0), FuseUtimensTest::makeTimespec(0,0)};
const timespec TIMEVAL3[2] = {FuseUtimensTest::makeTimespec(0,1000), FuseUtimensTest::makeTimespec(0,0)}; const std::array<timespec, 2> TIMEVAL3 = {FuseUtimensTest::makeTimespec(0,1000), FuseUtimensTest::makeTimespec(0,0)};
const timespec TIMEVAL4[2] = {FuseUtimensTest::makeTimespec(1000,1000), FuseUtimensTest::makeTimespec(0,0)}; const std::array<timespec, 2> TIMEVAL4 = {FuseUtimensTest::makeTimespec(1000,1000), FuseUtimensTest::makeTimespec(0,0)};
const timespec TIMEVAL5[2] = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(0,0)}; const std::array<timespec, 2> TIMEVAL5 = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(0,0)};
const timespec TIMEVAL6[2] = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(1000,0)}; const std::array<timespec, 2> TIMEVAL6 = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(1000,0)};
const timespec TIMEVAL7[2] = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(0,1000)}; const std::array<timespec, 2> TIMEVAL7 = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(0,1000)};
const timespec TIMEVAL8[2] = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(1000,1000)}; const std::array<timespec, 2> TIMEVAL8 = {FuseUtimensTest::makeTimespec(0,0), FuseUtimensTest::makeTimespec(1000,1000)};
const timespec TIMEVAL9[2] = {FuseUtimensTest::makeTimespec(1417196126,123000), FuseUtimensTest::makeTimespec(1417109713,321000)}; // current timestamp and the day before as of writing this test case const std::array<timespec, 2> TIMEVAL9 = {FuseUtimensTest::makeTimespec(1417196126,123000), FuseUtimensTest::makeTimespec(1417109713,321000)}; // current timestamp and the day before as of writing this test case
const timespec TIMEVAL10[2] = {FuseUtimensTest::makeTimespec(UINT64_C(1024)*1024*1024*1024,999000), FuseUtimensTest::makeTimespec(UINT64_C(2*1024)*1024*1024*1024,321000)}; // needs 64bit for timestamp representation const std::array<timespec, 2> TIMEVAL10 = {FuseUtimensTest::makeTimespec(UINT64_C(1024)*1024*1024*1024,999000), FuseUtimensTest::makeTimespec(UINT64_C(2*1024)*1024*1024*1024,321000)}; // needs 64bit for timestamp representation
INSTANTIATE_TEST_CASE_P(FuseUtimensTimeParameterTest, FuseUtimensTimeParameterTest, INSTANTIATE_TEST_CASE_P(FuseUtimensTimeParameterTest, FuseUtimensTimeParameterTest,
Values(TIMEVAL1, TIMEVAL2, TIMEVAL3, TIMEVAL4, TIMEVAL5, TIMEVAL6, TIMEVAL7, TIMEVAL8, TIMEVAL9, TIMEVAL10)); Values(TIMEVAL1, TIMEVAL2, TIMEVAL3, TIMEVAL4, TIMEVAL5, TIMEVAL6, TIMEVAL7, TIMEVAL8, TIMEVAL9, TIMEVAL10));

View File

@ -21,6 +21,6 @@ TEST_P(FuseWriteFileDescriptorTest, FileDescriptorIsCorrect) {
EXPECT_CALL(*fsimpl, write(Eq(GetParam()), _, _, _)) EXPECT_CALL(*fsimpl, write(Eq(GetParam()), _, _, _))
.Times(1).WillOnce(Return()); .Times(1).WillOnce(Return());
char buf[1]; std::array<char, 1> buf{};
WriteFile(FILENAME, buf, fspp::num_bytes_t(1), fspp::num_bytes_t(0)); WriteFile(FILENAME, buf.data(), fspp::num_bytes_t(1), fspp::num_bytes_t(0));
} }