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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.