diff options
author | Yao Qi <yao.qi@linaro.org> | 2016-10-25 11:13:00 +0100 |
---|---|---|
committer | Yao Qi <yao.qi@linaro.org> | 2016-10-25 11:13:00 +0100 |
commit | 3ef9d661f45abfaca5d0c0bb2ea9ab60470f1bb7 (patch) | |
tree | 4c661195a8a5c9dae72ef4fae68778f5fd8a342b /gdb/common | |
parent | a18a2a347dd85e93d1083c984deffdc0dacf1bd6 (diff) | |
download | gdb-3ef9d661f45abfaca5d0c0bb2ea9ab60470f1bb7.zip gdb-3ef9d661f45abfaca5d0c0bb2ea9ab60470f1bb7.tar.gz gdb-3ef9d661f45abfaca5d0c0bb2ea9ab60470f1bb7.tar.bz2 |
Don't override operator new if GDB is built with -fsanitize=address
Nowadays, if we build GDB with -fsanitize=address, we can get the asan
error below,
(gdb) quit
=================================================================
==9723==ERROR: AddressSanitizer: alloc-dealloc-mismatch (malloc vs operator delete) on 0x60200003bf70
#0 0x7f88f3837527 in operator delete(void*) (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x55527)
#1 0xac8e13 in __gnu_cxx::new_allocator<void (*)()>::deallocate(void (**)(), unsigned long) /usr/include/c++/4.9/ext/new_allocator.h:110
#2 0xac8cc2 in __gnu_cxx::__alloc_traits<std::allocator<void (*)()> >::deallocate(std::allocator<void (*)()>&, void (**)(), unsigned long) /usr/include/c++/4.9/ext/alloc_traits.h:185
....
0x60200003bf70 is located 0 bytes inside of 8-byte region [0x60200003bf70,0x60200003bf78)
allocated by thread T0 here:
#0 0x7f88f38367ef in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.1+0x547ef)
#1 0xbd2762 in operator new(unsigned long) /home/yao/SourceCode/gnu/gdb/git/gdb/common/new-op.c:42
#2 0xac8edc in __gnu_cxx::new_allocator<void (*)()>::allocate(unsigned long, void const*) /usr/include/c++/4.9/ext/new_allocator.h:104
#3 0xac8d81 in __gnu_cxx::__alloc_traits<std::allocator<void (*)()> >::allocate(std::allocator<void (*)()>&, unsigned long) /usr/include/c++/4.9/ext/alloc_traits.h:182
The reason for this is that we override operator new but don't override
operator delete. This patch does the override if the code is NOT
compiled with asan.
gdb:
2016-10-25 Yao Qi <yao.qi@linaro.org>
PR gdb/20716
* common/new-op.c (__has_feature): New macro.
Don't override operator new if asan is used.
Diffstat (limited to 'gdb/common')
-rw-r--r-- | gdb/common/new-op.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/gdb/common/new-op.c b/gdb/common/new-op.c index 5ba4d6e..f04c5cb 100644 --- a/gdb/common/new-op.c +++ b/gdb/common/new-op.c @@ -17,6 +17,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ +/* GCC does not understand __has_feature. */ +#if !defined(__has_feature) +# define __has_feature(x) 0 +#endif + +#if !__has_feature(address_sanitizer) && !defined(__SANITIZE_ADDRESS__) #include "common-defs.h" #include "host-defs.h" #include <new> @@ -83,3 +89,4 @@ operator new[] (std::size_t sz, const std::nothrow_t&) { return ::operator new (sz, std::nothrow); } +#endif |