LINUX.ORG.RU

непонятная конструкция на си

 ,


0

3

в общем недавно смотрел исходный код ядра и нашел там примерно такую конструкцию, не смог понять, что она значит

int (some_identifyer *) (another_identifyer) = yet_another_identifyer;

никак не могу найти в коде, ищу вот так, но ничего не находит

find . -name '*.c' -o -name '*.h' -exec egrep -Hn '^\s*int\s*\([a-zA-Z0-9]+\s*\*\)\s*\([a-zA-Z0-9]+\)\s*=.*' {} \;

не подскажите, что бы это могло быть?

★★★

ack yet_another_identifyer ./source_code/* или grep

yet_another_identifyer

это указатель на функцию полученный навеное где то из dlopen/dlsym или типа того. Или extern какой, или бутерброд на макросах

int (some_identifyer *) (another_identifyer)

переменная some_identifyer указателя на функцию в которую записывается адрес yet_another_identifyer а далее вызывается где то как int result = some_identifyer(bla); Хотя можно просто int result = yet_another_identifyer(bla);

Ищи где первое объявление yet_another_identifyer. И где в него что-то пишут (или не пишут), а так то это просто та же самая функция, но с другим именем (идентификатором) и всё.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от d

ну если бы это был указатель на функцию, то функция должна возвращать указатель, который мы бы разыменовывали и присвали разуменованному указателю значение с правой стороны от знака равно

IvanR ★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

ну это-то понятно, однако звездочка справа от переменной, а не слева

IvanR ★★★
() автор топика
Ответ на: комментарий от IvanR

нет, это инициализация указателя на функцию, которая возвращает int

иди учи матчасть короче, RTFM

Harald ★★★★★
()

Это указатель на функцию и присваивание.

Очевидно, что если не знаешь синтаксис, то нужно читать книжки по сишке, а не грепать.

ox55ff ★★★★★
()
Ответ на: комментарий от EugeneBas

это не то, я знаю про указатели на функции, тут звездочка справа от идентификатора, а там, где указатель, звездочка слева, может быть мне показалось и она была слева, не могу найти этот фрагмент кода

IvanR ★★★
() автор топика

Это указатель на функцию.

anonymous
()
Ответ на: комментарий от MOPKOBKA

поздравляю, вы единственный человек, прошедший тест на внимательность :) шучу, я правда видел такую конструкцию, но теперь не уверен, что видел именно такю.

IvanR ★★★
() автор топика
Ответ на: комментарий от IvanR

Подозреваю, что было нечто такого?

typedef asmlinkage long (*orig_open_t) (const struct pt_regs *regs);

Да, это указатель на функцию, возвращающую long. А точнее, в данном случае — объявление типа. После него можно объявить переменнную этого типа и она уже будет указателем.

hibou ★★★★★
()
Ответ на: комментарий от hibou

«Видишь суслика? - Нет. - И я не вижу. А он есть.»

anonymous
()
Ответ на: комментарий от IvanR

Это не тест на внимательность, это ты по причине безграмотности не понял и не запомнил то, что увидел, и поэтому написал что попало. Не путай.

anonymous
()

это специальная конструкция для внедрения уязвимостей, видал тут про netfilter писали чо? отакот.

olelookoe ★★★
()
Ответ на: комментарий от IvanR

я правда видел такую конструкцию

Показалось.

MOPKOBKA ★★★★★
()

никак не могу найти в коде, ищу вот так, но ничего не находит

А вот в Расте бы нашел.

BceM_IIpuBeT ★★☆☆☆
()
Ответ на: комментарий от MOPKOBKA

Это указатель на ссылку, похоже это выглядит так …

Владимир

anonymous
()
Ответ на: комментарий от IvanR

int (some_identifyer *) (another_identifyer) = yet_another_identifyer;

some_identifyer это указатель на функцию от одного аргумента типа another_identifyer, возвращающую int.

значение этого указателя = yet_another_identifyer

yet_another_identifyer может быть как указателем, так и ссылкой на функцию (хотя по идее правильнее было бы писать сразу ссылку &yet_another_identifyer, но это тоже самое)

потом можно коллбеком его вызвать, например.

anonymous
()

У меня не компилируется. Думаю, это невалидный код на C.

PS правильно писать identifier.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

Если это был не указатель на функцию (выглядящий по-другому, о чём неоднократно написали), возможно это было следующее (без типа впереди):

*(type *)(var1) = var2;
dsdqmhsx
()
Ответ на: комментарий от IvanR

я правда видел такую конструкцию, но теперь не уверен, что видел именно такю.

Да вот это и надо уточнять.
Потому, что такой пример:

int (*pf)(char*) = myLen;

собирается и работает, а вот такой

int (pf*)(char*) = myLen;

— нет. Может, * всё же был слева? :)

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Выду на работу, тогда найду Через пару тройку дней

IvanR ★★★
() автор топика
Последнее исправление: IvanR (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.