Забавные баги и особенности в Visual Studio и .NET

    image
    В этой небольшой статье хотел бы с вами поделиться парой забавных багов (или особенностей) Visual Studio\.NET и возможно услышать от вас о некоторых других. Конечно же самих багов в вышеупомянутых продуктов на самом деле было (есть) много и найти их можно на специализированном сайте connect.microsft.com. Я же хотел рассказать о самых забавных на мой взгляд.


    Волшебные символы

    С первым багом я столкнулся лично на проекте Jabber-клиента на WPF – при попытке получить тему с какой-то конференции на Jabber.ru клиент тупо зависал. Потратив много времени на отладку, я убрал TextBox, отображающий текст этой самой темы и всё заработало, т.е. локализовал баг в самом отображении текста на UI. Понемногу вырезая символы из текста нашёл, что проблемными являются символы "ﻠ́ﭑ". Оказалось, что при попытке вставить эти символы в любое WPF приложение (в частности, редакторы кода в Visual Studio 2010) оно сразу же падает либо насмерть зависает (на Silverlight не воспроизводилось). Баг был отправлен на connect.microsoft.com, там выяснили что это баг в рендере арабских шрифтов в DirectX и затем исправили (было это года 2 назад). В Visual Studio 2012 уже не воспроизводится. На jabber.ru кстати уже не разрешают вставлять арабские символы заменяя их на звездочки (а раньше вообще писали автоматический неполиткорректный ответ, цитировать который я не буду).
    Резюме: вставьте "ﻠ́ﭑ" в Visual Studio 2010 или любое другое WPF приложение.

    Число зверя

    Попробуйте скопировать следующую строчку в Visual Studio, затем закомментировать и снова откомментировать:
    int אב = 666;
    Не буду ничего описывать – просто попробуйте.

    Генерики, генерики, генерики!

    Создайте простой консольный C# .NET проект и вставьте в любое место следующий код:

    class X<A, B, C, D, E> { class Y : X<Y, Y, Y, Y, Y> { Y.Y.Y.Y.Y.Y.Y.Y.Y y;} }

    После долгой компиляции увидите, что размер результирующей сборки с пары килобайт неожиданно вырос в 29мб (!). У меня так и не получилось открыть эту сборку рефлектором, так что можно сказать, что это один из вариантов обфускации :-). В Java с таким кодом, насколько мне известно, дела ещё хуже.
    «Ослабим» конструкцию до

    class X<A, B, C> { class Y : X<Y, Y, Y> { Y.Y.Y.Y.Y.Y y;} }

    и посмотрим, что покажет нам dotPeek («рефлектор» от JetBrains): Результат на pastebin.com. Думаю, вы уже поняли что это «особенность» компилятора, разворачивающего Y.Y.Y.Y.Y.Y y.

    А какие забавные баги знаешь ты, %username%?
    PS: Простите за громкое название, это всё же баги не Visual Studio, а низ-лежащих инструментов, но я просто так объединил их.
    PS2: 2ой и 3ий баг подсмотрел в конференции dotnet@conference.jabber.ru

    Комментарии 42

      +3
      > вставьте "ﻠ́ﭑ" в Visual Studio 2010 или любое другое WPF приложение.
      > В Visual Studio 2012 уже не воспроизводится.
      VS 2012 Express, воспроизводится, студия падает.
        +1
        А ведь поправили 2 года назад :-).
          +2
          В то же время у меня VS 2010(10.0.30319.1) не падает.
            0
            В 2008 тоже не падает.
              0
              2008 не использовала WPF для редакторов.
                +2
                Придётся поставить 2010/2012 чтобы попробовать новые баги.
          +5
          баг в рендере арабских шрифтов в DirectX

          наверное не только от Visual Studio зависит
          +2
          ошибка — connect.microsft.com
          +12
          Не буду ничего описывать – просто попробуйте.

          А мне не в чем попробовать :( Можно же было хотя бы скрин в спойлере вставить.
            +1
            Надо в динамике смотреть. Имя переменной и её значения начинают хаотично меняться местами.
              +3
              Запишите видео и сделайте из него гифку.
                0
                Ниже уже написали где ещё можно воспроизвести.
                –4
                Еще эту строчку нельзя скопировать с хабра и вставить в студию методом Ctrl+C, Ctrl+V.
                  +1
                  У меня при вставке переменная и значение сразу поменялись местами.
              +6
              С «числом зверя» все просто — VS в комментариях применяет правила для языков, которые пишутся справа налево. Там хитрые правила по поводу того, как смешивать в одной строке текст разных направлений, вот они и включаются.
                0
                На удивление, это работает и в окне «Выполнить», которое вызывается по Win+R при стирании имени переменной для замены на другое. Проверено на Win 7
                UPD начинает глючить даже в строке адреса хрома. Видимо можно воспроизвести во многих полях ввода.
                  +2
                  Так там тоже работает эта штука, с направлением текста. Ты в этой строке еще курсор подвигай стрелками, вообще жесть как они там живут с этими языками :)
                    0
                    Просто ОС переворачивает символы в слове, чтобы оно читалось справа налево. А при выделении символа курсором он «возвращается на место», в порядке ввода.
                    +1
                    В Eclipse (Linux) тоже воспроизводится :)
                  • НЛО прилетело и опубликовало эту надпись здесь
                    +3
                    Если вставить следующий код

                    var x = __arglist(0);
                    

                    в исходный код открытого проекта на C#, то это приведет к необработанному исключению в IDE. Также проект с вышеупомянутым кодом приводит к ошибке в MSBuild. Данной ошибке подвержены Visual Studio 2008, 2010 (может быть и предыдущие версии, не тестировал).
                      0
                      +2012
                        0
                        Подскажите, на какой редакции и версии вы смогли повторить эту ошибку для линейки Visual Studio 2012? На редакции Ultimate с Update 1 и без него у меня не получилось воспроизвести. Думал, что эту ошибку уже исправили.
                          0
                          Ultimate 11.0.50727.1 RTMREL
                        –1
                        А в связи с чем это может быть связано?
                          0
                          Возможно, это связано с IntelliSense, в любом случае на момент регистрации ошибки на Microsoft Connect команда Visual Studio отказалась исправлять ошибку до выпуска следующей линейки продукта, дословно:
                          Unfortunately, we won't be able to clean up __arglist bugs, even if they crash the IDE. By its nature, __arglist is an unsupported feature, and we've chosen to live with some rough edges in the compiler and the editor to allow us more time to focus on other bugs.
                            +3
                            __arglist — зарезервированное «ключевое слово» (одно из), официально недокументировано и используется для внутренних нужд. Вот подробнее: bartdesmet.net/blogs/bart/archive/2006/09/28/4473.aspx
                            Падает видимо потому, что студия пытается сделать что-то, что разрешено разработчикам, но потом запрещено в релизе.
                          0
                          Не скажу, что этот баг забавный, но всетаки… В VS 2010 некорректно работало преобразование типов (если не ошибаюсь, double <=> unsigned long long), в результате чего пришлось гуглить костыль, который этот баг может обойти. Баг был исправлен только в VS 2012.
                            0
                            В VS2008 был странный баг. Насколько помню, если сделать рекурсию в публичном свойстве, типа
                            public int Prop { get { return Prop; } }
                            студия вылетала мгновенно, без задержек и предупреждений.
                            К сожалению, в 2012 не смог повторить.
                              0
                              Побуду кэпом: насколько я понимаю, должна не студия упасть, а приложение по StackOverflowException.
                                +1
                                На самом деле, скорее всего эта бага проявляется в дебаг-режиме — я кажется ловил подобную. То ли в списке локальных переменных (автоматических, watch etc), то ли при наведении на свойство. Дело в том, что у VS более-менее адекватный дебаг, который полностью отображает значение свойства, вычисляя его. Видать где-то провтыкали ловлю StackOverflow
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Ещё помню на одном проекте (не помню из-за чего именно) проект не хотел компилировать из-за слишком длинных путей. Приходилось варварски сокращать.
                                +3
                                В Java не так чтобы сильно хуже.

                                class X<A, B, C, D, E> { class Y extends X<Y, Y, Y, Y, Y> { Y.Y.Y.Y.Y.Y.Y.Y.Y y; } }

                                Никаких файлов не создаётся, сразу же выдаётся ошибка

                                X.java:2: error: UTF8 representation for string "LX<LX<LX<LX<LX<LX<LX..." is too long for the constant pool
                                    class Y extends X <Y, Y, Y, Y, Y> {
                                    ^
                                1 error

                                Сигнатура поля получается длиннее 64К символов и не может быть упакована в специальную форму UTF-8.

                                class X <A, B, C, D> { class Y extends X <Y, Y, Y, Y> { Y.Y.Y.Y.Y y; } }

                                Создаёт class-файл в 22 килобайта.
                                  +3
                                  Не совсем баг, но до сих пор заставляет меня улыбнуться: connect.microsoft.com/VisualStudio/feedback/details/745767/menu-is-all-caps
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                      0
                                      У меня IntelliSense перестаёт работать в редакторе XAML и вообще перестаёт работать дизайнер Windows Phone, если к DataContext страницы привязан объект, реализующий интерфейс IDataErrorInfo. Но это не забавно, это дико раздражает.
                                        +2
                                        Было давно, еще в VS 2005, если не ошибаюсь, при редактировании яваскриптов нельзя было писать русскую букву «л» в комментариях
                                          0
                                          В VS2010 при каких-то условиях окно поиска вытягивалось в длину до неимоверных размеров, выходя за пределы экрана.
                                          В SP1 что-то не замечал.
                                            0
                                            int אב = 666;

                                            Цифры тут могут быть любые. И это бага/фича не VS, а Винды скорее всего.
                                            Вставь в Скайп int אב = 666; и в чате выделите мышкой אב то будет такая же шутка.
                                              0
                                              В VS2010 SP1 есть проект ВинФормс на .NET 4.0. Создаете класс, допустим public sealed partial class ClassName и после создания пары методов создаете деструктор: пишем private ~ далее идем к имени класса и копируем через Ctrl+C — Студия падает.

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое