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

    +158

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    std::string get(const std::string& name) {
          NamedPropertyMap::iterator it = properties.find(name);
          if (it == properties.end())
            return false;
    
          std::string ret;
          it->second->Get(ret);
          return ret;
        }

    return false; компилится на ура в VS2008

    Запостил: Aleskey, 30 Марта 2011

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

    • 'return false' "компилится на ура" в чем угодно, ибо спецификация языка считает код корректным. 'false' являеся легальным вариантом null-pointer constant, поэтому данный 'return' эквивалентен 'return NULL' или 'return 0'. Т.е. делается попытка сконвертировать C-шную строку (представленную нулевым 'char *' указаталем) в строку 'std::string'. Другими словами 'return false' в данном контексте эквивалентен

      const char *p = NULL;
      return std::string(p);


      Во время выполнения нулевой 'char *' указатель приведет к падению, а вот с точки зрения компиляции тут все в порядке.
      Ответить
      • g++ 4.1.2
        flags: -O -std=c++98 -pedantic-errors -Wfatal-errors -Werror -Wall -Wextra -Wno-missing-field-initializers -Wwrite-strings -Wno-deprecated -Wno-unused -Wno-non-virtual-dtor -Wno-variadic-macros -fmessage-length=0 -ftemplate-depth-128 -fno-merge-constants -fno-nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid-pch

        выдает:
        std::logic_error: basic_string::_S_construct NULL not valid
        Aborted.

        А вот как заставить ругаться VS2008?
        Ответить
        • В смысле "выдает"? G++ ничего такого при компиляции не выдает. То, что вы процитировали выше, будет "выдано" программой во время выполнения, т.е. данная частная реализация стандартной библиотеки отлавливает ситуацию с нулевым указатаелем и бросает 'std::logic_error' в ответ на null аргумент. Но это - самодеятельность от GCC.

          Библиотека, идущая с VS, отловом такой ситуации не занимается, т.е. вылет будет системный по нарушению защиты памяти. Такое поведение совешенно легально, ибо ничего конкретного (типа бросания 'logic_error') в такой ситуации спецификация не требует. "Заставить" тут ничего не получится.

          А вопрос этот, кстати, известный, обсуждался комитетом
          http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#466
          и в конце концов было решено ничего не менять.
          Ответить
          • gcc 4.6.0
            warning: converting 'false' to pointer type for argument 1 of [шаблонная магия]
            Ответить
          • да, вы правы, проглядел. Это не при компиляции.
            Незнание стандарта не освобождает от ответственности :)
            Ну не ожидал я, что false будет так implicit преобразован.
            Ладно уже с FALSE или NULL, но с false ожидал, что компилятор это отловит.
            Ответить
    • ебать говно
      Ответить

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