LINUX.ORG.RU

C, что это?


0

0
Вот втретилось в чужом коде одна необычная (для меня) вещь. В структурах есть поле, содержащее адрес этого же самого экземпляра структуры. Названо оно там guard и выглядит это примерно так:

struct item {
struct item* guard;
};

И в функциях, в которые такая структура передаётся по указателю, есть примерно такой код:

void process_item (struct item* i)
{
if (i->guard != i) {
error ();
};
}

Что это за идиома такая? По какому названию спрашивать о ней у гугла? Насколько оправдано её применение? Ну и вообще кто что думает об этом? Автора кода сейчас уже не найти.
anonymous
Первое, что приходит в голову: автор хочет удостовериться, что в функцию process_item передается корректное значение, а не случайный левый мусор. Защита, панимаишь. Вообще-то, оригинально, надо взять на вооружение :)
anonymous
()
обычно указатели в структуре на такой же тип, как и сама структура делаются для линейных либо древовидных однонаправленных списков... а что автор кода хотел здесь сказать... "если указатель в структуре не равен указателю на структуру, то ошибка"... странно это... автор не индус, случаем?
Slavaz ★★★★★
()
Ответ на: комментарий от anonymous
Ну разве что для дополнительной защиты... :) Но это как дополнительно предохраняться двумя презервативами одновременно. ;)
Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz
Это перед тем как садишься на Жабе кодить, можно только один презерватив одеть, там GC есть, поможет если чего. А на суровом C у индусов без двух гондонов шансов нет Ж)
anonymous
()
Ответ на: комментарий от Slavaz
> обычно указатели в структуре на такой же тип, как и сама структура делаются для линейных либо древовидных однонаправленных списков... а что автор кода хотел здесь сказать... "если указатель в структуре не равен указателю на структуру, то ошибка"...

А название поля ("guard") ничего не подсказывает?

Просто некий аналог чексуммы. Если он вдруг начал работать с неинициализированной структурой, эта штука позвенит. И не обязательно это должен быть ассерт, иногда приходится закладываться на то, что могут мелькать неинициализированные данные.

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous
> Вообще-то, оригинально, надо взять на вооружение :)
Вот и я так подумал, что интересно. Почему и спрашиваю. Автор далеко не индус, а наоборот вроде как очень крут. Естественно против i == NULL какой ассерт ещё нужно вставить.
anonymous
()
Ответ на: комментарий от anonymous
> Вот и я так подумал, что интересно. Почему и спрашиваю. Автор далеко не индус, а наоборот вроде как очень крут.

имхо основная цель именно эта:

> плюс еще эта проверка скажет если структура была получена не от фабрики, а скопирована memcpy

Иначе, можно с равным успехом magic value или чексумму использовать

dilmah ★★★★★
()
Ответ на: комментарий от dilmah
> имхо основная цель именно эта:

>> плюс еще эта проверка скажет если структура была получена не от фабрики, а скопирована memcpy

Согласен.

Просто в рамках Це (как было заявлено в топике) отличие продукции фабрики от результата memcpy и состоит в отсутствии надлежащей инициализации.

Die-Hard ★★★★★
()
Возможно это кольцевой список с заголовком (и проверка на пустоту).
anonymous
()
Ответ на: комментарий от dilmah
>плюс еще эта проверка скажет если структура была получена не от фабрики, а скопирована memcpy

не работать с дубликатами? (которые "случайно" попали в массив таких элементов)

или может это указатель на оригинал? (в случае отложенного копирования)

xydo ★★
()
Ответ на: комментарий от anonymous
>Автор далеко не индус, а наоборот вроде как очень крут.

А может ты у него спросишь и нам расскажешь?

CAPTCHA: reaper

anonymous
()
Ответ на: комментарий от Slavaz
> Всё равно слабо представляю целесообразность... > i=NULL - и segfault...

оно напишет в какой строчке упало. отсылаешь это автору и он фиксит. Если не проверять сдесь то всё равно прога упадёт или заглючит дальше. Ну лучше если упадёт сразу а не наворотит дел. И, чем раньше будет обнаружена ошибка тем проще понять в чём дело.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin
это похоже на защиту от неправельной фазы луны, точнее штоб работа программы независила от фазы луны
anonymous
()
Что только люди не выдумают чтобы не учить С++... Это эмуляция вызова конструктора.
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.