1. C++ / Говнокод #12017

    +15

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    #include <iostream>
    #include <cxxabi.h>
    #include <typeinfo>
    
    int main(void)
    {
       uint8_t i = 63;
       int  status;
    
       std::cout << i << std::endl;
    
       char *realname = abi::__cxa_demangle(typeid(i).name(), 0, 0, &status);
       std::cout << "Real type of uint8_t is: " << realname << std::endl;
       delete (realname);
    
       std::cout << (unsigned int)i << std::endl;
    
    return 0;
    }

    ...нативный 8bit-ый беззнаковый int.

    Запостил: sayidandrtfm, 28 Октября 2012

    Комментарии (33) RSS

    • http://ideone.com/FhtaEU
      > ?
      > Real type of uint8_t is: unsigned char
      > 63
      А что не так?
      Ответить
      • Какое поведения ожидать от переменной, тип которой uint8_t ?

        Так и представляю:
        - А может запилим 1байтные инты, а?
        - Да нафиг. Сами, из чаров прикастуют...
        Ответить
        • > ?
          Да, ступил, символ "?" действительно выглядит подозрительно для "uint8_t". Плюсую топик.

          P.S. Сказалась совместимость с Си, как всегда не в лучшую сторону.

          P.P.S. Кроме стримов практически нет перегрузок, которым нужно отличать unsigned char от uint8_t, поэтому проблема не так и ужасна, как кажется.
          Ответить
          • Шахматы и разводки Инновации и совместимость — опасная смесь.
            Ответить
    • free а не delete!
      Ответить
      • Да, замечание уместно:
        Returns:
        A pointer to the start of the NUL-terminated demangled name, or NULL if the demangling fails. The caller is responsible for deallocating this memory using
        free.
        Ответить
    • Зачем вообще сделали этот демангл? Пару байт сэкономили?
      Ответить
      • > Зачем вообще сделали этот демангл?
        Вы наверное имели в виду зачем сделали мангл?

        Ну как-то же надо сделать, чтобы различные с++ функции имели различные имена при экспорте. Написать туда что-то красивое в духе "void main(int argc, char **argv)" все равно не получится из-за ограничений по именованию, налагаемых компоновщиком, который переделывать нежелательно. Читать всякие TvoidFmainTintVargcTPPcharVargv вам все равно будет неприятно, поэтому они немного ужали запись, сократив стандартные типы до одной буквы...
        Ответить
        • просто альтернативные компиляторы не морочат пользователю голову с machine-friendly именами - сразу отдают человеческие
          Ответить
          • В вижуалке typeid возвращает раздемангленное имя? А что, респект им за это. Особых минусов в таком решении не вижу, только плюсы.
            Ответить
          • Кстати, нет ли у вас на примете какой-нибудь небольшой кроссплатформенной либы для вывода крестоблядских стектрейсов?
            Ответить
            • у меня - нет
              стектрейсы - это в дебаге должно только работать, нет? при этом зависеть от формата этой дебажной информации?
              меня в релизе спасают только ручками сделанные логи разной степени подробности, а таким передовым технологиям мы не обучены
              Ответить
              • Да, без дебажной инфы это, к сожалению, работать не будет. Причем сейчас почитал, в gcc даже при ее наличии static функции не расшифровываются, а остаются тупо адресами.

                Так что придется оставить стектрейсы жавоёбам, и продолжать юзать логи разной степени подробности...
                Ответить
              • >стектрейсы - это в дебаге должно только работать, нет?
                В релизе конечно. А так программа упала, прислала инфу о падении на сервер вместе с стектрейсом и я её поправил. Пользователь обновил программу с того же сервера.
                Ответить
              • Для гцц под линью получилось примерно такое:
                http://ideone.com/n6LLqC

                Если скомпилить с -rdynamic, выдает довольно красивый трейс:
                Exception caught: Test runtime error
                  at ./a.out(Test::test()+0x1f) [0x804934f]
                  at ./a.out(main+0x1b) [0x804928b]
                  at /lib/libc.so.6(__libc_start_main+0xe5) [0xb75ec6a5]
                  at ./a.out [0x80491a1]


                P.S. Это говнишко достойно отдельного треда?
                Ответить
                • Достойно.
                  #include <execinfo.h>
                  namespace c {
                  #include <execinfo.h>
                  #include <malloc.h>
                  #include <string.h>
                  }
                  #include <malloc.h>
                  Привет хедергуарду #pragma once и я сильно не уверен, но возможно и ODR
                  Ответить
                  • Еще забыл exception от dynamic_cast обработать. Если в backtrace::show передать не backtraced<T>, все падает.

                    С неймспейсом С просто грязный хак, потому что хотелось назвать класс backtrace. Я знаю, что это очень нехороший поступок, и раскаиваюсь в этом.
                    Ответить
                  • http://ideone.com/imE7sW
                    * Пофиксен баг с выводом экцепшенов без бектрейса
                    * Причесаны хидеры

                    P.S. Лишний раз убеждаюсь, что второпях код писать вредно.
                    Ответить
            • How to generate a stacktrace when my gcc C++ app crashes?
              http://stackoverflow.com/questions/77005/how-to-generate-a-stacktrace-when-my-gcc-c-app-crashes
              Ответить

    Добавить комментарий