mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
MDEV-11349 (2/2) Fix some bogus-looking Valgrind warnings
buf_block_init(): Initialize buf_page_t::flush_type. For some reason, Valgrind 3.12.0 would seem to flag some bits in adjacent bitfields as uninitialized, even though only the two bits of flush_type were left uninitialized. Initialize the field to get rid of many warnings. buf_page_init_low(): Initialize buf_page_t::old. For some reason, Valgrind 3.12.0 would seem to flag all 32 bits uninitialized when buf_page_init_for_read() invokes buf_LRU_add_block(bpage, TRUE). This would trigger bogus warnings for buf_page_t::freed_page_clock being uninitialized. (The V-bits would later claim that only "old" is initialized in the 32-bit word.) Perhaps recent compilers (GCC 6.2.1 and clang 4.0.0) generate more optimized x86_64 code for bitfield operations, confusing Valgrind? mach_write_to_1(), mach_write_to_2(), mach_write_to_3(): Rewrite the assertions that ensure that the most significant bits are zero. Apparently, clang 4.0.0 would optimize expressions of the form ((n | 0xFF) <= 0x100) to (n <= 0x100). The redundant 0xFF was added in the first place in order to suppress a Valgrind warning. (Valgrind would warn about comparing uninitialized values even in the case when the uninitialized bits do not affect the result of the comparison.)
This commit is contained in:
@@ -1124,6 +1124,7 @@ buf_block_init(
|
||||
block->frame = frame;
|
||||
|
||||
block->page.buf_pool_index = buf_pool_index(buf_pool);
|
||||
block->page.flush_type = BUF_FLUSH_LRU;
|
||||
block->page.state = BUF_BLOCK_NOT_USED;
|
||||
block->page.buf_fix_count = 0;
|
||||
block->page.io_fix = BUF_IO_NONE;
|
||||
@@ -3784,6 +3785,7 @@ buf_page_init_low(
|
||||
bpage->flush_type = BUF_FLUSH_LRU;
|
||||
bpage->io_fix = BUF_IO_NONE;
|
||||
bpage->buf_fix_count = 0;
|
||||
bpage->old = 0;
|
||||
bpage->freed_page_clock = 0;
|
||||
bpage->access_time = 0;
|
||||
bpage->newest_modification = 0;
|
||||
|
@@ -38,7 +38,7 @@ mach_write_to_1(
|
||||
ulint n) /*!< in: ulint integer to be stored, >= 0, < 256 */
|
||||
{
|
||||
ut_ad(b);
|
||||
ut_ad((n | 0xFFUL) <= 0xFFUL);
|
||||
ut_ad((n & ~0xFFUL) == 0);
|
||||
|
||||
b[0] = (byte) n;
|
||||
}
|
||||
@@ -68,7 +68,7 @@ mach_write_to_2(
|
||||
ulint n) /*!< in: ulint integer to be stored */
|
||||
{
|
||||
ut_ad(b);
|
||||
ut_ad((n | 0xFFFFUL) <= 0xFFFFUL);
|
||||
ut_ad((n & ~0xFFFFUL) == 0);
|
||||
|
||||
b[0] = (byte)(n >> 8);
|
||||
b[1] = (byte)(n);
|
||||
@@ -131,7 +131,7 @@ mach_write_to_3(
|
||||
ulint n) /*!< in: ulint integer to be stored */
|
||||
{
|
||||
ut_ad(b);
|
||||
ut_ad((n | 0xFFFFFFUL) <= 0xFFFFFFUL);
|
||||
ut_ad((n & ~0xFFFFFFUL) == 0);
|
||||
|
||||
b[0] = (byte)(n >> 16);
|
||||
b[1] = (byte)(n >> 8);
|
||||
|
@@ -1189,6 +1189,7 @@ buf_block_init(
|
||||
block->frame = frame;
|
||||
|
||||
block->page.buf_pool_index = buf_pool_index(buf_pool);
|
||||
block->page.flush_type = BUF_FLUSH_LRU;
|
||||
block->page.state = BUF_BLOCK_NOT_USED;
|
||||
block->page.buf_fix_count = 0;
|
||||
block->page.io_fix = BUF_IO_NONE;
|
||||
|
@@ -38,7 +38,7 @@ mach_write_to_1(
|
||||
ulint n) /*!< in: ulint integer to be stored, >= 0, < 256 */
|
||||
{
|
||||
ut_ad(b);
|
||||
ut_ad((n | 0xFFUL) <= 0xFFUL);
|
||||
ut_ad((n & ~0xFFUL) == 0);
|
||||
|
||||
b[0] = (byte) n;
|
||||
}
|
||||
@@ -67,7 +67,7 @@ mach_write_to_2(
|
||||
ulint n) /*!< in: ulint integer to be stored */
|
||||
{
|
||||
ut_ad(b);
|
||||
ut_ad((n | 0xFFFFUL) <= 0xFFFFUL);
|
||||
ut_ad((n & ~0xFFFFUL) == 0);
|
||||
|
||||
b[0] = (byte)(n >> 8);
|
||||
b[1] = (byte)(n);
|
||||
@@ -115,7 +115,7 @@ mach_write_to_3(
|
||||
ulint n) /*!< in: ulint integer to be stored */
|
||||
{
|
||||
ut_ad(b);
|
||||
ut_ad((n | 0xFFFFFFUL) <= 0xFFFFFFUL);
|
||||
ut_ad((n & ~0xFFFFFFUL) == 0);
|
||||
|
||||
b[0] = (byte)(n >> 16);
|
||||
b[1] = (byte)(n >> 8);
|
||||
|
Reference in New Issue
Block a user