OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 21:15

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Как писать несопровождаемый код
СообщениеДобавлено: Четверг, 18 Ноябрь, 2010 22:23 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Неплохая инструкция о том, как нужно писать гарантирующий трудоустройство программный код.
http://freeworld.thc.org/root/phun/unmaintain.html

Пара примеров:

Cargill's Quandry
Take advantage of Cargill's quandary (I think this was his) "any design problem can be solved by adding an additional level of indirection, except for too many levels of indirection." Decompose OO programs until it becomes nearly impossible to find a method which actually updates program state. Better yet, arrange all such occurrences to be activated as callbacks from by traversing pointer forests which are known to contain every function pointer used within the entire system. Arrange for the forest traversals to be activated as side-effects from releasing reference counted objects previously created via deep copies which aren't really all that deep.

Lisp
LISP is a dream language for the writer of unmaintainable code. Consider these baffling fragments:
(lambda (*<8-]= *<8-[= ) (or *<8-]= *<8-[= ))

(defun :-] (<) (= < 2))

(defun !(!)(if(and(funcall(lambda(!)(if(and '(< 0)(< ! 2))1 nil))(1+ !))
(not(null '(lambda(!)(if(< 1 !)t nil)))))1(* !(!(1- !)))))

A Real Life Example
Here's a real life example written by a master. Let's look at all the different techniques he packed into this single C function.
Код:
void* Realocate(void*buf, int os, int ns)
{
   void*temp;
   temp = malloc(os);
   memcpy((void*)temp, (void*)buf, os);
   free(buf);
   buf = malloc(ns);
   memset(buf, 0, ns);
   memcpy((void*)buf, (void*)temp, ns);
   return buf;
}
  1. Reinvent simple functions which are part of the standard libraries.
  2. The word Realocate is not spelled correctly. Never underestimate the power of creative spelling.
  3. Make a temporary copy of input buffer for no real reason.
  4. Cast things for no reason. memcpy() takes (void*), so cast our pointers even though they're already (void*). Bonus for the fact that you could pass anything anyway.
  5. Never bothered to free temp. This will cause a slow memory leak, that may not show up until the program has been running for days.
  6. Copy more than necessary from the buffer just in case. This will only cause a core dump on Unix, not Windows.
  7. It should be obvious that os and ns stand for "old size" and "new size".
  8. After allocating buf, memset it to 0. Don't use calloc() because somebody might rewrite the ANSI spec so that calloc() fills the buffer with something other than 0. (Never mind the fact that we're about to copy exactly the same amount of data into buf.)

Некоторые из примеров, к сожалению, попадаются мне в жизни.

Цитата:
If you give someone a program, you will frustrate them for a day; if you teach them how to program, you will frustrate them for a lifetime.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 19 Ноябрь, 2010 08:34 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Александр Ильин писал(а):
Код:
void* Realocate(void*buf, int os, int ns)
{
   void*temp;
   temp = malloc(os);
   memcpy((void*)temp, (void*)buf, os);
   free(buf);
   buf = malloc(ns);
   memset(buf, 0, ns);
   memcpy((void*)buf, (void*)temp, ns);
   return buf;
}

Ещё тут временный буфер temp не освобождается командой free(temp);, что приведёт к утечке памяти.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 19 Ноябрь, 2010 08:49 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Geniepro писал(а):
Ещё тут временный буфер temp не освобождается командой free(temp);, что приведёт к утечке памяти.
Пункт номер 5.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 09:37 

Зарегистрирован: Суббота, 06 Июнь, 2009 07:52
Сообщения: 329
Методы отладки использования памяти. Разоблачение величайшего мифа о проблеме языка С
Цитата:
Вполне возможно написать хороший код профессионального качества, который пройдет проверку lint, но в нем могут оказаться серьезные ошибки, в том числе и некорректная работа с памятью. Убытки из-за проблем с памятью могут многократно превысить стоимость самого дорогого инструмента для синтаксического анализа, поэтому надо вычищать исходный код. Даже если код успешно проверен с помощью lint, вполне вероятно, что существует более элегантный, эффективный, качественный и переносимый альтернативный инструмент.

ВВ? :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 10:38 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
id_ler писал(а):
Ценная ссылочка. Своей авторитетностью. Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 10:49 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Не, не только авторитетность... :)
Там и полезные методики есть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 17:48 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Info21 писал(а):
id_ler писал(а):
Ценная ссылочка. Своей авторитетностью. Спасибо.

А откуда там авторитетность? Этот ресурс славен хреновыми поверхностными статьями ни о чем.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 17:53 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Alexey Veselovsky писал(а):
Info21 писал(а):
id_ler писал(а):
Ценная ссылочка. Своей авторитетностью. Спасибо.

А откуда там авторитетность? Этот ресурс славен хреновыми поверхностными статьями ни о чем.
То есть нету авторитетности? Эх жалко. А то про память так прочувствованно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB