diff options
author | Lioncash <mathew1800@gmail.com> | 2019-05-23 14:24:11 -0400 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2019-05-23 14:24:13 -0400 |
commit | 11e9bee91d645cba69e936916394a0a03875c878 (patch) | |
tree | f27f82a7cfedb748013fa0d6f236f8dd3583d7e2 | |
parent | 943f6da1ac507daec404d593a331cc37c9ab64df (diff) |
common/file_util: Make GetCurrentDir() return a std::optional
nullptr was being returned in the error case, which, at a glance may
seem perfectly OK... until you realize that std::string has the
invariant that it may not be constructed from a null pointer. This
means that if this error case was ever hit, then the application would
most likely crash from a thrown exception in std::string's constructor.
Instead, we can change the function to return an optional value,
indicating if a failure occurred.
-rw-r--r-- | src/common/file_util.cpp | 4 | ||||
-rw-r--r-- | src/common/file_util.h | 3 |
2 files changed, 4 insertions, 3 deletions
diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp index 7403108078..d8812837ea 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -525,7 +525,7 @@ void CopyDir(const std::string& source_path, const std::string& dest_path) { #endif } -std::string GetCurrentDir() { +std::optional<std::string> GetCurrentDir() { // Get the current working directory (getcwd uses malloc) #ifdef _WIN32 wchar_t* dir; @@ -535,7 +535,7 @@ std::string GetCurrentDir() { if (!(dir = getcwd(nullptr, 0))) { #endif LOG_ERROR(Common_Filesystem, "GetCurrentDirectory failed: {}", GetLastErrorMsg()); - return nullptr; + return {}; } #ifdef _WIN32 std::string strDir = Common::UTF16ToUTF8(dir); diff --git a/src/common/file_util.h b/src/common/file_util.h index c325f5b498..cde7ddf2d1 100644 --- a/src/common/file_util.h +++ b/src/common/file_util.h @@ -9,6 +9,7 @@ #include <fstream> #include <functional> #include <limits> +#include <optional> #include <string> #include <string_view> #include <type_traits> @@ -118,7 +119,7 @@ u64 ScanDirectoryTree(const std::string& directory, FSTEntry& parent_entry, bool DeleteDirRecursively(const std::string& directory, unsigned int recursion = 256); // Returns the current directory -std::string GetCurrentDir(); +std::optional<std::string> GetCurrentDir(); // Create directory and copy contents (does not overwrite existing files) void CopyDir(const std::string& source_path, const std::string& dest_path); |