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