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

0

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

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

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

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

Семь раз отмерь — один отрежь, guest!

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


    8