Форум » C/C++ » Очередной баг MS VC++ 2010: не возможность скомпилировать корректное for предложение » Ответить

Очередной баг MS VC++ 2010: не возможность скомпилировать корректное for предложение

Сыроежка: Обнаружился еще один баг компилятора MS VC++ 2010. Причем этот баг связан казалось бы с уже изученным вдоль и поперек предложением цикла for Рассматривая описание этого предложения в стандарте языка С++, я решил проверить его работу на казалось бы, простом примере, когда используется инициализация в виде объявления и условие цикла также содержит объявление. То есть когда имеет место следующая общая конструкция for ( T1 t1; T2 t2; expression ) Чтобы эта коонструкция была более содержательна и понятна, приведу тот конкретный тестовый код, который я использовалл. [pre]#include "stdafx.h" struct T1 { T1( int i ): x( i ) {} ~T1() {} int x; }; struct T2 { T2( int i ): x( i ) {} ~T2() {} operator bool() const { return ( x != 0 ); } int x; }; int _tmain(int argc, _TCHAR* argv[]) { { int i = 10; for ( T1 t1 = i; T2 t2 = i; i-- ) {} } return 0; }[/pre] У кого имеется в наличии другой компилятор, то данный код следует подкорректировать, убрав майкрософтовскую директиву #include "stdafx.h" и вместо int _tmain(int argc, _TCHAR* argv[]) записать просто int main(). С этими изменениями код будет выглядеть следующим образом: [pre] struct T1 { T1( int i ): x( i ) {} ~T1() {} int x; }; struct T2 { T2( int i ): x( i ) {} ~T2() {} operator bool() const { return ( x != 0 ); } int x; }; int main() { { int i = 10; for ( T1 t1 = i; T2 t2 = i; i-- ) {} } return 0; }[/pre] Я преднамеренно включил два варианта тестового кода, чтобы можно было нужный вариант просто скопировать в редактор исходного кода вашего компилятора. MS VC++ 2010 при компиляции этого корректного примера выдает сообщение о фатальной внутренней ошибке компилятора. fatal error C1001: Внутренняя ошибка в файле компилятора. 1> (файл компилятора "f:\dd\vctools\compiler\utc\src\p2\ehexcept.c", строка 971) 1> Чтобы обойти эту неполадку, попытайтесь упростить или изменить программу в строках около указанной позиции. 1> Для получения дополнительных сведений выберите команду "Техническая поддержка" 1> в меню "Справка" Visual C++ или откройте файл справки технической поддержки. Очевидно, что если бы использовалась некорректная синтаксическая конструкция, то компилятор выдал бы совершенно другое сообщение об ошибке. Чтобы убедиться, что код не содержит ошибок, можно второй вариант этого тестового примера запусьтить в онлайновом компиляторе. Даже как-то странно, что Майкрософт пропустила такой баг, так как, как я полаггаю, должны же быть у них регрессивные тесты, которые проверяют работу основных операторов языка С++. Я послал соообщение о баге в Майкрософт, поэтому ждем, что они поведают по этому поводу.

Ответов - 4

Сыроежка: И, вот, Майкрософт, наконец-то, поведал, что это действительно баг компилятора. Но, сославшись на то, что они сейчас заняты, как я понимаю, выпуском своей визуальной студии 2011, то ничего поделать с этим багом не могут. Похоже, у них сейчас главная задача - это включить в свой компилятор С++ все новые средства, появившиеся в новом стандарте, так как пока MS VC++ 2010 поддерживает их лишь частично, и поскорей выпустить релиз MS VC++ 2011. Боюсь, что он будет содержать все те же баги, что и MS VC++ 2010, плюс новые баги, которые появятся в результате внедрения новых возможностей языка С++. Вот ответ от Майкрософт, где они признают, что это баг, и лукаво говорят, что есть простой способ обхода бага, заменив в управляюшем предложении T2 t2 = i;. на T2( i );. На самом деле это не эквивалентная замена, так как в первом случае создается объект с именем t2, который может использоваться внутри тела цикла, а во втором случае создается временный объект, который тотчас же удаляется и не доступен внутри тела цикла. Ответ Майкрософт: "Thank you for reporting this issue to Microsoft. We can confirm that it is indeed a bug in the compiler but fortunately the workaround is simple. For the test-clause of the loop, instead of writing T2 t2 = i, just write T2(i), which has similar effect. Due to the rarity of the construct and the point we are in the Dev11 release cycle, we regret that we cannot fix this bug for Dev11. Please continue to use the workaround and we'll consider it for a future release. Tanveer Gani Visual C++ Team " на что я им оставил комментарий: "In general T2(i) has no the similar effect as T2 t2 = i, because in the last case a local variable is defined that can be used inside the loop body."

santy: To Сыроежка Объясните, если столько баг в этом компиляторе, зачем его испрользовать? Сколько помню , это постоянно баги, и в 1992 году это тоже были постоянные баги. Хорошо, что был Watcom или на худой конец Борланд.

Сыроежка: santy пишет: To Сыроежка Объясните, если столько баг в этом компиляторе, зачем его испрользовать? Сколько помню , это постоянно баги, и в 1992 году это тоже были постоянные баги. Хорошо, что был Watcom или на худой конец Борланд Компилятор Borland вообще не соответствовал стандарту. У меня есть старый компилятор Borland C++ Builder 5.0, который я до сих пор использую для написания простеньких примеров, так там, например, стандартная библиотека для контейнеров std::map и std::multimape вообще содержит ошибки компиляции, что функцию-член этих контейнеров find нельзя запускать. Я ее заменяю функцией-членом equal_range , когда в учебных целях для себя делаю примеры из книг. Главное нарекание к Borland со стороны его пользователей всегда было недовольство тем, что их компилятор не соответствует стандарту и содержит не меньше багов, чем MS VC++. То есть по сравнению с MS VC++ по соответсвию стандарту Borland всегда отставал. В связи с этим Borland теряла клиентскую базу и вынуждена была продавать это подразделение, которое занимается средствами разработки. К сожалению у пользователей выбор небольшой. Важную роль также играет цена продукта, то есть соотношение цена/качество. Я, например, приобрел MS VC++ 2010 для профессионалов за 200 долааров. А обновленнный пакет от Borland (сейчас это уже другая фирма, которая владеет пакетом) предлагается по цене порядка тысячи долларов. Они меня уже закидали рекламой со своими предложениями, так как я у них как-то зарегистрировал приобретеный пакет то ли ассемблер TASM, то ли C++Builder 5.0. Естественно, тратить такие деньги на пакет, тем более, что там есть Дельфи, который мне совершенно не нужен, не имеет смысла. Почему покупают продукт Майкрософт? Во-первых, достаточно дешево (помимо Borland могу упомянуть компилятор С++ от Intel, который предлагался за 300 долларов). Во-вторых, широкий набор средств в пакете. Ведь помимо С++ туда входит и C#, который пользуется популярностью. Кроме того относительно удобная среда разработки, подписка на MSDN, библиотека MFC. Поэтому с учетом этих всех факторов компилятор Майкрософйт по сравнению с другими компиляторами выигывает. Хотя естественно, кому все эти примочки для Windows не нужны, и кто в основном имеет дело с Unix-подоными системами, то они используют свободно распространяемые компиляторы. Но те ттоже не лишены багов.


santy: Согласен. Цена на продукты Delphi, С++Builder немного зашкаливает. Хотя кому как. Судя по тому сколько продуктов пишется на Делфи и на С++ Билдере, значит либо цены подходят, либо не подходять, но всё равно используют .



полная версия страницы