mirror of
https://github.com/postgres/postgres.git
synced 2026-03-10 02:01:23 -04:00
wcsrtombs (called through wchar2char from common functions like lower, upper, etc.) uses various optimizations that may look like access to uninitialized data, triggering valgrind reports. For example AVX2 instructions load data in 256-bit chunks, and gconv does something similar with 32-bit chunks. This is faster than accessing the bytes one by one, and the uninitialized part of the buffer is not actually used. So suppress the bogus reports. The exact stack depends on possible optimizations - it might be AVX, SSE (as in the report by Aleksander Alekseev) or something else. Hence the last frame is wildcarded, to deal with this. Backpatch all the way back to 9.4. Author: Tomas Vondra Discussion: https://www.postgresql.org/message-id/flat/90ac0452-e907-e7a4-b3c8-15bd33780e62%402ndquadrant.com Discussion: https://www.postgresql.org/message-id/20180220150838.GD18315@e733.localdomain
250 lines
4.7 KiB
Text
250 lines
4.7 KiB
Text
# This is a suppression file for use with Valgrind tools. File format
|
|
# documentation:
|
|
# http://valgrind.org/docs/manual/mc-manual.html#mc-manual.suppfiles
|
|
|
|
# The libc symbol that implements a particular standard interface is
|
|
# implementation-dependent. For example, strncpy() shows up as "__GI_strncpy"
|
|
# on some platforms. Use wildcards to avoid mentioning such specific names.
|
|
# Avoid mentioning functions that are good candidates for inlining,
|
|
# particularly single-caller static functions. Suppressions mentioning them
|
|
# would be ineffective at higher optimization levels.
|
|
|
|
|
|
# We have occasion to write raw binary structures to disk or to the network.
|
|
# These may contain uninitialized padding bytes. Since recipients also ignore
|
|
# those bytes as padding, this is harmless.
|
|
|
|
{
|
|
padding_pgstat_send
|
|
Memcheck:Param
|
|
socketcall.send(msg)
|
|
|
|
fun:*send*
|
|
fun:pgstat_send
|
|
}
|
|
|
|
{
|
|
padding_pgstat_sendto
|
|
Memcheck:Param
|
|
socketcall.sendto(msg)
|
|
|
|
fun:*send*
|
|
fun:pgstat_send
|
|
}
|
|
|
|
{
|
|
padding_pgstat_write
|
|
Memcheck:Param
|
|
write(buf)
|
|
|
|
...
|
|
fun:pgstat_write_statsfiles
|
|
}
|
|
|
|
{
|
|
padding_XLogRecData_CRC
|
|
Memcheck:Value8
|
|
|
|
fun:pg_comp_crc32c
|
|
fun:XLogRecordAssemble
|
|
}
|
|
|
|
{
|
|
padding_XLogRecData_write
|
|
Memcheck:Param
|
|
pwrite64(buf)
|
|
|
|
...
|
|
fun:XLogWrite
|
|
}
|
|
|
|
{
|
|
padding_relcache
|
|
Memcheck:Param
|
|
write(buf)
|
|
|
|
...
|
|
fun:write_relcache_init_file
|
|
}
|
|
|
|
{
|
|
padding_reorderbuffer_serialize
|
|
Memcheck:Param
|
|
write(buf)
|
|
|
|
...
|
|
fun:ReorderBufferSerializeTXN
|
|
}
|
|
|
|
{
|
|
padding_twophase_prepare
|
|
Memcheck:Param
|
|
write(buf)
|
|
|
|
...
|
|
fun:EndPrepare
|
|
}
|
|
|
|
|
|
{
|
|
padding_twophase_CRC
|
|
Memcheck:Value8
|
|
fun:pg_comp_crc32c
|
|
fun:EndPrepare
|
|
}
|
|
|
|
{
|
|
padding_bootstrap_initial_xlog_write
|
|
Memcheck:Param
|
|
write(buf)
|
|
|
|
...
|
|
fun:BootStrapXLOG
|
|
}
|
|
|
|
{
|
|
padding_bootstrap_control_file_write
|
|
Memcheck:Param
|
|
write(buf)
|
|
|
|
...
|
|
fun:WriteControlFile
|
|
fun:BootStrapXLOG
|
|
}
|
|
|
|
{
|
|
bootstrap_write_relmap_overlap
|
|
Memcheck:Overlap
|
|
fun:memcpy*
|
|
fun:write_relmap_file
|
|
fun:RelationMapFinishBootstrap
|
|
}
|
|
|
|
|
|
# gcc on ppc64 can generate a four-byte read to fetch the final "char" fields
|
|
# of a FormData_pg_cast. This is valid compiler behavior, because a proper
|
|
# FormData_pg_cast has trailing padding. Tuples we treat as structures omit
|
|
# that padding, so Valgrind reports an invalid read. Practical trouble would
|
|
# entail the missing pad bytes falling in a different memory page. So long as
|
|
# the structure is aligned, that will not happen.
|
|
{
|
|
overread_tuplestruct_pg_cast
|
|
Memcheck:Addr4
|
|
|
|
fun:IsBinaryCoercible
|
|
}
|
|
|
|
# Atomic writes to 64bit atomic vars uses compare/exchange to
|
|
# guarantee atomic writes of 64bit variables. pg_atomic_write is used
|
|
# during initialization of the atomic variable; that leads to an
|
|
# initial read of the old, undefined, memory value. But that's just to
|
|
# make sure the swap works correctly.
|
|
{
|
|
uninitialized_atomic_init_u64
|
|
Memcheck:Cond
|
|
fun:pg_atomic_exchange_u64_impl
|
|
fun:pg_atomic_write_u64_impl
|
|
fun:pg_atomic_init_u64_impl
|
|
}
|
|
|
|
|
|
# Python's allocator does some low-level tricks for efficiency. Those
|
|
# can be disabled for better instrumentation; but few people testing
|
|
# postgres will have such a build of python. So add broad
|
|
# suppressions of the resulting errors.
|
|
# See also https://svn.python.org/projects/python/trunk/Misc/README.valgrind
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Addr4
|
|
fun:PyObject_Free
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Addr8
|
|
fun:PyObject_Free
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Value4
|
|
fun:PyObject_Free
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Value8
|
|
fun:PyObject_Free
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Cond
|
|
fun:PyObject_Free
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Addr4
|
|
fun:PyObject_Realloc
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Addr8
|
|
fun:PyObject_Realloc
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Value4
|
|
fun:PyObject_Realloc
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Value8
|
|
fun:PyObject_Realloc
|
|
}
|
|
|
|
{
|
|
python_clever_allocator
|
|
Memcheck:Cond
|
|
fun:PyObject_Realloc
|
|
}
|
|
|
|
# wcsrtombs uses some clever optimizations internally, which to valgrind
|
|
# may look like access to uninitialized data. For example AVX2 instructions
|
|
# load data in 256-bit chunks, irrespectedly of wchar length. gconv does
|
|
# somethink similar by loading data in 32bit chunks and then shifting the
|
|
# data internally. Neither of those actually uses the uninitialized part
|
|
# of the buffer, as far as we know.
|
|
#
|
|
# https://www.postgresql.org/message-id/90ac0452-e907-e7a4-b3c8-15bd33780e62@2ndquadrant.com
|
|
|
|
{
|
|
wcsnlen_optimized
|
|
Memcheck:Cond
|
|
...
|
|
fun:wcsrtombs
|
|
fun:wcstombs
|
|
fun:wchar2char
|
|
}
|
|
|
|
{
|
|
wcsnlen_optimized_addr32
|
|
Memcheck:Addr32
|
|
...
|
|
fun:wcsrtombs
|
|
fun:wcstombs
|
|
fun:wchar2char
|
|
}
|
|
|
|
{
|
|
gconv_transform_internal
|
|
Memcheck:Cond
|
|
fun:__gconv_transform_internal_utf8
|
|
fun:wcsrtombs
|
|
fun:wcstombs
|
|
fun:wchar2char
|
|
}
|