*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

суббота, 12 сентября 2009 г.

Ошибка в компиляторе Godegear (Borland) C++ при приведении типов указателей

Тривиальный пример (bcc32_5.93_cast_bug.cpp):
class A {};
class C {};
A* a;
A* b = static_cast<C*>(a);
Компилируем в bcc32.exe (версия 5.93) из Codegear RAD Studion 2007:
bcc32 -c bcc32_5.93_cast_bug.cpp
Падает c internal compiler error:
CodeGear C++ 5.93 for Win32 Copyright (c) 1993, 2007 CodeGear
bcc32_5.93_cast_bug.cpp:
Fatal F1004 bcc32_5.93_cast_bug.cpp 4: Internal compiler error at 0x44b34e with base 0x400000
Fatal F1004 bcc32_5.93_cast_bug.cpp 4: Internal compiler error
Люблю собирать падения компиляторов на стадии компиляции. А у вас есть что-нибудь подобное в загашнике?

8 комментариев:

  1. Если напсать шаблонную рекурсию:

    template <int N>
    struct Recursion
    {
    enum {value = N+Recursion<N-1>::value};
    };

    void main()
    {
    cout << Recursion<5>::value << endl;
    }

    То компилятор Visual Studio 2008 вылетит с ошибкой:
    "Microsoft C/C++ Optimizing Compiler has stopped working." Это конечно не баг компилятора, но все равно интересный случай.
    Пробывал на Visual studio 2010 beta, показывает "fatal error: recursive type ..."
    Другие компиляторы пока не пробывал.

    ОтветитьУдалить
  2. угу, пару месяцев назад зафайлил баг в районе биндингов функций в компиляторе JavaFX. Кто-то из тамошних подтвердил, словами вида "текущая версия тоже падает", но вроде еще не зафиксили :))

    ОтветитьУдалить
  3. На рекурсивном темплейте Borland множественно, но однообразно ругается, но не падает. ;-)

    CodeGear C++ 5.93 for Win32 Copyright (c) 1993, 2007 CodeGear
    r.cpp:
    Error E2489 r.cpp 3: Maximum option context replay depth exceeded; check for recursion in function main()
    Error E2489 r.cpp 3: Maximum option context replay depth exceeded; check for recursion in function main()
    Error E2489 r.cpp 3: Maximum option context replay depth exceeded; check for recursion in function main()
    [поскипано 48 раз]
    Error E2228 r.cpp 5: Too many error or warning messages in function main()
    *** 51 errors in Compile ***

    ОтветитьУдалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. Давно читаю ваш блог, много чего интересного узнал и попробовал (статический анализ, google test, google code style и т.д.). Спасибо!


    Покопался в архивах. Первые в моей жизни (без шуток) строки на Си++ оказались крайне неудачными :-)


    template &lt class foo &gt class bar
    {
    public:
    bar();
    bar::bar (char* baz){};
    };

    Падает Visual C++ из студий: 2003, 2005, 2008 -- все, что протестировал.

    ОтветитьУдалить
  6. зараза, так и не понял как выделить список аргументов шаблона в угловые скобки :-(

    ОтветитьУдалить
  7. Отличный пример, спасибо. Студия успешно валится на:

    template <typename T> class C {
      C();
      C::C(char* p) {}
    };

    Борланд нормально съел.

    ОтветитьУдалить
  8. Обнаружил еще один способ завалить студию (проверено на 2005):

    class Foo : ::std {};


    Нарвался случайно, когда при использовании google test (спасибо, кстати, за заразительные посты) унаследовал ::testing вместо ::testing::Environment.

    ОтветитьУдалить