all: more clang-tidy cleanups
This commit is contained in:
parent
aa9e69f03e
commit
42759b94bd
@ -23,11 +23,13 @@ Checks: >
|
||||
clang-analyzer-*,
|
||||
-clang-analyzer-optin.performance.Padding,
|
||||
-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling,
|
||||
-clang-analyzer-security.insecureAPI.rand,
|
||||
-clang-analyzer-security.insecureAPI.strcpy,
|
||||
clang-diagnostic-*,
|
||||
performance-*,
|
||||
-performance-avoid-endl,
|
||||
-performance-enum-size,
|
||||
-performance-no-int-to-ptr,
|
||||
-performance-unnecessary-value-param,
|
||||
FormatStyle: file
|
||||
HeaderFilterRegex: '.*'
|
||||
|
||||
@ -259,7 +259,7 @@ if(NOT UPX_CONFIG_DISABLE_THREADS)
|
||||
endif()
|
||||
# make sure that threads are indeed fully supported in C++
|
||||
if(Threads_FOUND)
|
||||
foreach(f std_lock_guard.cpp)
|
||||
foreach(f std_lock_guard.cpp types_abi.cpp)
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE "EXECUTABLE")
|
||||
if(NOT UPX_CONFIG_DISABLE_CXX_STANDARD)
|
||||
try_compile(result "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
|
||||
14
misc/cmake/try_compile/types_abi.cpp
Normal file
14
misc/cmake/try_compile/types_abi.cpp
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright (C) Markus Franz Xaver Johannes Oberhumer
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
// check ABI - require proper alignment of fundamental types for use in atomics
|
||||
static_assert(alignof(char) == sizeof(char), "");
|
||||
static_assert(alignof(short) == sizeof(short), "");
|
||||
static_assert(alignof(int) == sizeof(int), "");
|
||||
static_assert(alignof(long) == sizeof(long), "");
|
||||
static_assert(alignof(ptrdiff_t) == sizeof(ptrdiff_t), "");
|
||||
static_assert(alignof(size_t) == sizeof(size_t), "");
|
||||
static_assert(alignof(void *) == sizeof(void *), "");
|
||||
|
||||
int main() { return 0; }
|
||||
@ -225,7 +225,7 @@ build/analyze/clang-tidy-bzip2/debug build/analyze/clang-tidy-bzip2/release: $$(
|
||||
build/analyze/clang-tidy-ucl/debug build/analyze/clang-tidy-ucl/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||
$(RUN_CLANG_TIDY_WERROR) -config-file ./misc/analyze/clang-tidy/clang-tidy-ucl.yml /vendor/ucl/
|
||||
build/analyze/clang-tidy-zlib/debug build/analyze/clang-tidy-zlib/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||
$(RUN_CLANG_TIDY_WERROR) -config-file ./misc/analyze/clang-tidy/clang-tidy-zlib.yml /vendor/zlib/
|
||||
$(RUN_CLANG_TIDY) -config-file ./misc/analyze/clang-tidy/clang-tidy-zlib.yml /vendor/zlib/
|
||||
build/analyze/clang-tidy-zstd/debug build/analyze/clang-tidy-zstd/release: $$(CLANG_TIDY_BUILD_BASE)/$$(notdir $$@) PHONY
|
||||
$(RUN_CLANG_TIDY) -config-file ./misc/analyze/clang-tidy/clang-tidy-zstd.yml /vendor/zstd/
|
||||
build/analyze/clang-tidy/debug build/analyze/clang-tidy/release: build/analyze/clang-tidy-upx/$$(notdir $$@)
|
||||
|
||||
@ -257,35 +257,44 @@ TEST_CASE("upx::ptr_std_atomic_cast") {
|
||||
(void) upx::ptr_std_atomic_cast((upx_int32_t *) nullptr);
|
||||
(void) upx::ptr_std_atomic_cast((int *) nullptr);
|
||||
(void) upx::ptr_std_atomic_cast((long *) nullptr);
|
||||
(void) upx::ptr_std_atomic_cast((ptrdiff_t *) nullptr);
|
||||
(void) upx::ptr_std_atomic_cast((size_t *) nullptr);
|
||||
(void) upx::ptr_std_atomic_cast((void **) nullptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_CASE("upx::atomic_exchange") {
|
||||
#if defined(__riscv)
|
||||
// RISC-V has no support for subword atomic operations and needs libatomic to emulate
|
||||
#else
|
||||
{
|
||||
upx_int8_t x = -1;
|
||||
upx_int8_t y = upx::atomic_exchange(&x, (upx_int8_t) 2);
|
||||
CHECK_EQ(x, 2);
|
||||
CHECK_EQ(y, -1);
|
||||
UNUSED(y);
|
||||
}
|
||||
{
|
||||
upx_int16_t x = -1;
|
||||
upx_int16_t y = upx::atomic_exchange(&x, (upx_int16_t) 2);
|
||||
CHECK_EQ(x, 2);
|
||||
CHECK_EQ(y, -1);
|
||||
UNUSED(y);
|
||||
}
|
||||
{
|
||||
upx_int32_t x = -1;
|
||||
upx_int32_t y = upx::atomic_exchange(&x, (upx_int32_t) 2);
|
||||
CHECK_EQ(x, 2);
|
||||
CHECK_EQ(y, -1);
|
||||
UNUSED(y);
|
||||
}
|
||||
#endif // __riscv
|
||||
{
|
||||
size_t x = (size_t) 0 - 1;
|
||||
size_t y = upx::atomic_exchange(&x, (size_t) 2);
|
||||
CHECK_EQ(x, 2);
|
||||
CHECK_EQ(y, (size_t) 0 - 1);
|
||||
UNUSED(y);
|
||||
}
|
||||
{
|
||||
const int buf[2] = {101, 202};
|
||||
@ -297,6 +306,7 @@ TEST_CASE("upx::atomic_exchange") {
|
||||
p = upx::atomic_exchange(&ptr_array[1], p);
|
||||
CHECK_EQ(p, buf + 1);
|
||||
assert_noexcept(*ptr_array[0] == 202 && *ptr_array[1] == 101);
|
||||
UNUSED(p);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -206,16 +206,20 @@ template <class T>
|
||||
forceinline T atomic_exchange(T *ptr, T new_value) noexcept {
|
||||
static_assert(std::is_standard_layout_v<T>);
|
||||
static_assert(std::is_trivially_copyable_v<T>);
|
||||
#if !(WITH_THREADS)
|
||||
T old_value = *ptr;
|
||||
*ptr = new_value;
|
||||
return old_value;
|
||||
#else
|
||||
static_assert(sizeof(T) <= sizeof(void *)); // UPX convention: restrict to fundamental types
|
||||
static_assert(alignof(T) == sizeof(T)); // UPX convention: require proper alignment
|
||||
#if __has_builtin(__atomic_exchange_n) && defined(__ATOMIC_SEQ_CST)
|
||||
return __atomic_exchange_n(ptr, new_value, __ATOMIC_SEQ_CST);
|
||||
#elif __has_builtin(__sync_swap)
|
||||
return __sync_swap(ptr, new_value);
|
||||
#elif WITH_THREADS
|
||||
return std::atomic_exchange(ptr_std_atomic_cast(ptr), new_value);
|
||||
#else
|
||||
T old_value = *ptr;
|
||||
*ptr = new_value;
|
||||
return old_value;
|
||||
return std::atomic_exchange(ptr_std_atomic_cast(ptr), new_value);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user