CI updates and assorted cleanups

This commit is contained in:
Markus F.X.J. Oberhumer
2023-11-06 19:29:40 +01:00
parent b6dd61cea8
commit 283ab0e7ea
21 changed files with 462 additions and 85 deletions
+38
View File
@@ -40,6 +40,15 @@ upx_rsize_t upx_safe_strlen(const char *s) {
#define strlen upx_safe_strlen
}
upx_rsize_t upx_safe_strlen_noexcept(const char *s) noexcept {
#undef strlen
assert_noexcept(s != nullptr);
size_t len = strlen(s);
assert_noexcept(len < UPX_RSIZE_MAX_STR);
return len;
#define strlen upx_safe_strlen
}
int upx_safe_vsnprintf(char *str, upx_rsize_t max_size, const char *format, va_list ap) {
#undef vsnprintf
size_t size;
@@ -68,6 +77,35 @@ int upx_safe_vsnprintf(char *str, upx_rsize_t max_size, const char *format, va_l
#define vsnprintf upx_safe_vsnprintf
}
int upx_safe_vsnprintf_noexcept(char *str, upx_rsize_t max_size, const char *format,
va_list ap) noexcept {
#undef vsnprintf
size_t size;
// preconditions
assert_noexcept(max_size <= UPX_RSIZE_MAX_STR);
if (str != nullptr)
assert_noexcept(max_size > 0);
else
assert_noexcept(max_size == 0);
long long len = vsnprintf(str, max_size, format, ap);
assert_noexcept(len >= 0);
assert_noexcept(len < UPX_RSIZE_MAX_STR);
size = (size_t) len + 1;
// postconditions
assert_noexcept(size > 0);
assert_noexcept(size <= UPX_RSIZE_MAX_STR);
if (str != nullptr) {
assert_noexcept(size <= max_size);
assert_noexcept(str[size - 1] == '\0');
}
return ACC_ICONV(int, size - 1); // snprintf() returns length, not size
#define vsnprintf upx_safe_vsnprintf
}
int upx_safe_snprintf(char *str, upx_rsize_t max_size, const char *format, ...) {
va_list ap;
int len;