Кресты / Говнокод #6147 Ссылка на оригинал

0

  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 Aleskey, (Updated )

Комментарии (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 ожидал, что компилятор это отловит.
          Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8