mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-04 15:40:44 +00:00
ead8e4c081
[libc++][NFC] Rewrite function call on two lines for clarity (#79141) Previously, there was a ternary conditional with a less-than comparison appearing inside a template argument, which was really confusing because of the <...> of the function template. This patch rewrites the same statement on two lines for clarity. Merge commit d129ea8d2fa3 from llvm-project (by Vitaly Buka): [libcxx] Align `__recommend() + 1` by __endian_factor (#90292) This is detected by asan after #83774 Allocation size will be divided by `__endian_factor` before storing. If it's not aligned, we will not be able to recover allocation size to pass into `__alloc_traits::deallocate`. we have code like this ``` auto __allocation = std::__allocate_at_least(__alloc(), __recommend(__sz) + 1); __p = __allocation.ptr; __set_long_cap(__allocation.count); void __set_long_cap(size_type __s) _NOEXCEPT { __r_.first().__l.__cap_ = __s / __endian_factor; __r_.first().__l.__is_long_ = true; } size_type __get_long_cap() const _NOEXCEPT { return __r_.first().__l.__cap_ * __endian_factor; } inline ~basic_string() { __annotate_delete(); if (__is_long()) __alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap()); } ``` 1. __recommend() -> even size 2. `std::__allocate_at_least(__alloc(), __recommend(__sz) + 1)` - > not even size 3. ` __set_long_cap() `- > lose one bit of size for __endian_factor == 2 (see `/ __endian_factor`) 4. `__alloc_traits::deallocate(__alloc(), __get_long_pointer(), __get_long_cap())` -> uses even size (see `__get_long_cap`) This should fix incorrect deallocation sizes for some instances of std::string. Memory profiling or debugging tools like AddressSanitizer, LeakSanitizer or TCMalloc could then complain about the the size passed to a deallocation not matching the size originally passed to the allocation. Reported by: Aliaksei Kandratsenka <alkondratenko@gmail.com> PR: 279560 MFC after: 3 days |
||
---|---|---|
.. | ||
arm-optimized-routines | ||
atf | ||
bc | ||
bearssl | ||
bionic-x86_64-string | ||
blocklist | ||
bmake | ||
bsddialog | ||
bsnmp | ||
byacc | ||
bzip2 | ||
capsicum-test | ||
com_err | ||
cortex-strings | ||
dialog | ||
diff | ||
dma | ||
ee | ||
elftoolchain | ||
expat | ||
file | ||
flex | ||
gdtoa | ||
googletest | ||
hyperv/tools | ||
jemalloc | ||
kyua | ||
ldns | ||
ldns-host | ||
less | ||
lib9p | ||
libarchive | ||
libbegemot | ||
libc-pwcache | ||
libc-vis | ||
libcbor | ||
libcxxrt | ||
libdiff | ||
libdivsufsort | ||
libedit | ||
libevent | ||
libexecinfo | ||
libfido2 | ||
libpcap | ||
libucl | ||
libxo | ||
llvm-project | ||
lua | ||
lutok | ||
mandoc | ||
mknod | ||
mtree | ||
ncurses | ||
netbsd-tests | ||
netcat | ||
ntp | ||
nvi | ||
ofed | ||
one-true-awk | ||
openbsm | ||
opencsd/decoder | ||
openpam | ||
openresolv | ||
pam_modules/pam_passwdqc | ||
pf | ||
pjdfstest | ||
pnglite | ||
pnpinfo | ||
processor-trace | ||
sendmail | ||
smbfs | ||
spleen | ||
sqlite3 | ||
tcp_wrappers | ||
tcpdump | ||
tcsh | ||
telnet | ||
terminus | ||
tnftp | ||
tzcode | ||
tzdata | ||
unbound | ||
unifdef | ||
unvis | ||
vis | ||
wireguard-tools | ||
wpa | ||
xz |