| // Evil hack: To simulate memory corruption, we want to fiddle with some internals of std::list. |
| // Make those accessible to us. |
| #define private public |
| #define protected public |
| |
| #include <list> |
| #include <stdio.h> |
| #include <assert.h> |
| |
| typedef std::list<int> int_list; |
| |
| int main() |
| { |
| #ifdef LLDB_USING_LIBCPP |
| int_list *numbers_list = new int_list{1,2,3,4,5,6,7,8,9,10}; |
| |
| printf("// Set break point at this line."); |
| |
| #if _LIBCPP_VERSION >= 3800 |
| auto *third_elem = numbers_list->__end_.__next_->__next_->__next_; |
| assert(third_elem->__as_node()->__value_ == 3); |
| auto *fifth_elem = third_elem->__next_->__next_; |
| assert(fifth_elem->__as_node()->__value_ == 5); |
| #else |
| auto *third_elem = numbers_list->__end_.__next_->__next_->__next_; |
| assert(third_elem->__value_ == 3); |
| auto *fifth_elem = third_elem->__next_->__next_; |
| assert(fifth_elem->__value_ == 5); |
| #endif |
| fifth_elem->__next_ = third_elem; |
| #endif |
| |
| // Any attempt to free the list will probably crash the program. Let's just leak it. |
| return 0; // Set second break point at this line. |
| } |