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

    +18

    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
    char* GetConnectionName(){return "";}
    //---
    char*  NetworkMgr::getErrorString(int id)
    {
        if(this->idValid(id))
    {
    return errors[id];
    }
    else
    {
    return "!!!unknown error!!!";
    }
    }

    Из тела одного большого класса, я конечно понимаю что строки хранятся не в стеке, но всеравно.

    Запостил: Psionic, 10 Сентября 2012

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

    • По структуре уведомлений об ошибках:
      errors[0] = "!!!unknown error!!!" - не, никак?
      Ответить
      • Китай - хуле...
        Ответить
      • Только в том случае, если диапазон значений id заранее известен или его можно определить в коде. Если же id какая-нибудь китайская dll возвращает, да еще и недокументированная нормально...
        Ответить
    • А это скомпилируется?
      Ответить
      • Ну компилятор предупредит что возвращать адрес локального обьекта не айс, но зделает.
        Ответить
        • А если констами?
          Ответить
        • А где здесь локальные объекты?

          Меня больше смущает то, что литерал это const char *, а возвращаемый тип - char *. Вот на это компилятор точно выругается.
          Ответить
          • Ну хорошо, не обьект, массив, хотя почему не бьект можете написать хоть double d(2.225); Но компилится еще как...
            Ответить
            • Ну за исключением отсутствия const код абсолютно корректен. Я не пойму что не так.

              error же не локальная переменная, строки тоже.
              Ответить
              • да то что он неочевиден, чел видать не догадывается что адрес локального обьекта возвращать нельзя, я знаю что это работает потому что строки хранятся не встеке, но это сегодня компилятор их кладет в секцию .data, а что будет при миграции на другой компилятор или перехода на следующую версию текущего? Я не знаю.
                Ответить
                • Так в стандарт посмотри, если не знаешь
                  Ответить
                • > да то что он неочевиден
                  Если вам этот код не очевиден - идите прочитайте стандарт с++, и прекратите писать хуйню.

                  C++ 98, 2.13.4 пункт 1.
                  An ordinary string literal has type “array of n const char” and static storage duration (3.7), where n is the size of the string as defined below, and is initialized with the given characters.

                  P.S. А вот то, что функция возвращает char * вместо const char * - это и правда говно, и очень-очень плохо.
                  Ответить
                  • Если это говно компилируется, то это реально говно и очень-очень плохо. Если это ошибка компиляции, то это ничего ужасного, это всего лишь КГ/АМ запостившего.

                    *ошибка компиляции, а не компилятора, чтобы понятнее было
                    Ответить
                    • предупреждение: deprecated conversion from string constant to «char*» [-Wwrite-strings]

                      К сожалению. Для совместимости с говном мамонтов, которую, к сожалению, нельзя потерять ;(
                      Ответить
                    • благодаря наследию С, это скомпилируется
                      будет, например
                      warning: deprecated conversion from string constant to 'char*'
                      Ответить
                      • А на каком уровне оно сработает, на /W1?
                        И что будет если поменять символ? Все следующие возвраты будут возвращать изменённую строку?
                        И зачем это было нужно в сишке? В те времена что, указателей на константы не было?
                        Ответить
                        • > А на каком уровне оно сработает, на /W1
                          Про визуалку пусть ответит defecate-plusplus, в gcc -Wwrite-strings включено по дефолту, даже без -Wall.

                          > И что будет если поменять символ?
                          UB. В некоторых случаях краш, в некоторых литерал действительно изменится.

                          > И зачем это было нужно в сишке?
                          const'ов не было
                          Ответить
                          • Проверил в линухе - ошибка сегментирования. Значит в данном случае литералы оказались в сегменте кода.
                            Ответить
                        • > /W1
                          мой ответ тебе не понравится
                          студия слишком горда, чтобы париться о такой никчемной проблеме даже на /W4
                          Ответить
                          • > даже на /W4
                            ответ лежит на поверхности - программисты под Microsoft Windows пишут начисто практически совершенный код, а красноглазые изобретатели велосипедов продолжают страдать байтоебством, экономя std::string, тем самым постоянно наступают на все возможные грабли - потому их медленному компилятору приходится проверять вообще все возможные ошибки, подтирая какашки за начинающими любителями

                            впрочем, последних тоже можно понять - пока эклипс отобразит введенные лишние 6 символов const, можно сходить за дошираком, а когда нет разницы, зачем писать больше
                            Ответить
                            • > их медленному компилятору
                              Что правда, то правда.
                              Ответить
                            • Да, эклипс обосрал так обосрал!
                              Ответить
                              • Поделом ему, никогда не любил эту тормозную хреновину
                                Ответить
                              • Да по-моему, он профессионально накормил говном всю эту швабодную братию.
                                Ответить
          • Да, я про это и говорю.
            Ответить
      • 来吧,试试吧!
        Ответить
        • Скопировал в гугл транслейт. Мне говорят "Ну, дайте ему попробовать". Думаю, к чему здесь это? Потом смотрю, а у вас ещё и восклицательный знак. Вставил, стало "Давай, попробуй". Странная вещь этот ваш китайский гугл...
          Ответить
          • Причём, оригинальную фразу «добейся пробуй» - вообще не смогло адекватно перевести.

            P.S. Был бы гугл мой...ну вы меня понели.
            Ответить
    • А что тут не так? Строка в .data лежит, ты возвращаешь указатель.
      Ответить
      • .rdata *
        Ответить
        • http://govnokod.ru/11736#comment153324
          Ответить
          • @Psionic, я же вам уже сказал: "идите читать стандарт и прекратите писать хуйню".
            http://govnokod.ru/11736#comment153327

            Для особо тупых и не знающих инглиш переведу:
            Литерал имеет точно такое же время жизни, как любая другая статик переменная. Литерал имеет тип const char [n].

            @guest, в гцц под линухом литералы походу уходят в .text, см. выше мой комментарий о краше после попытки поправить что-нибудь в литерале. Недостаток текущего кода - в возврате char * вместо const char *.
            Ответить
            • На момент поста я этого не знал. Так-то!
              Ответить
              • Ну теперь знаете, и это хорошо ;)

                А на будущее - прежде чем написать сомнительное предположение, почитайте, пожалуйста, стандарт или задайте вопрос гуглу. Не стоит лишний раз вводить людей в заблуждение, они же и поверить могут. А с++ и без того сложный язык, в котором и через 5-10 лет работы встречаются новые тонкости.
                Ответить

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