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

    +174

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    const char * strtime(const time_t * t){
    	tm tt;
    	const int dt_len = 60;
    	char str_dt[dt_len];
    	localtime_r(t, &tt);
    	strftime(str_dt, dt_len, "%d.%m.%Y %H:%M:%S", &tt);
    	std::string str(str_dt);
    	return str.c_str();
    }

    Код, как ни странно, работал несколько лет, пока проект не трогали и байты не сместились. Неудивительно, что код вместо времени стал возвращать имя функции, из которого вызывался.

    Запостил: Deacon, 04 Апреля 2011

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

    • показать все, что скрытоГовно в недостающих аргументах у strftime?
      Ответить
      • Говно в возврате указателя на локальную переменную. Классика жанра.
        Ответить
    • как это "работал несколько лет"? и никто ничего не замечал?
      Ответить
    • Классика. Хотелось бы, чтобы при освобождении памяти тут же затирались случайным мусором хотя бы первые несколько байт. Тогда бы подобное сразу посыпалось.
      Ответить
      • Не эффективно это. Затирать сразу. Тут либо быстродействие, либо безопасность.
        Ответить
        • Можно так: в дебаге память затирается сразу - так легко отлавливаются подобные ошибки. В релизе потерь эффективности нет.
          Ответить
          • Хороший подход. Но всё равно с очисткой в дебаге - палка о двух концах: не инициализированные данные например в ноль установились и ошибок не видно, а в релизе вылезает всякий мусор, а потом пойди пойми откуда он лезет, без отладочной информации-то.
            Ответить
            • Так не в 0 нужно устанавливать. А в случайный мусор, чтобы валилось пораньше.
              Ответить
              • Так я про реальную ситуацию говорю.
                Ответить
                • Ну вот я и хочу, чтобы это стало реальность. Не заметать мусор под ковёр надо, а делать более заметным, чтобы убрать.
                  Ответить
        • Самый дешёвый free/delete как минимум добавляет освободившийся кусок в список свободных — а это по крайней мере одно чтение и две записи. Ещё одна запись — не критично.
          Ответить
          • > Ещё одна запись — не критично.
            Совершенно нехарактерный для С/С++ подход.
            Ответить
            • assert, delete[]. Иногда стоит платить небольшую цену.
              Ответить
              • Так это уже ручные средства. А мы вроде бы о подходах для среды разработки: компиляторов, отладчиков ..
                Ответить
                • В смысле «ручные»? Даже включение оптимизации требует ручного задания опции, и чтобы assert-ы отключить тоже нужно специально сказать.
                  Ответить
                  • Ручные в смысле того, что их надо явно вставлять там, где требуется проверка. Про delete[] я правда не понял, к чему это в данном контексте. То, что не надо забывать удалять массив не так как скалярную величину? А вот то, что Вам хотелось бы чтобы стало реальностью - это как раз предмет беседы.
                    Ответить
    • Проблема Две Тысячи же!
      ЗЫ кто не знаком: http://lurkmore.ru/Проблема_2000
      Ответить

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