STL Bugs Fixed In Visual Studio 2012


Visual C++

After Pat’s post last week about MFC bugs fixed in Visual Studio 2012 (aka VC11), I thought that a similar list for the STL would be interesting:

492128std::locale constructor modifies global locale via “setlocale()”
492561STL streams cannot be used concurrently
498533iostreams should use codepage of their imbued locales instead of the current c locale
506966New warning 4986 prevents clean compile at warning level 4
524342Implement std::max_align_t in Visual C++
532883Visual C++: int_fast8_t Not Always Signed
532897Problems constructing a bitset from an unsigned long in the VC RC
533131Bug in std::deque. Non-conforming invalidation of iterators after pop_front()
533464The <initializer_list> header in the VC10 release candidate
534457C++ map<tuple<…>, V> compilation problems
534756std::is_function does not work on rvalue reference types
539946search_n fails with a Debug Assertion
540098Problem with non-const operator() and bind
540813Add support for the new C++0x library
541226C++ Defect Report 445 Implementation
548693Visual C++: numeric_limits<char> min/max incorrect when using /J
552541Library or compiler bug with Visual C++ 2010
553629Visual C++ forces conversion to char in push_back
556348C++ compiler NULL broken??
557117std::unordered_set equality comparison broken in Visual C++ 2010
558044std::copy should not check _Dest when _First == _Last
558339tr1:regex has different behavior between vs2008 and vs2010 on some regular expression
558993std::pair members are not members of std::pair
560987In Visual C++ 2010, std::tr1::shuffle_order_engine incorrectly defines min and max members, rendering the class (and std::tr1::knuth_b) unusable
560994In Visual C++ 2010, std::tr1::discrete_distribution and std::tr1::negative_binomial_distribution are missing nested input_type types, making them unusable with std::tr1::variate_generator
565500Crash in C++ runtime when compiling with /MDd and /vd2 switch
565748Include support compile-time rational arithmetic specified in C++0x
566516std::ifstream/std::ofstream change double value
567859Visual C++: std::unordered_map Destructor Performance in Debug Configuration
568054std::use_facet interferes with subsequent call to FatalExit
569997[VC10] Compiler refers to std::shared_ptr as std::tr1::shared_ptr
571397C++ setfill Can’t Be Applied To wofstream – Irritating Error Message
576750[C++0X] std::to_string is non conforming
577672iterator assignment operator crashes in debug builds due to stl changes in vc10
596771type_info::before returns type of int and not bool
598887const const_iterator cannot be supplied to set::insert
603381VS2010 STL for_each implementation breaks existing code
606746Incorrect Overload Resolution
616702operator>> for basic_istream crashes with multibyte character set as locale
616827Nested std::bind functions give bad error (with no reference to the file being compiled)
618807Calling a bound lambda through a std::function variable
621653Including stdint after intsafe generates warnings
626291STL hash element cannot hash custom allocated strings
627639std::fstream use 32-bit int as pos_type even on x64 platform
628197std::string::erase is stupidly slow when erasing to the end, which impacts std::string::resize
633905Visual C++: Ill-Formed unique_ptr Function Call Syntax
635833std::uniform_int_distribution and std::uniform_int not returning correct values
635837Low value of std::uniform_int_distribution and std::uniform_int not appearing when it’s set to a negative number
640602VS2010 Debugger: watching std::string with _ITERATOR_DEBUG_LEVEL = 0 does not work
640619Move-construction can slice objects
640961Visual C++: Argument Forwarding Bugs in std::bind Function Callers
641845std::regex bug in vs2010
642277std::regex bug in vs2010
642557[random] uniform_int_distribution can produce out of range results
642600system_error::what() returns incorrect value
645116VC10 STL: emplace functions are not implemented for more than 1 parameter
645641tr1 regex crashes in debug builds due to illegal use of iterator
646532strsafe.h triggers many warnings with STL header files
648543tr1::regex doesn’t match a valid pattern with repetition
649268std::bind and std::function generate a crazy number of copy.
649274std::bind and std::function are not move-aware
649531Compile error when explicitly instantiating shared_ptr
650567Unhomed std::locale::facet and std::locale::_Locimp destructors cause crashes
651285std::ref works incorrectly with classes that overload operator &
668921std::numeric_limits<float>::max_digits10 value of 8 is wrong and should be 9
671328Visual C++: User-Defined Bind Expressions with std::bind
674424tr1 regex case-insensitive search not working
674652non-conformant behavior of std::minmax in MSVC 2010
680313std::merge invalidates source data because it uses move semantics
683483MFC C++ fails to compile use of codecvt_utf8 in Debug Configuration
685726INT64_C and UINT64_C should be defined in more cross-platform way
688731std::bind with std::reference_wrapper<T> argument doesn’t work on function object with template operator()
688797std::thread crashes with error “f:\dd\vctools\crt_bld\self_x86\crt\src\thr\mutex.cpp(206): unlock of unowned mutex”
689342unordered_map thousand time slower than the vc++ 2010 version
689689Visual C++ (VS2010): Incorrect returned value of uniform_int_distribution
692248Visual C++ ostringstream & ios_base::app broken
692988std::vector::resize should take a const reference
694663Check inside std::vector::_Reserve() triggers integer underflow and fails to detect invalid parameter passed to std::vector::resize()
694704std::vector::reserve() contains a suboptimal check against max_size
694705std::vector::_Insert() contains a suboptimal check against max_size
694881std::vector::_Reserve() contains a suboptimal check against max_size
694887std::vector::_Insert_n() contains a suboptimal check against max_size
695529std::exception_ptr does not satisfy the requirements of NullablePointer
696109std::pair move constructor not standard conformant, potentially dangerous behavior for pair of references
696151std::reference_wrapper does not work with lambda functions
696316Typo in std::deque::resize() comment
698286std::begin and std::end ADL lookup failure
705089C++ std::atomic<> missing constructor
705152This instantiation of std::codecvt template does not meet standard requirements for std::codecvt::out
705993Incorrect Type Name references in defaultvis.natvis visualizers for standard library
707067Failed to parse expression: class “std::_Ref_count_base” has no member “Uses”
712897Invalid ## arguments in _VAR_TYPE in xstddef
712984std::uniform_int_distribution produces incorrect results when min0 is negative
714853valarray operator[] const
716468Heap corruption when CObject-derived class throws from constructor when being called from make_shared
716995std::make_shared needs default constructor to compile
718865STL: hypot not hoisted into the std namespace by cmath
721456Debugger cannot display content of the std::string – “<Error reading characters of string.>”
721786stdint.h UINTPTR_MAX has the same value as UINT32_MAX for 64-bit platforms
723427Compile error in mutex
726398Creating threads using std::thread class causes application crash
727368std::reference_wrapper fails to wrap reference to object of abstract class
727374std::exception_ptr only partially comparable to null
729760std::async fails compilation for Callable with two or more arguments.
730454Emulation of variadic templates in C++11 standard library does not work
732529std::result_of not working with functors
733204std::map Debug Visualisers not working for vs2011
733222Compiler error on <mutex>:304
733729debug assertion “string subscript out of range” is incorrect for [size()]
734888shared_ptr in unordered_set
735224VS2011 Beta fires assertion about unlocking of unowned mutex
735731std::async(std::launch::async, …) does not behave as std::thread(…)
735732STL Vector of Vector Insertion Problem
735875Wrong output in std::put_time
736356No more than two arguments can be passed to <future> : async.
736924Packaged task & thread compile error bug
737812std::thread does not accept std::move
738919std::locale::global() / std::locale() thread-safety issue
739016std::make_shared call error (c++)
742642Ambiguous use of the overloaded function std::string to_string(int val);
742856BUG with std::async ?
742965Operator < incorrect for tuples with more members than _VARIADIC_MAX
745614<system_error>: error C2382 when compiling with ‘/Za’ (Disable Language Extensions)
745643error C2382 on “std::generic_category”, “std::iostream_category”, “std::system_category”
745967Compiler Error C2382 with Standard Header File <system_error> in Visual C++ 2012 RC

A few notes on various arcane topics:

This list of 127 bugs consists of all of the bugs that I could find in our “old database” and “new database” (we use Team Foundation Server for bug tracking and version control, but we switched TFS databases a couple of years ago, making archaeological expeditions “fun”) which were created by Connect, filed against the C++ Standard Library, resolved by me as Fixed, and fixed between VC10 SP1 and VC11 RTM.  It’s reasonably comprehensive, but it might not be absolutely exhaustive.  I have intentionally excluded all non-Connect bugs (the grand total of fixed bugs found by Connect, myself, and other MS employees is roughly 330 – and that doesn’t count things that were really bugs but never tracked as such) and private Connect bugs (a few people who file Connect bugs mark them as private, which prevents the world from seeing them – I recommend against doing this unless the bug’s repro somehow contains information that you don’t want the world to see).  Additionally, I have made no attempt to group bugs resolved as fixed that are actually duplicates (e.g. the many uniform_int_distribution bugs, fixed by a comprehensive rewrite).

I have presented the bugs’ original titles from their submitters, although they’re often renamed internally.  This is almost never interesting (there is a certain format that I like, so my bugs sort nicely), but I can share one exception.  Connect#533464 arrived as “The <initializer_list> header in the VC10 release candidate”.  I improved this to “<initializer_list>: Zombie header hungers for our delicious brains”.  (In VC10, I screwed up by leaving a nonfunctional <initializer_list> header in the product.)

Finally, you may be wondering where all of these bugs come from.  (I take all STL bugs personally, and I’d hate for someone to see this list and go around thinking “wow, the STL sure is buggy”.)  Our STL implementation is very solid, but it is also very large and must deal with an enormous variety of complicated situations.  C++11 churn has led to two categories of bugs: those where the Working Paper said something bogus at the time that we implemented it (e.g. this happened with to_string(), bitset, and async()), and those where it permits more complicated inputs than we’ve had to deal with before (typically rvalue references and movable-only types).  Totally new features (e.g. atomics/threads/futures) arrive with totally new bugs.  There’s the perennial gotcha of users doing “weird stuff” (e.g. obscure compiler switches like /J and /vd2).  And because the STL has no control over how demanding its users’ performance requirements are, things that would be evil premature optimizations in ordinary application code are treated as totally legitimate performance bugs in the STL.  (A number of micro-optimizations in vector were suggested by a user and implemented in VC11, for example.)

The bottom line is that we’re continuously improving the STL, so you should always upgrade to the latest major version and service pack as soon as possible – and that reporting bugs through Microsoft Connect really helps.

Stephan T. Lavavej
Senior Developer – Visual C++ Libraries



Comments are closed. Login to edit/delete your existing comments