<div dir="ltr">Thanks! </div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, May 8, 2014 at 6:14 PM, Marshall Clow <span dir="ltr"><<a href="mailto:mclow.lists@gmail.com" target="_blank">mclow.lists@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: marshall<br>
Date: Thu May 8 09:14:06 2014<br>
New Revision: 208319<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=208319&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=208319&view=rev</a><br>
Log:<br>
Add Address Sanitizer support to std::vector<br>
<br>
Added:<br>
libcxx/trunk/test/containers/sequences/vector/asan.pass.cpp<br>
libcxx/trunk/test/support/asan_testing.h<br>
Modified:<br>
libcxx/trunk/include/__config<br>
libcxx/trunk/include/vector<br>
libcxx/trunk/test/containers/sequences/vector/vector.capacity/capacity.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.capacity/reserve.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.capacity/swap.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_initializer_list.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_move.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_default.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value_alloc.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/copy.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/copy_alloc.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list_alloc.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/move.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/move_alloc.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.cons/op_equal_initializer_list.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.data/data.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.data/data_const.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_extra.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter_iter.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp<br>
libcxx/trunk/test/containers/sequences/vector/vector.special/swap.pass.cpp<br>
<br>
Modified: libcxx/trunk/include/__config<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/include/__config (original)<br>
+++ libcxx/trunk/include/__config Thu May 8 09:14:06 2014<br>
@@ -629,6 +629,11 @@ template <unsigned> struct __static_asse<br>
#define _LIBCPP_DEPRECATED_AFTER_CXX11 [[deprecated]]<br>
#endif<br>
<br>
+#ifndef _LIBCPP_HAS_NO_ASAN<br>
+extern "C" void __sanitizer_annotate_contiguous_container(<br>
+ const void *, const void *, const void *, const void *);<br>
+#endif<br>
+<br>
// Try to find out if RTTI is disabled.<br>
// g++ and cl.exe have RTTI on by default and define a macro when it is.<br>
// g++ only defines the macro in 4.3.2 and onwards.<br>
<br>
Modified: libcxx/trunk/include/vector<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/vector?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/vector?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/include/vector (original)<br>
+++ libcxx/trunk/include/vector Thu May 8 09:14:06 2014<br>
@@ -483,6 +483,7 @@ class _LIBCPP_TYPE_VIS_ONLY vector<br>
{<br>
private:<br>
typedef __vector_base<_Tp, _Allocator> __base;<br>
+ typedef allocator<_Tp> __default_allocator_type;<br>
public:<br>
typedef vector __self;<br>
typedef _Tp value_type;<br>
@@ -749,7 +750,9 @@ public:<br>
_LIBCPP_INLINE_VISIBILITY<br>
void clear() _NOEXCEPT<br>
{<br>
+ size_type __old_size = size();<br>
__base::clear();<br>
+ __annotate_shrink(__old_size);<br>
__invalidate_all_iterators();<br>
}<br>
<br>
@@ -816,7 +819,9 @@ private:<br>
}<br>
__get_db()->unlock();<br>
#endif<br>
+ size_type __old_size = size();<br>
__base::__destruct_at_end(__new_last);<br>
+ __annotate_shrink(__old_size);<br>
}<br>
template <class _Up><br>
void<br>
@@ -830,17 +835,52 @@ private:<br>
void<br>
__emplace_back_slow_path(_Args&&... __args);<br>
#endif<br>
+ // The following functions are no-ops outside of AddressSanitizer mode.<br>
+ // We call annotatations only for the default Allocator because other allocators<br>
+ // may not meet the AddressSanitizer alignment constraints.<br>
+ // See the documentation for __sanitizer_annotate_contiguous_container for more details.<br>
+ void __annotate_contiguous_container<br>
+ (const void *__beg, const void *__end, const void *__old_mid, const void *__new_mid)<br>
+ {<br>
+#ifndef _LIBCPP_HAS_NO_ASAN<br>
+ if (__beg && is_same<allocator_type, __default_allocator_type>::value)<br>
+ __sanitizer_annotate_contiguous_container(__beg, __end, __old_mid, __new_mid);<br>
+#endif<br>
+ }<br>
+<br>
+ void __annotate_new(size_type __current_size)<br>
+ {<br>
+ __annotate_contiguous_container(data(), data() + capacity(),<br>
+ data() + capacity(), data() + __current_size);<br>
+ }<br>
+ void __annotate_delete()<br>
+ {<br>
+ __annotate_contiguous_container(data(), data() + capacity(),<br>
+ data() + size(), data() + capacity());<br>
+ }<br>
+ void __annotate_increase(size_type __n)<br>
+ {<br>
+ __annotate_contiguous_container(data(), data() + capacity(),<br>
+ data() + size(), data() + size() + __n);<br>
+ }<br>
+ void __annotate_shrink(size_type __old_size)<br>
+ {<br>
+ __annotate_contiguous_container(data(), data() + capacity(),<br>
+ data() + __old_size, data() + size());<br>
+ }<br>
};<br>
<br>
template <class _Tp, class _Allocator><br>
void<br>
vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v)<br>
{<br>
+ __annotate_delete();<br>
__alloc_traits::__construct_backward(this->__alloc(), this->__begin_, this->__end_, __v.__begin_);<br>
_VSTD::swap(this->__begin_, __v.__begin_);<br>
_VSTD::swap(this->__end_, __v.__end_);<br>
_VSTD::swap(this->__end_cap(), __v.__end_cap());<br>
__v.__first_ = __v.__begin_;<br>
+ __annotate_new(size());<br>
__invalidate_all_iterators();<br>
}<br>
<br>
@@ -848,6 +888,7 @@ template <class _Tp, class _Allocator><br>
typename vector<_Tp, _Allocator>::pointer<br>
vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p)<br>
{<br>
+ __annotate_delete();<br>
pointer __r = __v.__begin_;<br>
__alloc_traits::__construct_backward(this->__alloc(), this->__begin_, __p, __v.__begin_);<br>
__alloc_traits::__construct_forward(this->__alloc(), __p, this->__end_, __v.__end_);<br>
@@ -855,6 +896,7 @@ vector<_Tp, _Allocator>::__swap_out_circ<br>
_VSTD::swap(this->__end_, __v.__end_);<br>
_VSTD::swap(this->__end_cap(), __v.__end_cap());<br>
__v.__first_ = __v.__begin_;<br>
+ __annotate_new(size());<br>
__invalidate_all_iterators();<br>
return __r;<br>
}<br>
@@ -874,6 +916,7 @@ vector<_Tp, _Allocator>::allocate(size_t<br>
this->__throw_length_error();<br>
this->__begin_ = this->__end_ = __alloc_traits::allocate(this->__alloc(), __n);<br>
this->__end_cap() = this->__begin_ + __n;<br>
+ __annotate_new(0);<br>
}<br>
<br>
template <class _Tp, class _Allocator><br>
@@ -920,6 +963,7 @@ void<br>
vector<_Tp, _Allocator>::__construct_at_end(size_type __n)<br>
{<br>
allocator_type& __a = this->__alloc();<br>
+ __annotate_increase(__n);<br>
do<br>
{<br>
__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_));<br>
@@ -940,6 +984,7 @@ void<br>
vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x)<br>
{<br>
allocator_type& __a = this->__alloc();<br>
+ __annotate_increase(__n);<br>
do<br>
{<br>
__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), __x);<br>
@@ -960,6 +1005,7 @@ vector<_Tp, _Allocator>::__construct_at_<br>
allocator_type& __a = this->__alloc();<br>
for (; __first != __last; ++__first)<br>
{<br>
+ __annotate_increase(1);<br>
__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_), *__first);<br>
++this->__end_;<br>
}<br>
@@ -972,6 +1018,7 @@ vector<_Tp, _Allocator>::__move_construc<br>
allocator_type& __a = this->__alloc();<br>
for (; __first != __last; ++__first)<br>
{<br>
+ __annotate_increase(1);<br>
__alloc_traits::construct(__a, _VSTD::__to_raw_pointer(this->__end_),<br>
_VSTD::move(*__first));<br>
++this->__end_;<br>
@@ -1535,6 +1582,7 @@ vector<_Tp, _Allocator>::push_back(const<br>
{<br>
if (this->__end_ != this->__end_cap())<br>
{<br>
+ __annotate_increase(1);<br>
__alloc_traits::construct(this->__alloc(),<br>
_VSTD::__to_raw_pointer(this->__end_), __x);<br>
++this->__end_;<br>
@@ -1552,6 +1600,7 @@ vector<_Tp, _Allocator>::push_back(value<br>
{<br>
if (this->__end_ < this->__end_cap())<br>
{<br>
+ __annotate_increase(1);<br>
__alloc_traits::construct(this->__alloc(),<br>
_VSTD::__to_raw_pointer(this->__end_),<br>
_VSTD::move(__x));<br>
@@ -1584,6 +1633,7 @@ vector<_Tp, _Allocator>::emplace_back(_A<br>
{<br>
if (this->__end_ < this->__end_cap())<br>
{<br>
+ __annotate_increase(1);<br>
__alloc_traits::construct(this->__alloc(),<br>
_VSTD::__to_raw_pointer(this->__end_),<br>
_VSTD::forward<_Args>(__args)...);<br>
@@ -1666,6 +1716,7 @@ vector<_Tp, _Allocator>::insert(const_it<br>
pointer __p = this->__begin_ + (__position - begin());<br>
if (this->__end_ < this->__end_cap())<br>
{<br>
+ __annotate_increase(1);<br>
if (__p == this->__end_)<br>
{<br>
__alloc_traits::construct(this->__alloc(),<br>
@@ -1705,6 +1756,7 @@ vector<_Tp, _Allocator>::insert(const_it<br>
pointer __p = this->__begin_ + (__position - begin());<br>
if (this->__end_ < this->__end_cap())<br>
{<br>
+ __annotate_increase(1);<br>
if (__p == this->__end_)<br>
{<br>
__alloc_traits::construct(this->__alloc(),<br>
@@ -1743,6 +1795,7 @@ vector<_Tp, _Allocator>::emplace(const_i<br>
pointer __p = this->__begin_ + (__position - begin());<br>
if (this->__end_ < this->__end_cap())<br>
{<br>
+ __annotate_increase(1);<br>
if (__p == this->__end_)<br>
{<br>
__alloc_traits::construct(this->__alloc(),<br>
@@ -1794,6 +1847,7 @@ vector<_Tp, _Allocator>::insert(const_it<br>
}<br>
if (__n > 0)<br>
{<br>
+ __annotate_increase(__n);<br>
__move_range(__p, __old_last, __p + __old_n);<br>
const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x);<br>
if (__p <= __xr && __xr < this->__end_)<br>
@@ -1904,6 +1958,7 @@ vector<_Tp, _Allocator>::insert(const_it<br>
}<br>
if (__n > 0)<br>
{<br>
+ __annotate_increase(__n);<br>
__move_range(__p, __old_last, __p + __old_n);<br>
_VSTD::copy(__first, __m, __p);<br>
}<br>
<br>
Added: libcxx/trunk/test/containers/sequences/vector/asan.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/asan.pass.cpp?rev=208319&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/asan.pass.cpp?rev=208319&view=auto</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/asan.pass.cpp (added)<br>
+++ libcxx/trunk/test/containers/sequences/vector/asan.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -0,0 +1,52 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+// <vector><br>
+<br>
+// reference operator[](size_type n);<br>
+<br>
+#include <vector><br>
+#include <cassert><br>
+#include <cstdlib><br>
+<br>
+#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
+<br>
+#ifndef _LIBCPP_HAS_NO_ASAN<br>
+extern "C" void __asan_set_error_exit_code(int);<br>
+<br>
+int main()<br>
+{<br>
+#if __cplusplus >= 201103L<br>
+ {<br>
+ typedef int T;<br>
+ typedef std::vector<T, min_allocator<T>> C;<br>
+ const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};<br>
+ C c(std::begin(t), std::end(t));<br>
+ c.reserve(2*c.size());<br>
+ T foo = c[c.size()]; // bad, but not caught by ASAN<br>
+ }<br>
+#endif<br>
+<br>
+ __asan_set_error_exit_code(0);<br>
+ {<br>
+ typedef int T;<br>
+ typedef std::vector<T> C;<br>
+ const T t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};<br>
+ C c(std::begin(t), std::end(t));<br>
+ c.reserve(2*c.size());<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
+ assert(!__sanitizer_verify_contiguous_container ( c.data(), c.data() + 1, c.data() + c.capacity()));<br>
+ T foo = c[c.size()]; // should trigger ASAN<br>
+ assert(false); // if we got here, ASAN didn't trigger<br>
+ }<br>
+}<br>
+#else<br>
+int main () { return 0; }<br>
+#endif<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.capacity/capacity.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/capacity.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/capacity.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.capacity/capacity.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.capacity/capacity.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,29 +15,34 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
{<br>
std::vector<int> v;<br>
assert(v.capacity() == 0);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int> v(100);<br>
assert(v.capacity() == 100);<br>
v.push_back(0);<br>
assert(v.capacity() > 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<int, min_allocator<int>> v;<br>
assert(v.capacity() == 0);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int, min_allocator<int>> v(100);<br>
assert(v.capacity() == 100);<br>
v.push_back(0);<br>
assert(v.capacity() > 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.capacity/reserve.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/reserve.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/reserve.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.capacity/reserve.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.capacity/reserve.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -22,6 +23,7 @@ int main()<br>
std::vector<int> v;<br>
v.reserve(10);<br>
assert(v.capacity() >= 10);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int> v(100);<br>
@@ -32,6 +34,7 @@ int main()<br>
v.reserve(150);<br>
assert(v.size() == 100);<br>
assert(v.capacity() == 150);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int, stack_allocator<int, 250> > v(100);<br>
@@ -42,12 +45,14 @@ int main()<br>
v.reserve(150);<br>
assert(v.size() == 100);<br>
assert(v.capacity() == 150);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<int, min_allocator<int>> v;<br>
v.reserve(10);<br>
assert(v.capacity() >= 10);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int, min_allocator<int>> v(100);<br>
@@ -58,6 +63,7 @@ int main()<br>
v.reserve(150);<br>
assert(v.size() == 100);<br>
assert(v.capacity() == 150);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
#include "../../../stack_allocator.h"<br>
#include "../../../MoveOnly.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -25,18 +26,22 @@ int main()<br>
v.resize(50);<br>
assert(v.size() == 50);<br>
assert(v.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.resize(200);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<MoveOnly, stack_allocator<MoveOnly, 300> > v(100);<br>
v.resize(50);<br>
assert(v.size() == 50);<br>
assert(v.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.resize(200);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#else // _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
{<br>
@@ -44,18 +49,22 @@ int main()<br>
v.resize(50);<br>
assert(v.size() == 50);<br>
assert(v.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.resize(200);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int, stack_allocator<int, 300> > v(100);<br>
v.resize(50);<br>
assert(v.size() == 50);<br>
assert(v.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.resize(200);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
#if __cplusplus >= 201103L<br>
@@ -64,9 +73,11 @@ int main()<br>
v.resize(50);<br>
assert(v.size() == 50);<br>
assert(v.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.resize(200);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.capacity/resize_size_value.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -27,6 +28,7 @@ int main()<br>
v.resize(200, 1);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
for (unsigned i = 0; i < 50; ++i)<br>
assert(v[i] == 0);<br>
for (unsigned i = 50; i < 200; ++i)<br>
@@ -40,6 +42,7 @@ int main()<br>
v.resize(200, 1);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
@@ -47,10 +50,12 @@ int main()<br>
v.resize(50, 1);<br>
assert(v.size() == 50);<br>
assert(v.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert((v == std::vector<int, min_allocator<int>>(50)));<br>
v.resize(200, 1);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
for (unsigned i = 0; i < 50; ++i)<br>
assert(v[i] == 0);<br>
for (unsigned i = 50; i < 200; ++i)<br>
@@ -61,9 +66,11 @@ int main()<br>
v.resize(50, 1);<br>
assert(v.size() == 50);<br>
assert(v.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.resize(200, 1);<br>
assert(v.size() == 200);<br>
assert(v.capacity() >= 200);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.capacity/shrink_to_fit.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,39 +15,48 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
{<br>
std::vector<int> v(100);<br>
v.push_back(1);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.shrink_to_fit();<br>
assert(v.capacity() == 101);<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int, stack_allocator<int, 401> > v(100);<br>
v.push_back(1);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.shrink_to_fit();<br>
assert(v.capacity() == 101);<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#ifndef _LIBCPP_NO_EXCEPTIONS<br>
{<br>
std::vector<int, stack_allocator<int, 400> > v(100);<br>
v.push_back(1);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.shrink_to_fit();<br>
assert(v.capacity() == 200);<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<int, min_allocator<int>> v(100);<br>
v.push_back(1);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v.shrink_to_fit();<br>
assert(v.capacity() == 101);<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.capacity/swap.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/swap.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.capacity/swap.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.capacity/swap.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.capacity/swap.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,27 +15,36 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
{<br>
std::vector<int> v1(100);<br>
std::vector<int> v2(200);<br>
+ assert(is_contiguous_container_asan_correct(v1));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
v1.swap(v2);<br>
assert(v1.size() == 200);<br>
assert(v1.capacity() == 200);<br>
+ assert(is_contiguous_container_asan_correct(v1));<br>
assert(v2.size() == 100);<br>
assert(v2.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<int, min_allocator<int>> v1(100);<br>
std::vector<int, min_allocator<int>> v2(200);<br>
+ assert(is_contiguous_container_asan_correct(v1));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
v1.swap(v2);<br>
assert(v1.size() == 200);<br>
assert(v1.capacity() == 200);<br>
+ assert(is_contiguous_container_asan_correct(v1));<br>
assert(v2.size() == 100);<br>
assert(v2.capacity() == 100);<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_initializer_list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_initializer_list.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_initializer_list.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -23,6 +24,7 @@ int main()<br>
std::vector<int> d;<br>
d.assign({3, 4, 5, 6});<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
@@ -33,6 +35,7 @@ int main()<br>
std::vector<int, min_allocator<int>> d;<br>
d.assign({3, 4, 5, 6});<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_move.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_move.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_move.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_move.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/assign_move.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
#include "../../../MoveOnly.h"<br>
#include "test_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -28,54 +29,72 @@ int main()<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(test_allocator<MoveOnly>(5));<br>
l2 = std::move(l);<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == lo.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
{<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(test_allocator<MoveOnly>(6));<br>
l2 = std::move(l);<br>
assert(l2 == lo);<br>
assert(!l.empty());<br>
assert(l2.get_allocator() == test_allocator<MoveOnly>(6));<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
{<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5));<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > l2(other_allocator<MoveOnly>(6));<br>
l2 = std::move(l);<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == lo.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{});<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{});<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > l2(min_allocator<MoveOnly>{});<br>
l2 = std::move(l);<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == lo.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
#endif<br>
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_default.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_default.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_default.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_default.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_default.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -18,6 +18,7 @@<br>
#include "../../../NotConstructible.h"<br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C><br>
void<br>
@@ -27,11 +28,13 @@ test0()<br>
assert(c.__invariants());<br>
assert(c.empty());<br>
assert(c.get_allocator() == typename C::allocator_type());<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
#if __cplusplus >= 201103L<br>
C c1 = {};<br>
assert(c1.__invariants());<br>
assert(c1.empty());<br>
assert(c1.get_allocator() == typename C::allocator_type());<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
#endif<br>
}<br>
<br>
@@ -43,6 +46,7 @@ test1(const typename C::allocator_type&<br>
assert(c.__invariants());<br>
assert(c.empty());<br>
assert(c.get_allocator() == a);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
<br>
int main()<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -17,6 +17,7 @@<br>
#include "test_iterators.h"<br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C, class Iterator><br>
void<br>
@@ -25,6 +26,7 @@ test(Iterator first, Iterator last)<br>
C c(first, last);<br>
assert(c.__invariants());<br>
assert(c.size() == std::distance(first, last));<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i, ++first)<br>
assert(*i == *first);<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_iter_iter_alloc.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -18,6 +18,7 @@<br>
#include "test_iterators.h"<br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C, class Iterator, class A><br>
void<br>
@@ -26,6 +27,7 @@ test(Iterator first, Iterator last, cons<br>
C c(first, last, a);<br>
assert(c.__invariants());<br>
assert(c.size() == std::distance(first, last));<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i, ++first)<br>
assert(*i == *first);<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -17,6 +17,7 @@<br>
#include "DefaultOnly.h"<br>
#include "min_allocator.h"<br>
#include "test_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C><br>
void<br>
@@ -27,6 +28,7 @@ test2(typename C::size_type n, typename<br>
assert(c.__invariants());<br>
assert(c.size() == n);<br>
assert(c.get_allocator() == a);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)<br>
assert(*i == typename C::value_type());<br>
@@ -42,6 +44,7 @@ test1(typename C::size_type n)<br>
assert(c.__invariants());<br>
assert(c.size() == n);<br>
assert(c.get_allocator() == typename C::allocator_type());<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)<br>
assert(*i == typename C::value_type());<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
<br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C><br>
void<br>
@@ -24,6 +25,7 @@ test(typename C::size_type n, const type<br>
C c(n, x);<br>
assert(c.__invariants());<br>
assert(c.size() == n);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)<br>
assert(*i == x);<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value_alloc.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value_alloc.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/construct_size_value_alloc.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -14,6 +14,7 @@<br>
#include <vector><br>
#include <cassert><br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C><br>
void<br>
@@ -24,6 +25,7 @@ test(typename C::size_type n, const type<br>
assert(c.__invariants());<br>
assert(a == c.get_allocator());<br>
assert(c.size() == n);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (typename C::const_iterator i = c.cbegin(), e = c.cend(); i != e; ++i)<br>
assert(*i == x);<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/copy.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/copy.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/copy.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/copy.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/copy.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
#include "test_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C><br>
void<br>
@@ -25,6 +26,7 @@ test(const C& x)<br>
assert(c.__invariants());<br>
assert(c.size() == s);<br>
assert(c == x);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
<br>
int main()<br>
@@ -37,15 +39,23 @@ int main()<br>
{<br>
std::vector<int, test_allocator<int> > v(3, 2, test_allocator<int>(5));<br>
std::vector<int, test_allocator<int> > v2 = v;<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
assert(v2 == v);<br>
assert(v2.get_allocator() == v.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
}<br>
#ifndef _LIBCPP_HAS_NO_ADVANCED_SFINAE<br>
{<br>
std::vector<int, other_allocator<int> > v(3, 2, other_allocator<int>(5));<br>
std::vector<int, other_allocator<int> > v2 = v;<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
assert(v2 == v);<br>
assert(v2.get_allocator() == other_allocator<int>(-2));<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
}<br>
#endif // _LIBCPP_HAS_NO_ADVANCED_SFINAE<br>
#if __cplusplus >= 201103L<br>
@@ -57,8 +67,12 @@ int main()<br>
{<br>
std::vector<int, min_allocator<int> > v(3, 2, min_allocator<int>());<br>
std::vector<int, min_allocator<int> > v2 = v;<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
assert(v2 == v);<br>
assert(v2.get_allocator() == v.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
+ assert(is_contiguous_container_asan_correct(v2));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/copy_alloc.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/copy_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/copy_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/copy_alloc.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/copy_alloc.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
#include "test_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
template <class C><br>
void<br>
@@ -25,6 +26,7 @@ test(const C& x, const typename C::alloc<br>
assert(c.__invariants());<br>
assert(c.size() == s);<br>
assert(c == x);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
<br>
int main()<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -14,6 +14,7 @@<br>
#include <vector><br>
#include <cassert><br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -21,6 +22,7 @@ int main()<br>
{<br>
std::vector<int> d = {3, 4, 5, 6};<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
@@ -30,6 +32,7 @@ int main()<br>
{<br>
std::vector<int, min_allocator<int>> d = {3, 4, 5, 6};<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list_alloc.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list_alloc.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/initializer_list_alloc.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
<br>
#include "test_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -24,6 +25,7 @@ int main()<br>
std::vector<int, test_allocator<int>> d({3, 4, 5, 6}, test_allocator<int>(3));<br>
assert(d.get_allocator() == test_allocator<int>(3));<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
@@ -34,6 +36,7 @@ int main()<br>
std::vector<int, min_allocator<int>> d({3, 4, 5, 6}, min_allocator<int>());<br>
assert(d.get_allocator() == min_allocator<int>());<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/move.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/move.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/move.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/move.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/move.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
#include "../../../MoveOnly.h"<br>
#include "test_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -23,58 +24,79 @@ int main()<br>
{<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l2 = std::move(l);<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == lo.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
{<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5));<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > l2 = std::move(l);<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == lo.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
std::vector<int> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
std::vector<int>::const_iterator i = c1.begin();<br>
std::vector<int> c2 = std::move(c1);<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
std::vector<int>::iterator j = c2.erase(i);<br>
assert(*j == 3);<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{});<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{});<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > l2 = std::move(l);<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == lo.get_allocator());<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
std::vector<int, min_allocator<int>> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
std::vector<int, min_allocator<int>>::const_iterator i = c1.begin();<br>
std::vector<int, min_allocator<int>> c2 = std::move(c1);<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
std::vector<int, min_allocator<int>>::iterator j = c2.erase(i);<br>
assert(*j == 3);<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
#endif<br>
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/move_alloc.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/move_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/move_alloc.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/move_alloc.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/move_alloc.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
#include "../../../MoveOnly.h"<br>
#include "test_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -23,55 +24,75 @@ int main()<br>
{<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(std::move(l), test_allocator<MoveOnly>(6));<br>
assert(l2 == lo);<br>
assert(!l.empty());<br>
assert(l2.get_allocator() == test_allocator<MoveOnly>(6));<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
{<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l(test_allocator<MoveOnly>(5));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > lo(test_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, test_allocator<MoveOnly> > l2(std::move(l), test_allocator<MoveOnly>(5));<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == test_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
{<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > l(other_allocator<MoveOnly>(5));<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > lo(other_allocator<MoveOnly>(5));<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, other_allocator<MoveOnly> > l2(std::move(l), other_allocator<MoveOnly>(4));<br>
assert(l2 == lo);<br>
assert(!l.empty());<br>
assert(l2.get_allocator() == other_allocator<MoveOnly>(4));<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > l(min_allocator<MoveOnly>{});<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > lo(min_allocator<MoveOnly>{});<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
for (int i = 1; i <= 3; ++i)<br>
{<br>
l.push_back(i);<br>
lo.push_back(i);<br>
}<br>
+ assert(is_contiguous_container_asan_correct(l));<br>
+ assert(is_contiguous_container_asan_correct(lo));<br>
std::vector<MoveOnly, min_allocator<MoveOnly> > l2(std::move(l), min_allocator<MoveOnly>());<br>
assert(l2 == lo);<br>
assert(l.empty());<br>
assert(l2.get_allocator() == min_allocator<MoveOnly>());<br>
+ assert(is_contiguous_container_asan_correct(l2));<br>
}<br>
#endif<br>
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.cons/op_equal_initializer_list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/op_equal_initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.cons/op_equal_initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.cons/op_equal_initializer_list.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.cons/op_equal_initializer_list.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -23,6 +24,7 @@ int main()<br>
std::vector<int> d;<br>
d = {3, 4, 5, 6};<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
@@ -33,6 +35,7 @@ int main()<br>
std::vector<int, min_allocator<int>> d;<br>
d = {3, 4, 5, 6};<br>
assert(d.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(d[0] == 3);<br>
assert(d[1] == 4);<br>
assert(d[2] == 5);<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.data/data.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.data/data.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.data/data.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.data/data.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.data/data.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,25 +15,30 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
{<br>
std::vector<int> v;<br>
assert(v.data() == 0);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int> v(100);<br>
assert(v.data() == &v.front());<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<int, min_allocator<int>> v;<br>
assert(v.data() == 0);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int, min_allocator<int>> v(100);<br>
assert(v.data() == &v.front());<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.data/data_const.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.data/data_const.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.data/data_const.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.data/data_const.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.data/data_const.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,25 +15,30 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
{<br>
const std::vector<int> v;<br>
assert(v.data() == 0);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
const std::vector<int> v(100);<br>
assert(v.data() == &v.front());<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
const std::vector<int, min_allocator<int>> v;<br>
assert(v.data() == 0);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
const std::vector<int, min_allocator<int>> v(100);<br>
assert(v.data() == &v.front());<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -19,6 +19,7 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
<br>
@@ -66,6 +67,7 @@ int main()<br>
assert(c.size() == 1);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
i = c.emplace(c.cend(), 3, 4.5);<br>
assert(i == c.end()-1);<br>
assert(c.size() == 2);<br>
@@ -73,6 +75,7 @@ int main()<br>
assert(c.front().getd() == 3.5);<br>
assert(c.back().geti() == 3);<br>
assert(c.back().getd() == 4.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
i = c.emplace(c.cbegin()+1, 4, 6.5);<br>
assert(i == c.begin()+1);<br>
assert(c.size() == 3);<br>
@@ -82,6 +85,7 @@ int main()<br>
assert(c[1].getd() == 6.5);<br>
assert(c.back().geti() == 3);<br>
assert(c.back().getd() == 4.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
{<br>
std::vector<A, stack_allocator<A, 7> > c;<br>
@@ -90,6 +94,7 @@ int main()<br>
assert(c.size() == 1);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
i = c.emplace(c.cend(), 3, 4.5);<br>
assert(i == c.end()-1);<br>
assert(c.size() == 2);<br>
@@ -97,6 +102,7 @@ int main()<br>
assert(c.front().getd() == 3.5);<br>
assert(c.back().geti() == 3);<br>
assert(c.back().getd() == 4.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
i = c.emplace(c.cbegin()+1, 4, 6.5);<br>
assert(i == c.begin()+1);<br>
assert(c.size() == 3);<br>
@@ -106,6 +112,7 @@ int main()<br>
assert(c[1].getd() == 6.5);<br>
assert(c.back().geti() == 3);<br>
assert(c.back().getd() == 4.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
#if _LIBCPP_DEBUG >= 1<br>
{<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_back.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
<br>
@@ -61,12 +62,14 @@ int main()<br>
assert(c.size() == 1);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
c.emplace_back(3, 4.5);<br>
assert(c.size() == 2);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
assert(c.back().geti() == 3);<br>
assert(c.back().getd() == 4.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
{<br>
std::vector<A, stack_allocator<A, 4> > c;<br>
@@ -74,12 +77,14 @@ int main()<br>
assert(c.size() == 1);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
c.emplace_back(3, 4.5);<br>
assert(c.size() == 2);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
assert(c.back().geti() == 3);<br>
assert(c.back().getd() == 4.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
@@ -88,12 +93,14 @@ int main()<br>
assert(c.size() == 1);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
c.emplace_back(3, 4.5);<br>
assert(c.size() == 2);<br>
assert(c.front().geti() == 2);<br>
assert(c.front().getd() == 3.5);<br>
assert(c.back().geti() == 3);<br>
assert(c.back().getd() == 4.5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
}<br>
#endif<br>
#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_extra.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_extra.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_extra.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_extra.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/emplace_extra.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -22,31 +23,39 @@ int main()<br>
{<br>
std::vector<int> v;<br>
v.reserve(3);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v = { 1, 2, 3 };<br>
v.emplace(v.begin(), v.back());<br>
assert(v[0] == 3);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int> v;<br>
v.reserve(4);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v = { 1, 2, 3 };<br>
v.emplace(v.begin(), v.back());<br>
assert(v[0] == 3);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<int, min_allocator<int>> v;<br>
v.reserve(3);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v = { 1, 2, 3 };<br>
v.emplace(v.begin(), v.back());<br>
assert(v[0] == 3);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
{<br>
std::vector<int, min_allocator<int>> v;<br>
v.reserve(4);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
v = { 1, 2, 3 };<br>
v.emplace(v.begin(), v.back());<br>
assert(v[0] == 3);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
}<br>
#endif<br>
#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -22,6 +23,7 @@ int main()<br>
int a1[] = {1, 2, 3};<br>
std::vector<int> l1(a1, a1+3);<br>
std::vector<int>::const_iterator i = l1.begin();<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
++i;<br>
std::vector<int>::iterator j = l1.erase(i);<br>
assert(l1.size() == 2);<br>
@@ -29,21 +31,25 @@ int main()<br>
assert(*j == 3);<br>
assert(*l1.begin() == 1);<br>
assert(*next(l1.begin()) == 3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
j = l1.erase(j);<br>
assert(j == l1.end());<br>
assert(l1.size() == 1);<br>
assert(distance(l1.begin(), l1.end()) == 1);<br>
assert(*l1.begin() == 1);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
j = l1.erase(l1.begin());<br>
assert(j == l1.end());<br>
assert(l1.size() == 0);<br>
assert(distance(l1.begin(), l1.end()) == 0);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
int a1[] = {1, 2, 3};<br>
std::vector<int, min_allocator<int>> l1(a1, a1+3);<br>
std::vector<int, min_allocator<int>>::const_iterator i = l1.begin();<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
++i;<br>
std::vector<int, min_allocator<int>>::iterator j = l1.erase(i);<br>
assert(l1.size() == 2);<br>
@@ -51,15 +57,18 @@ int main()<br>
assert(*j == 3);<br>
assert(*l1.begin() == 1);<br>
assert(*next(l1.begin()) == 3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
j = l1.erase(j);<br>
assert(j == l1.end());<br>
assert(l1.size() == 1);<br>
assert(distance(l1.begin(), l1.end()) == 1);<br>
assert(*l1.begin() == 1);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
j = l1.erase(l1.begin());<br>
assert(j == l1.end());<br>
assert(l1.size() == 0);<br>
assert(distance(l1.begin(), l1.end()) == 0);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter_iter.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter_iter.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/erase_iter_iter.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,84 +15,113 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
int a1[] = {1, 2, 3};<br>
{<br>
std::vector<int> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int>::iterator i = l1.erase(l1.cbegin(), l1.cbegin());<br>
assert(l1.size() == 3);<br>
assert(distance(l1.cbegin(), l1.cend()) == 3);<br>
assert(i == l1.begin());<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<int> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin()));<br>
assert(l1.size() == 2);<br>
assert(distance(l1.cbegin(), l1.cend()) == 2);<br>
assert(i == l1.begin());<br>
assert(l1 == std::vector<int>(a1+1, a1+3));<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<int> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 2));<br>
assert(l1.size() == 1);<br>
assert(distance(l1.cbegin(), l1.cend()) == 1);<br>
assert(i == l1.begin());<br>
assert(l1 == std::vector<int>(a1+2, a1+3));<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<int> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 3));<br>
assert(l1.size() == 0);<br>
assert(distance(l1.cbegin(), l1.cend()) == 0);<br>
assert(i == l1.begin());<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<std::vector<int> > outer(2, std::vector<int>(1));<br>
+ assert(is_contiguous_container_asan_correct(outer));<br>
+ assert(is_contiguous_container_asan_correct(outer[0]));<br>
+ assert(is_contiguous_container_asan_correct(outer[1]));<br>
outer.erase(outer.begin(), outer.begin());<br>
assert(outer.size() == 2);<br>
assert(outer[0].size() == 1);<br>
assert(outer[1].size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(outer));<br>
+ assert(is_contiguous_container_asan_correct(outer[0]));<br>
+ assert(is_contiguous_container_asan_correct(outer[1]));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
std::vector<int, min_allocator<int>> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), l1.cbegin());<br>
assert(l1.size() == 3);<br>
assert(distance(l1.cbegin(), l1.cend()) == 3);<br>
assert(i == l1.begin());<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<int, min_allocator<int>> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin()));<br>
assert(l1.size() == 2);<br>
assert(distance(l1.cbegin(), l1.cend()) == 2);<br>
assert(i == l1.begin());<br>
assert((l1 == std::vector<int, min_allocator<int>>(a1+1, a1+3)));<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<int, min_allocator<int>> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 2));<br>
assert(l1.size() == 1);<br>
assert(distance(l1.cbegin(), l1.cend()) == 1);<br>
assert(i == l1.begin());<br>
assert((l1 == std::vector<int, min_allocator<int>>(a1+2, a1+3)));<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<int, min_allocator<int>> l1(a1, a1+3);<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
std::vector<int, min_allocator<int>>::iterator i = l1.erase(l1.cbegin(), next(l1.cbegin(), 3));<br>
assert(l1.size() == 0);<br>
assert(distance(l1.cbegin(), l1.cend()) == 0);<br>
assert(i == l1.begin());<br>
+ assert(is_contiguous_container_asan_correct(l1));<br>
}<br>
{<br>
std::vector<std::vector<int, min_allocator<int>>, min_allocator<std::vector<int, min_allocator<int>>>> outer(2, std::vector<int, min_allocator<int>>(1));<br>
+ assert(is_contiguous_container_asan_correct(outer));<br>
+ assert(is_contiguous_container_asan_correct(outer[0]));<br>
+ assert(is_contiguous_container_asan_correct(outer[1]));<br>
outer.erase(outer.begin(), outer.begin());<br>
assert(outer.size() == 2);<br>
assert(outer[0].size() == 1);<br>
assert(outer[1].size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(outer));<br>
+ assert(is_contiguous_container_asan_correct(outer[0]));<br>
+ assert(is_contiguous_container_asan_correct(outer[1]));<br>
}<br>
#endif<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_initializer_list.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -23,6 +24,7 @@ int main()<br>
std::vector<int> d(10, 1);<br>
std::vector<int>::iterator i = d.insert(d.cbegin() + 2, {3, 4, 5, 6});<br>
assert(d.size() == 14);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(i == d.begin() + 2);<br>
assert(d[0] == 1);<br>
assert(d[1] == 1);<br>
@@ -44,6 +46,7 @@ int main()<br>
std::vector<int, min_allocator<int>> d(10, 1);<br>
std::vector<int, min_allocator<int>>::iterator i = d.insert(d.cbegin() + 2, {3, 4, 5, 6});<br>
assert(d.size() == 14);<br>
+ assert(is_contiguous_container_asan_correct(d));<br>
assert(i == d.begin() + 2);<br>
assert(d[0] == 1);<br>
assert(d[1] == 1);<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_iter_iter.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -21,6 +21,7 @@<br>
#include "../../../stack_allocator.h"<br>
#include "test_iterators.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -31,6 +32,7 @@ int main()<br>
std::vector<int>::iterator i = v.insert(v.cbegin() + 10, input_iterator<const int*>(a),<br>
input_iterator<const int*>(a+N));<br>
assert(v.size() == 100 + N);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -47,6 +49,7 @@ int main()<br>
std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a),<br>
forward_iterator<const int*>(a+N));<br>
assert(v.size() == 100 + N);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -63,6 +66,7 @@ int main()<br>
std::vector<int>::iterator i = v.insert(v.cbegin() + 10, input_iterator<const int*>(a),<br>
input_iterator<const int*>(a+N));<br>
assert(v.size() == 100 + N);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -79,6 +83,7 @@ int main()<br>
std::vector<int>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a),<br>
forward_iterator<const int*>(a+N));<br>
assert(v.size() == 100 + N);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -107,6 +112,7 @@ int main()<br>
std::vector<int, min_allocator<int>>::iterator i = v.insert(v.cbegin() + 10, input_iterator<const int*>(a),<br>
input_iterator<const int*>(a+N));<br>
assert(v.size() == 100 + N);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -123,6 +129,7 @@ int main()<br>
std::vector<int, min_allocator<int>>::iterator i = v.insert(v.cbegin() + 10, forward_iterator<const int*>(a),<br>
forward_iterator<const int*>(a+N));<br>
assert(v.size() == 100 + N);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_rvalue.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -20,6 +20,7 @@<br>
#include "../../../stack_allocator.h"<br>
#include "../../../MoveOnly.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -28,6 +29,7 @@ int main()<br>
std::vector<MoveOnly> v(100);<br>
std::vector<MoveOnly>::iterator i = v.insert(v.cbegin() + 10, MoveOnly(3));<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -40,6 +42,7 @@ int main()<br>
std::vector<MoveOnly, stack_allocator<MoveOnly, 300> > v(100);<br>
std::vector<MoveOnly, stack_allocator<MoveOnly, 300> >::iterator i = v.insert(v.cbegin() + 10, MoveOnly(3));<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -61,6 +64,7 @@ int main()<br>
std::vector<MoveOnly, min_allocator<MoveOnly>> v(100);<br>
std::vector<MoveOnly, min_allocator<MoveOnly>>::iterator i = v.insert(v.cbegin() + 10, MoveOnly(3));<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_size_value.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -19,6 +19,7 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -26,6 +27,7 @@ int main()<br>
std::vector<int> v(100);<br>
std::vector<int>::iterator i = v.insert(v.cbegin() + 10, 5, 1);<br>
assert(v.size() == 105);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -39,6 +41,7 @@ int main()<br>
std::vector<int, stack_allocator<int, 300> > v(100);<br>
std::vector<int, stack_allocator<int, 300> >::iterator i = v.insert(v.cbegin() + 10, 5, 1);<br>
assert(v.size() == 105);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -61,6 +64,7 @@ int main()<br>
std::vector<int, min_allocator<int>> v(100);<br>
std::vector<int, min_allocator<int>>::iterator i = v.insert(v.cbegin() + 10, 5, 1);<br>
assert(v.size() == 105);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -74,6 +78,7 @@ int main()<br>
std::vector<int, min_allocator<int>> v(100);<br>
std::vector<int, min_allocator<int>>::iterator i = v.insert(v.cbegin() + 10, 5, 1);<br>
assert(v.size() == 105);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/insert_iter_value.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -19,6 +19,7 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -26,6 +27,7 @@ int main()<br>
std::vector<int> v(100);<br>
std::vector<int>::iterator i = v.insert(v.cbegin() + 10, 1);<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -38,6 +40,7 @@ int main()<br>
std::vector<int, stack_allocator<int, 300> > v(100);<br>
std::vector<int, stack_allocator<int, 300> >::iterator i = v.insert(v.cbegin() + 10, 1);<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
@@ -60,6 +63,7 @@ int main()<br>
std::vector<int, min_allocator<int>> v(100);<br>
std::vector<int, min_allocator<int>>::iterator i = v.insert(v.cbegin() + 10, 1);<br>
assert(v.size() == 101);<br>
+ assert(is_contiguous_container_asan_correct(v));<br>
assert(i == v.begin() + 10);<br>
int j;<br>
for (j = 0; j < 10; ++j)<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -15,6 +15,7 @@<br>
#include <cassert><br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -22,22 +23,27 @@ int main()<br>
std::vector<int> c;<br>
c.push_back(0);<br>
assert(c.size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(1);<br>
assert(c.size() == 2);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(2);<br>
assert(c.size() == 3);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(3);<br>
assert(c.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(4);<br>
assert(c.size() == 5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
}<br>
@@ -45,22 +51,27 @@ int main()<br>
std::vector<int, stack_allocator<int, 15> > c;<br>
c.push_back(0);<br>
assert(c.size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(1);<br>
assert(c.size() == 2);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(2);<br>
assert(c.size() == 3);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(3);<br>
assert(c.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(4);<br>
assert(c.size() == 5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
}<br>
@@ -69,22 +80,27 @@ int main()<br>
std::vector<int, min_allocator<int>> c;<br>
c.push_back(0);<br>
assert(c.size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(1);<br>
assert(c.size() == 2);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(2);<br>
assert(c.size() == 3);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(3);<br>
assert(c.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
c.push_back(4);<br>
assert(c.size() == 5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == j);<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_exception_safety.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -14,6 +14,8 @@<br>
#include <vector><br>
#include <cassert><br>
<br>
+#include "asan_testing.h"<br>
+<br>
// Flag that makes the copy constructor for CMyClass throw an exception<br>
static bool gCopyConstructorShouldThow = false;<br>
<br>
@@ -70,6 +72,8 @@ int main()<br>
<br>
vec.push_back(instance);<br>
std::vector<CMyClass> vec2(vec);<br>
+ assert(is_contiguous_container_asan_correct(vec));<br>
+ assert(is_contiguous_container_asan_correct(vec2));<br>
<br>
gCopyConstructorShouldThow = true;<br>
try {<br>
@@ -77,5 +81,6 @@ int main()<br>
}<br>
catch (...) {<br>
assert(vec==vec2);<br>
+ assert(is_contiguous_container_asan_correct(vec));<br>
}<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.modifiers/push_back_rvalue.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
#include "../../../MoveOnly.h"<br>
#include "../../../stack_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -24,22 +25,27 @@ int main()<br>
std::vector<MoveOnly> c;<br>
c.push_back(MoveOnly(0));<br>
assert(c.size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(1));<br>
assert(c.size() == 2);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(2));<br>
assert(c.size() == 3);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(3));<br>
assert(c.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(4));<br>
assert(c.size() == 5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
}<br>
@@ -47,22 +53,27 @@ int main()<br>
std::vector<MoveOnly, stack_allocator<MoveOnly, 15> > c;<br>
c.push_back(MoveOnly(0));<br>
assert(c.size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(1));<br>
assert(c.size() == 2);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(2));<br>
assert(c.size() == 3);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(3));<br>
assert(c.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(4));<br>
assert(c.size() == 5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
}<br>
@@ -71,22 +82,27 @@ int main()<br>
std::vector<MoveOnly, min_allocator<MoveOnly>> c;<br>
c.push_back(MoveOnly(0));<br>
assert(c.size() == 1);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(1));<br>
assert(c.size() == 2);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(2));<br>
assert(c.size() == 3);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(3));<br>
assert(c.size() == 4);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
c.push_back(MoveOnly(4));<br>
assert(c.size() == 5);<br>
+ assert(is_contiguous_container_asan_correct(c));<br>
for (int j = 0; j < c.size(); ++j)<br>
assert(c[j] == MoveOnly(j));<br>
}<br>
<br>
Modified: libcxx/trunk/test/containers/sequences/vector/vector.special/swap.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.special/swap.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/containers/sequences/vector/vector.special/swap.pass.cpp?rev=208319&r1=208318&r2=208319&view=diff</a><br>
==============================================================================<br>
--- libcxx/trunk/test/containers/sequences/vector/vector.special/swap.pass.cpp (original)<br>
+++ libcxx/trunk/test/containers/sequences/vector/vector.special/swap.pass.cpp Thu May 8 09:14:06 2014<br>
@@ -16,6 +16,7 @@<br>
#include <cassert><br>
#include "test_allocator.h"<br>
#include "min_allocator.h"<br>
+#include "asan_testing.h"<br>
<br>
int main()<br>
{<br>
@@ -24,40 +25,56 @@ int main()<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));<br>
std::vector<int> c2(a2, a2+sizeof(a2)/sizeof(a2[0]));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert(c1 == std::vector<int>(a2, a2+sizeof(a2)/sizeof(a2[0])));<br>
assert(c2 == std::vector<int>(a1, a1+sizeof(a1)/sizeof(a1[0])));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int> c1(a1, a1);<br>
std::vector<int> c2(a2, a2+sizeof(a2)/sizeof(a2[0]));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert(c1 == std::vector<int>(a2, a2+sizeof(a2)/sizeof(a2[0])));<br>
assert(c2.empty());<br>
assert(distance(c2.begin(), c2.end()) == 0);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));<br>
std::vector<int> c2(a2, a2);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert(c1.empty());<br>
assert(distance(c1.begin(), c1.end()) == 0);<br>
assert(c2 == std::vector<int>(a1, a1+sizeof(a1)/sizeof(a1[0])));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int> c1(a1, a1);<br>
std::vector<int> c2(a2, a2);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert(c1.empty());<br>
assert(distance(c1.begin(), c1.end()) == 0);<br>
assert(c2.empty());<br>
assert(distance(c2.begin(), c2.end()) == 0);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
#ifndef _LIBCPP_DEBUG_LEVEL<br>
// This test known to result in undefined behavior detected by _LIBCPP_DEBUG_LEVEL >= 1<br>
@@ -80,11 +97,15 @@ int main()<br>
typedef other_allocator<int> A;<br>
std::vector<int, A> c1(a1, a1+sizeof(a1)/sizeof(a1[0]), A(1));<br>
std::vector<int, A> c2(a2, a2+sizeof(a2)/sizeof(a2[0]), A(2));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert((c1 == std::vector<int, A>(a2, a2+sizeof(a2)/sizeof(a2[0]))));<br>
assert(c1.get_allocator() == A(2));<br>
assert((c2 == std::vector<int, A>(a1, a1+sizeof(a1)/sizeof(a1[0]))));<br>
assert(c2.get_allocator() == A(1));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
#if __cplusplus >= 201103L<br>
{<br>
@@ -92,40 +113,56 @@ int main()<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int, min_allocator<int>> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));<br>
std::vector<int, min_allocator<int>> c2(a2, a2+sizeof(a2)/sizeof(a2[0]));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert((c1 == std::vector<int, min_allocator<int>>(a2, a2+sizeof(a2)/sizeof(a2[0]))));<br>
assert((c2 == std::vector<int, min_allocator<int>>(a1, a1+sizeof(a1)/sizeof(a1[0]))));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int, min_allocator<int>> c1(a1, a1);<br>
std::vector<int, min_allocator<int>> c2(a2, a2+sizeof(a2)/sizeof(a2[0]));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert((c1 == std::vector<int, min_allocator<int>>(a2, a2+sizeof(a2)/sizeof(a2[0]))));<br>
assert(c2.empty());<br>
assert(distance(c2.begin(), c2.end()) == 0);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int, min_allocator<int>> c1(a1, a1+sizeof(a1)/sizeof(a1[0]));<br>
std::vector<int, min_allocator<int>> c2(a2, a2);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert(c1.empty());<br>
assert(distance(c1.begin(), c1.end()) == 0);<br>
assert((c2 == std::vector<int, min_allocator<int>>(a1, a1+sizeof(a1)/sizeof(a1[0]))));<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
{<br>
int a1[] = {1, 3, 7, 9, 10};<br>
int a2[] = {0, 2, 4, 5, 6, 8, 11};<br>
std::vector<int, min_allocator<int>> c1(a1, a1);<br>
std::vector<int, min_allocator<int>> c2(a2, a2);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert(c1.empty());<br>
assert(distance(c1.begin(), c1.end()) == 0);<br>
assert(c2.empty());<br>
assert(distance(c2.begin(), c2.end()) == 0);<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
#ifndef _LIBCPP_DEBUG_LEVEL<br>
// This test known to result in undefined behavior detected by _LIBCPP_DEBUG_LEVEL >= 1<br>
@@ -135,11 +172,15 @@ int main()<br>
typedef min_allocator<int> A;<br>
std::vector<int, A> c1(a1, a1+sizeof(a1)/sizeof(a1[0]), A());<br>
std::vector<int, A> c2(a2, a2+sizeof(a2)/sizeof(a2[0]), A());<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
swap(c1, c2);<br>
assert((c1 == std::vector<int, A>(a2, a2+sizeof(a2)/sizeof(a2[0]))));<br>
assert(c1.get_allocator() == A());<br>
assert((c2 == std::vector<int, A>(a1, a1+sizeof(a1)/sizeof(a1[0]))));<br>
assert(c2.get_allocator() == A());<br>
+ assert(is_contiguous_container_asan_correct(c1));<br>
+ assert(is_contiguous_container_asan_correct(c2));<br>
}<br>
#endif<br>
#endif<br>
<br>
Added: libcxx/trunk/test/support/asan_testing.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/asan_testing.h?rev=208319&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/asan_testing.h?rev=208319&view=auto</a><br>
==============================================================================<br>
--- libcxx/trunk/test/support/asan_testing.h (added)<br>
+++ libcxx/trunk/test/support/asan_testing.h Thu May 8 09:14:06 2014<br>
@@ -0,0 +1,37 @@<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef ASAN_TESTING_H<br>
+#define ASAN_TESTING_H<br>
+<br>
+#include <__config><br>
+<br>
+#ifndef _LIBCPP_HAS_NO_ASAN<br>
+extern "C" int __sanitizer_verify_contiguous_container<br>
+ ( const void *beg, const void *mid, const void *end );<br>
+<br>
+template <typename T, typename Alloc><br>
+bool is_contiguous_container_asan_correct ( const std::vector<T, Alloc> &c )<br>
+{<br>
+ if ( std::is_same<Alloc, std::allocator<T>>::value && c.data() != NULL)<br>
+ return __sanitizer_verify_contiguous_container (<br>
+ c.data(), c.data() + c.size(), c.data() + c.capacity()) != 0;<br>
+ return true;<br>
+}<br>
+<br>
+#else<br>
+template <typename T, typename Alloc><br>
+bool is_contiguous_container_asan_correct ( const std::vector<T, Alloc> &c )<br>
+{<br>
+ return true;<br>
+}<br>
+#endif<br>
+<br>
+<br>
+#endif // ASAN_TESTING_H<br>
\ No newline at end of file<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>