Издеваемся над студией: шаблонная main

Тема в разделе "LANGS.C", создана пользователем _DEN_, 14 фев 2010.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1. #include <string>
    2.  
    3. template <class T>
    4. T main()
    5. {
    6.     return T();
    7. }
    8.  
    9. void foo()
    10. {
    11.     static_cast<std::string (*)()>(&main);
    12. }
    При выходе из main прога падает. Судя по всему при линковке с майном не проверяется тип возвращаемого значения.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    я не шарю, а это должно работать? )
     
  3. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    И чо аффтар хотел всем этим сказать?
     
  4. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Ого. Никогда бы не подумали, что это слинкуется. Похоже, для символа "main" сделаны некие исключения, поскольку в объектнике имя этой функции не заманглилось и имеет вид "_main".

    Падение, кстати, происходит не при выходе, а при вызове конструктора:
    Код (Text):
    1. 0:000> u .
    2. test!main [c:\users\mal\desktop\test.cpp @ 5]:
    3. 004010b0 push    ebp
    4. 004010b1 mov     ebp,esp
    5. 004010b3 mov     ecx,dword ptr [ebp+8]
    6. 004010b6 call    test!ILT+5(??0?$basic_stringDU?$char_traitsDstdV?$allocatorD (0040100a)
    7. 004010bb mov     eax,dword ptr [ebp+8]
    8. 004010be pop     ebp
    9. 004010bf ret
    10.  
    11. 0:000> g
    12. (cc0.9b0): Access violation - code c0000005 (first chance)
    13. First chance exceptions are reported before any exception handling.
    14. This exception may be expected and handled.
    15. eax=00000000 ebx=7efde000 ecx=00000001 edx=0008e3b8 esi=00000000 edi=00000000
    16. eip=0040116d esp=0018ff18 ebp=0018ff20 iopl=0         nv up ei pl zr na pe nc
    17. cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
    18. test!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy+0x5d:
    19. 0040116d mov     dword ptr [ecx+18h],0Fh              ds:002b:00000019=????????
    20.  
    21. 0:000> k
    22.  # ChildEBP RetAddr  
    23. 00 0018ff20 004010f5 test!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy+0x5d
    24. 01 0018ff38 004010bb test!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> >+0x25
    25. 02 0018ff40 0040158b test!main+0xb
    26. 03 0018ff88 772c3677 test!__tmainCRTStartup+0xfb
    27. 04 0018ff94 77d39d72 kernel32!BaseThreadInitThunk+0xe
    28. 05 0018ffd4 77d39d45 ntdll!__RtlUserThreadStart+0x70
    29. 06 0018ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
    Хотя можно допустить, что при определённых данных на стеке падение произойдёт где-нибудь в crt после выхода.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Ursus
    Я тоже не понял, бред это. Да майкросфт ацтой, но что на это скажет VS 2010?
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Падает из-за несоотвествия конвенции вызова. В данном случае подмена типа возращаемого значения вовсе не безобидна - возврат структуры string выполняется не через регистры, а через неявный аргумент-указатель.
     
  7. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    на вскидку стеку пипец.....
     
  8. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    П.С, попробуй в релизи компильнуть, так как в дебужном стек чекается....
     
  9. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    >на вскидку стеку пипец.....
    Это не стеку пипец – это вызывается конструктор для стринга, расположенного по адресу "1". Как заметил green, возврат стринга выполняется через неявный аргумент – т.е. в данном случае самый первый аргумент функции main расценивается как адрес, по которому нужно создать структуру. CRT же первым аргументом для main делает количество аргументов (int argc). Таким образом, если вызвать программу с $10000 параметров, то, теоретически, она не упадёт ;p
     
  10. Ox8BFF55

    Ox8BFF55 New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2009
    Сообщения:
    181
    Sol_Ksacap не посмотрел ваш пост... (((