diff options
author | Vitaly Buka <vitalybuka@google.com> | 2021-05-07 00:06:50 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-05-07 00:06:50 +0000 |
commit | b5df1b86d8bba93b80b758e1de97073316d79ad6 (patch) | |
tree | 0edc2169a2d2ee6d2fa60cd4f576c83f3195a1b5 | |
parent | 57cea954349f50f25c5b0b579ab8c8263848d7f6 (diff) | |
parent | 2e1a268b35d51aed21184f85c6a57672bb306f49 (diff) | |
download | scudo-b5df1b86d8bba93b80b758e1de97073316d79ad6.tar.gz |
[scudo] Use require_constant_initialization am: 71df78e116 am: 6768e45c6c am: e1cb3791a2 am: 2e1a268b35
Original change: https://android-review.googlesource.com/c/platform/external/scudo/+/1698909
Change-Id: I3b307a687ce9780be240c434e7134728056db805
-rw-r--r-- | standalone/combined.h | 6 | ||||
-rw-r--r-- | standalone/internal_defs.h | 9 | ||||
-rw-r--r-- | standalone/list.h | 6 | ||||
-rw-r--r-- | standalone/local_cache.h | 4 | ||||
-rw-r--r-- | standalone/mutex.h | 4 | ||||
-rw-r--r-- | standalone/options.h | 3 | ||||
-rw-r--r-- | standalone/primary32.h | 10 | ||||
-rw-r--r-- | standalone/primary64.h | 24 | ||||
-rw-r--r-- | standalone/quarantine.h | 8 | ||||
-rw-r--r-- | standalone/secondary.h | 30 | ||||
-rw-r--r-- | standalone/stack_depot.h | 6 | ||||
-rw-r--r-- | standalone/stats.h | 6 | ||||
-rw-r--r-- | standalone/tsd.h | 4 | ||||
-rw-r--r-- | standalone/tsd_exclusive.h | 6 | ||||
-rw-r--r-- | standalone/wrappers_c.cpp | 1 | ||||
-rw-r--r-- | standalone/wrappers_c_bionic.cpp | 2 |
16 files changed, 70 insertions, 59 deletions
diff --git a/standalone/combined.h b/standalone/combined.h index 33ae6c42eca..146408a26bf 100644 --- a/standalone/combined.h +++ b/standalone/combined.h @@ -944,8 +944,8 @@ private: static const sptr MemTagAllocationTraceIndex = -2; static const sptr MemTagAllocationTidIndex = -1; - u32 Cookie; - u32 QuarantineMaxChunkSize; + u32 Cookie = 0; + u32 QuarantineMaxChunkSize = 0; GlobalStats Stats; PrimaryT Primary; @@ -977,7 +977,7 @@ private: #endif Entry Entries[NumEntries]; }; - AllocationRingBuffer RingBuffer; + AllocationRingBuffer RingBuffer = {}; // The following might get optimized out by the compiler. NOINLINE void performSanityChecks() { diff --git a/standalone/internal_defs.h b/standalone/internal_defs.h index e12a5804bac..bb377e700d2 100644 --- a/standalone/internal_defs.h +++ b/standalone/internal_defs.h @@ -48,6 +48,15 @@ #define USED __attribute__((used)) #define NOEXCEPT noexcept +#if defined(__has_attribute) +#if __has_attribute(require_constant_initialization) +#define SCUDO_REQUIRE_CONSTANT_INITIALIZATION \ + __attribute__((__require_constant_initialization__)) +#else +#define SCUDO_REQUIRE_CONSTANT_INITIALIZATION +#endif +#endif + namespace scudo { typedef unsigned long uptr; diff --git a/standalone/list.h b/standalone/list.h index c3b898a328c..1ac93c2f65d 100644 --- a/standalone/list.h +++ b/standalone/list.h @@ -57,9 +57,9 @@ template <class T> struct IntrusiveList { void checkConsistency() const; protected: - uptr Size; - T *First; - T *Last; + uptr Size = 0; + T *First = nullptr; + T *Last = nullptr; }; template <class T> void IntrusiveList<T>::checkConsistency() const { diff --git a/standalone/local_cache.h b/standalone/local_cache.h index 509221f4d61..43cbc68ead3 100644 --- a/standalone/local_cache.h +++ b/standalone/local_cache.h @@ -138,9 +138,9 @@ private: uptr ClassSize; CompactPtrT Chunks[2 * TransferBatch::MaxNumCached]; }; - PerClass PerClassArray[NumClasses]; + PerClass PerClassArray[NumClasses] = {}; LocalStats Stats; - SizeClassAllocator *Allocator; + SizeClassAllocator *Allocator = nullptr; ALWAYS_INLINE void initCacheMaybe(PerClass *C) { if (LIKELY(C->MaxCount)) diff --git a/standalone/mutex.h b/standalone/mutex.h index d6e6a5b33aa..a654d35c5a7 100644 --- a/standalone/mutex.h +++ b/standalone/mutex.h @@ -48,9 +48,9 @@ private: static constexpr u8 NumberOfYields = 8U; #if SCUDO_LINUX - atomic_u32 M; + atomic_u32 M = {}; #elif SCUDO_FUCHSIA - sync_mutex_t M; + sync_mutex_t M = {}; #endif void lockSlow(); diff --git a/standalone/options.h b/standalone/options.h index d0277aaa687..4e678651333 100644 --- a/standalone/options.h +++ b/standalone/options.h @@ -44,9 +44,8 @@ template <typename Config> bool useMemoryTagging(Options Options) { } struct AtomicOptions { - atomic_u32 Val; + atomic_u32 Val = {}; -public: Options load() const { return Options{atomic_load_relaxed(&Val)}; } void clear(OptionBit Opt) { diff --git a/standalone/primary32.h b/standalone/primary32.h index 5b62c15b22b..33d81754fb5 100644 --- a/standalone/primary32.h +++ b/standalone/primary32.h @@ -489,17 +489,17 @@ private: return TotalReleasedBytes; } - SizeClassInfo SizeClassInfoArray[NumClasses]; + SizeClassInfo SizeClassInfoArray[NumClasses] = {}; // Track the regions in use, 0 is unused, otherwise store ClassId + 1. - ByteMap PossibleRegions; - atomic_s32 ReleaseToOsIntervalMs; + ByteMap PossibleRegions = {}; + atomic_s32 ReleaseToOsIntervalMs = {}; // Unless several threads request regions simultaneously from different size // classes, the stash rarely contains more than 1 entry. static constexpr uptr MaxStashedRegions = 4; HybridMutex RegionsStashMutex; - uptr NumberOfStashedRegions; - uptr RegionsStash[MaxStashedRegions]; + uptr NumberOfStashedRegions = 0; + uptr RegionsStash[MaxStashedRegions] = {}; }; } // namespace scudo diff --git a/standalone/primary64.h b/standalone/primary64.h index b1a3ebf82b8..94375fceee1 100644 --- a/standalone/primary64.h +++ b/standalone/primary64.h @@ -285,24 +285,24 @@ private: struct UnpaddedRegionInfo { HybridMutex Mutex; SinglyLinkedList<TransferBatch> FreeList; - uptr RegionBeg; - RegionStats Stats; - u32 RandState; - uptr MappedUser; // Bytes mapped for user memory. - uptr AllocatedUser; // Bytes allocated for user memory. - MapPlatformData Data; - ReleaseToOsInfo ReleaseInfo; - bool Exhausted; + uptr RegionBeg = 0; + RegionStats Stats = {}; + u32 RandState = 0; + uptr MappedUser = 0; // Bytes mapped for user memory. + uptr AllocatedUser = 0; // Bytes allocated for user memory. + MapPlatformData Data = {}; + ReleaseToOsInfo ReleaseInfo = {}; + bool Exhausted = false; }; struct RegionInfo : UnpaddedRegionInfo { char Padding[SCUDO_CACHE_LINE_SIZE - - (sizeof(UnpaddedRegionInfo) % SCUDO_CACHE_LINE_SIZE)]; + (sizeof(UnpaddedRegionInfo) % SCUDO_CACHE_LINE_SIZE)] = {}; }; static_assert(sizeof(RegionInfo) % SCUDO_CACHE_LINE_SIZE == 0, ""); - uptr PrimaryBase; - MapPlatformData Data; - atomic_s32 ReleaseToOsIntervalMs; + uptr PrimaryBase = 0; + MapPlatformData Data = {}; + atomic_s32 ReleaseToOsIntervalMs = {}; alignas(SCUDO_CACHE_LINE_SIZE) RegionInfo RegionInfoArray[NumClasses]; RegionInfo *getRegionInfo(uptr ClassId) { diff --git a/standalone/quarantine.h b/standalone/quarantine.h index 27aa4bfec91..8d4b38e21fc 100644 --- a/standalone/quarantine.h +++ b/standalone/quarantine.h @@ -161,7 +161,7 @@ public: private: SinglyLinkedList<QuarantineBatch> List; - atomic_uptr Size; + atomic_uptr Size = {}; void addToSize(uptr add) { atomic_store_relaxed(&Size, getSize() + add); } void subFromSize(uptr sub) { atomic_store_relaxed(&Size, getSize() - sub); } @@ -246,9 +246,9 @@ private: alignas(SCUDO_CACHE_LINE_SIZE) HybridMutex CacheMutex; CacheT Cache; alignas(SCUDO_CACHE_LINE_SIZE) HybridMutex RecycleMutex; - atomic_uptr MinSize; - atomic_uptr MaxSize; - alignas(SCUDO_CACHE_LINE_SIZE) atomic_uptr MaxCacheSize; + atomic_uptr MinSize = {}; + atomic_uptr MaxSize = {}; + alignas(SCUDO_CACHE_LINE_SIZE) atomic_uptr MaxCacheSize = {}; void NOINLINE recycle(uptr MinSize, Callback Cb) { CacheT Tmp; diff --git a/standalone/secondary.h b/standalone/secondary.h index 03ac68cc02d..540f6b63c36 100644 --- a/standalone/secondary.h +++ b/standalone/secondary.h @@ -377,16 +377,16 @@ private: } HybridMutex Mutex; - u32 EntriesCount; - u32 QuarantinePos; - atomic_u32 MaxEntriesCount; - atomic_uptr MaxEntrySize; - u64 OldestTime; - u32 IsFullEvents; - atomic_s32 ReleaseToOsIntervalMs; - - CachedBlock Entries[Config::SecondaryCacheEntriesArraySize]; - CachedBlock Quarantine[Config::SecondaryCacheQuarantineSize]; + u32 EntriesCount = 0; + u32 QuarantinePos = 0; + atomic_u32 MaxEntriesCount = {}; + atomic_uptr MaxEntrySize = {}; + u64 OldestTime = 0; + u32 IsFullEvents = 0; + atomic_s32 ReleaseToOsIntervalMs = {}; + + CachedBlock Entries[Config::SecondaryCacheEntriesArraySize] = {}; + CachedBlock Quarantine[Config::SecondaryCacheQuarantineSize] = {}; }; template <typename Config> class MapAllocator { @@ -451,11 +451,11 @@ private: HybridMutex Mutex; DoublyLinkedList<LargeBlock::Header> InUseBlocks; - uptr AllocatedBytes; - uptr FreedBytes; - uptr LargestSize; - u32 NumberOfAllocs; - u32 NumberOfFrees; + uptr AllocatedBytes = 0; + uptr FreedBytes = 0; + uptr LargestSize = 0; + u32 NumberOfAllocs = 0; + u32 NumberOfFrees = 0; LocalStats Stats; }; diff --git a/standalone/stack_depot.h b/standalone/stack_depot.h index 7968f7efff7..458198fcb7a 100644 --- a/standalone/stack_depot.h +++ b/standalone/stack_depot.h @@ -40,7 +40,7 @@ public: class StackDepot { HybridMutex RingEndMu; - u32 RingEnd; + u32 RingEnd = 0; // This data structure stores a stack trace for each allocation and // deallocation when stack trace recording is enabled, that may be looked up @@ -70,7 +70,7 @@ class StackDepot { #endif static const uptr TabSize = 1 << TabBits; static const uptr TabMask = TabSize - 1; - atomic_u32 Tab[TabSize]; + atomic_u32 Tab[TabSize] = {}; #ifdef SCUDO_FUZZ static const uptr RingBits = 4; @@ -79,7 +79,7 @@ class StackDepot { #endif static const uptr RingSize = 1 << RingBits; static const uptr RingMask = RingSize - 1; - atomic_u64 Ring[RingSize]; + atomic_u64 Ring[RingSize] = {}; public: // Insert hash of the stack trace [Begin, End) into the stack depot, and diff --git a/standalone/stats.h b/standalone/stats.h index d76b904949e..b64a9926361 100644 --- a/standalone/stats.h +++ b/standalone/stats.h @@ -46,11 +46,11 @@ public: uptr get(StatType I) const { return atomic_load_relaxed(&StatsArray[I]); } - LocalStats *Next; - LocalStats *Prev; + LocalStats *Next = nullptr; + LocalStats *Prev = nullptr; private: - atomic_uptr StatsArray[StatCount]; + atomic_uptr StatsArray[StatCount] = {}; }; // Global stats, used for aggregation and querying. diff --git a/standalone/tsd.h b/standalone/tsd.h index b3701c63f8a..a6e669b66e6 100644 --- a/standalone/tsd.h +++ b/standalone/tsd.h @@ -26,7 +26,7 @@ namespace scudo { template <class Allocator> struct alignas(SCUDO_CACHE_LINE_SIZE) TSD { typename Allocator::CacheT Cache; typename Allocator::QuarantineCacheT QuarantineCache; - u8 DestructorIterations; + u8 DestructorIterations = 0; void initLinkerInitialized(Allocator *Instance) { Instance->initCache(&Cache); @@ -59,7 +59,7 @@ template <class Allocator> struct alignas(SCUDO_CACHE_LINE_SIZE) TSD { private: HybridMutex Mutex; - atomic_uptr Precedence; + atomic_uptr Precedence = {}; }; } // namespace scudo diff --git a/standalone/tsd_exclusive.h b/standalone/tsd_exclusive.h index 04850405959..a907ed4684a 100644 --- a/standalone/tsd_exclusive.h +++ b/standalone/tsd_exclusive.h @@ -108,9 +108,9 @@ private: Instance->callPostInitCallback(); } - pthread_key_t PThreadKey; - bool Initialized; - atomic_u8 Disabled; + pthread_key_t PThreadKey = {}; + bool Initialized = false; + atomic_u8 Disabled = {}; TSD<Allocator> FallbackTSD; HybridMutex Mutex; static thread_local ThreadState State; diff --git a/standalone/wrappers_c.cpp b/standalone/wrappers_c.cpp index 098cc089a1c..81c7dd60ee3 100644 --- a/standalone/wrappers_c.cpp +++ b/standalone/wrappers_c.cpp @@ -26,6 +26,7 @@ extern "C" void SCUDO_PREFIX(malloc_postinit)(); // Export the static allocator so that the C++ wrappers can access it. // Technically we could have a completely separated heap for C & C++ but in // reality the amount of cross pollination between the two is staggering. +SCUDO_REQUIRE_CONSTANT_INITIALIZATION scudo::Allocator<scudo::Config, SCUDO_PREFIX(malloc_postinit)> SCUDO_ALLOCATOR; #include "wrappers_c.inc" diff --git a/standalone/wrappers_c_bionic.cpp b/standalone/wrappers_c_bionic.cpp index 75ef22a16e1..18c3bf2c0ed 100644 --- a/standalone/wrappers_c_bionic.cpp +++ b/standalone/wrappers_c_bionic.cpp @@ -23,6 +23,7 @@ #define SCUDO_ALLOCATOR Allocator extern "C" void SCUDO_PREFIX(malloc_postinit)(); +SCUDO_REQUIRE_CONSTANT_INITIALIZATION static scudo::Allocator<scudo::AndroidConfig, SCUDO_PREFIX(malloc_postinit)> SCUDO_ALLOCATOR; @@ -36,6 +37,7 @@ static scudo::Allocator<scudo::AndroidConfig, SCUDO_PREFIX(malloc_postinit)> #define SCUDO_ALLOCATOR SvelteAllocator extern "C" void SCUDO_PREFIX(malloc_postinit)(); +SCUDO_REQUIRE_CONSTANT_INITIALIZATION static scudo::Allocator<scudo::AndroidSvelteConfig, SCUDO_PREFIX(malloc_postinit)> SCUDO_ALLOCATOR; |