I have encountered a number of mysterious crashes on Windows x64 using 17.0.1 in _DEBUG mode only. In _DEBUG mode on Windows, various STL functions are validated using what are called "checked iterators"
Here is my sample test program. To reproduce, create a Visual C++ 2015 console project, and run in x64|Debug mode.
#include "stdafx.h" #include <list> #include <iostream> using namespace std; int main() { std::list<int> a; a.clear(); for(auto & i : a){// we have an iterator loop here, this forces creation of some sticky iterator data structures in the list cout << i << endl;// some dummy code } a.clear();// Intel Compiler and Visual Studio 2015 compiler behave differently on second clear() return 0; }
/// THE FOLLOWING IS PART OF <list>, list::clear() calls _Orphan_ptr(nullptr) in _DEBUG mode #if _ITERATOR_DEBUG_LEVEL == 2 void _Orphan_ptr(_Nodeptr _Ptr) { // orphan iterators with specified node pointers _Lockit _Lock(_LOCK_DEBUG); const_iterator **_Pnext = (const_iterator **)this->_Getpfirst(); if (_Pnext != 0) while (*_Pnext != 0) { // test an iterator if ((*_Pnext)->_Ptr == this->_Myhead() || (_Ptr != nullptr_t{} && (*_Pnext)->_Ptr != _Ptr)) _Pnext = (const_iterator **)(*_Pnext)->_Getpnext(); else { // orphan the iterator (*_Pnext)->_Clrcont(); *_Pnext = *(const_iterator **)(*_Pnext)->_Getpnext(); } } } #endif /* _ITERATOR_DEBUG_LEVEL == 2 */
when I step into the function list::_Orphan_ptr I see different behavior between Visual Studio 2015 native compiled and Intel 17.0.1 compiled in _DEBUG mode, that is with _ITERATOR_DEBUG_LEVEL=2,
In simple language, if the list is empty, the while() loop should NEVER be entered.
Visual Studio 2015 -> _Pnext!=0, *_PNext=0 , while loop is skipped ( as expected)
Intel Compiler 17.0.1 -> _Pnext!=0, *_PNext=<some random number>, while loop is entered, often causing an access violation.
This may be a bug in the checked iterator code of MS STL or it may be a bug in the Intel Compiler - I am not sure 100% at the moment.