/* Self tests for simple_search_memory for GDB, the GNU debugger. Copyright (C) 2020-2021 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "gdbsupport/common-defs.h" #include "gdbsupport/selftest.h" #include "gdbsupport/search.h" namespace selftests { namespace search_memory_tests { static void run_tests () { size_t size = 2 * SEARCH_CHUNK_SIZE + 1; std::vector data (size); data[size - 1] = 'x'; bool read_fully = false; bool read_off_end = false; auto read_memory = [&] (CORE_ADDR from, gdb_byte *out, size_t len) { if (from + len > data.size ()) read_off_end = true; else memcpy (out, &data[from], len); if (from + len == data.size ()) read_fully = true; return true; }; gdb_byte pattern = 'x'; CORE_ADDR addr = 0; int result = simple_search_memory (read_memory, 0, data.size (), &pattern, 1, &addr); /* In this case we don't care if read_fully was set or not. */ SELF_CHECK (result == 1); SELF_CHECK (!read_off_end); SELF_CHECK (addr == size - 1); addr = 0; read_fully = false; read_off_end = false; pattern = 'q'; result = simple_search_memory (read_memory, 0, data.size (), &pattern, 1, &addr); SELF_CHECK (result == 0); SELF_CHECK (!read_off_end); SELF_CHECK (read_fully); SELF_CHECK (addr == 0); /* Setup from PR gdb/17756. */ size = 0x7bb00; data = std::vector (size); const CORE_ADDR base_addr = 0x08370000; const gdb_byte wpattern[] = { 0x90, 0x8b, 0x98, 0x8 }; const CORE_ADDR found_addr = 0x837bac8; memcpy (&data[found_addr - base_addr], wpattern, sizeof (wpattern)); auto read_memory_2 = [&] (CORE_ADDR from, gdb_byte *out, size_t len) { memcpy (out, &data[from - base_addr], len); return true; }; result = simple_search_memory (read_memory_2, base_addr, data.size (), wpattern, sizeof (wpattern), &addr); SELF_CHECK (result == 1); SELF_CHECK (addr == found_addr); } } /* namespace search_memory_tests */ } /* namespace selftests */ void _initialize_search_memory_selftests (); void _initialize_search_memory_selftests () { selftests::register_test ("search_memory", selftests::search_memory_tests::run_tests); }