General: Make ignoring a discarded return value an error

Allows our CI to catch more potential bugs. This also removes the
[[nodiscard]] attribute of IOFile's Open member function. There are
cases where a file may want to be opened, but have the status of it
checked at a later time.
master
Lioncash 2020-10-29 23:30:42 +07:00
parent 7dcf4c0018
commit 26547d3e3b
3 changed files with 17 additions and 6 deletions

@ -32,7 +32,6 @@ if (MSVC)
# /Zc:inline - Let codegen omit inline functions in object files # /Zc:inline - Let codegen omit inline functions in object files
# /Zc:throwingNew - Let codegen assume `operator new` (without std::nothrow) will never return null # /Zc:throwingNew - Let codegen assume `operator new` (without std::nothrow) will never return null
add_compile_options( add_compile_options(
/W3
/MP /MP
/Zi /Zi
/Zo /Zo
@ -43,6 +42,10 @@ if (MSVC)
/Zc:externConstexpr /Zc:externConstexpr
/Zc:inline /Zc:inline
/Zc:throwingNew /Zc:throwingNew
# Warnings
/W3
/we4834 # Discarding return value of function with 'nodiscard' attribute
) )
# /GS- - No stack buffer overflow checks # /GS- - No stack buffer overflow checks
@ -56,6 +59,7 @@ else()
-Werror=implicit-fallthrough -Werror=implicit-fallthrough
-Werror=missing-declarations -Werror=missing-declarations
-Werror=reorder -Werror=reorder
-Werror=unused-result
-Wextra -Wextra
-Wmissing-declarations -Wmissing-declarations
-Wno-attributes -Wno-attributes

@ -232,7 +232,7 @@ public:
void Swap(IOFile& other) noexcept; void Swap(IOFile& other) noexcept;
[[nodiscard]] bool Open(const std::string& filename, const char openmode[], int flags = 0); bool Open(const std::string& filename, const char openmode[], int flags = 0);
bool Close(); bool Close();
template <typename T> template <typename T>

@ -16,16 +16,23 @@
// Call directly after the command or use the error num. // Call directly after the command or use the error num.
// This function might change the error code. // This function might change the error code.
std::string GetLastErrorMsg() { std::string GetLastErrorMsg() {
static const std::size_t buff_size = 255; static constexpr std::size_t buff_size = 255;
char err_str[buff_size]; char err_str[buff_size];
#ifdef _WIN32 #ifdef _WIN32
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, GetLastError(), FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), err_str, buff_size, nullptr); MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), err_str, buff_size, nullptr);
return std::string(err_str, buff_size);
#elif defined(__GLIBC__) && (_GNU_SOURCE || (_POSIX_C_SOURCE < 200112L && _XOPEN_SOURCE < 600))
// Thread safe (GNU-specific)
const char* str = strerror_r(errno, err_str, buff_size);
return std::string(str);
#else #else
// Thread safe (XSI-compliant) // Thread safe (XSI-compliant)
strerror_r(errno, err_str, buff_size); const int success = strerror_r(errno, err_str, buff_size);
#endif if (success != 0) {
return {};
return std::string(err_str, buff_size); }
return std::string(err_str);
#endif
} }