сборка с помощью gcc
От: ChistovSE  
Дата: 14.02.11 04:52
Оценка:
Здравствуйте,
Подскажите пожалуйста, в коде есть такая "функция":

file.c:

...
function(any_symbol){
...
}
...

Объявления function нет в хедере. Мне не понятно, какой возвращаемый тип у этой ф-ции. Возможно, void... Но хотелось бы знать точно.
Также any_symbol может быть любым набором символов и gcc выдавать ошибок не будет.
-------------------------
Сергей Ч.
Нижний Новгород
Re: сборка с помощью gcc
От: ilnar Россия  
Дата: 14.02.11 05:22
Оценка: -1
Здравствуйте, ChistovSE, Вы писали:

CSE>Здравствуйте,

CSE> Подскажите пожалуйста, в коде есть такая "функция":

CSE>file.c:


CSE>...

CSE>function(any_symbol){
CSE>...
CSE>}
CSE>...

CSE>Объявления function нет в хедере. Мне не понятно, какой возвращаемый тип у этой ф-ции. Возможно, void... Но хотелось бы знать точно.

CSE>Также any_symbol может быть любым набором символов и gcc выдавать ошибок не будет.

вот такой он вот С.
скомпилируй, слинкуй, дизассемблируй и глянь на код возврата, согласно конвенциям вызова
Re[2]: сборка с помощью gcc
От: ChistovSE  
Дата: 14.02.11 05:43
Оценка:
Здравствуйте, ilnar, Вы писали:

I>вот такой он вот С.

I>скомпилируй, слинкуй, дизассемблируй и глянь на код возврата, согласно конвенциям вызова
А можно по подробней? Я не очень хорошо знаю gdb. Я, полагаю, что с помощью его надо определить код возврата.
-------------------------
Сергей Ч.
Нижний Новгород
Re[3]: сборка с помощью gcc
От: ilnar Россия  
Дата: 14.02.11 07:32
Оценка:
Здравствуйте, ChistovSE, Вы писали:

CSE>Здравствуйте, ilnar, Вы писали:


I>>вот такой он вот С.

I>>скомпилируй, слинкуй, дизассемблируй и глянь на код возврата, согласно конвенциям вызова
CSE> А можно по подробней? Я не очень хорошо знаю gdb. Я, полагаю, что с помощью его надо определить код возврата.

пви не поможет, если исходников функции нет.
ищите где определена функция, в какой либе, потом его и анализируйте.
подробных инструкций у меня нет, за этим в ваш любимый поисковик
Re: сборка с помощью gcc
От: qqqqq  
Дата: 14.02.11 07:37
Оценка:
В С, такие функции возвращают int
Re[4]: сборка с помощью gcc
От: ChistovSE  
Дата: 14.02.11 08:39
Оценка:
Здравствуйте, ilnar, Вы писали:

I>пви не поможет, если исходников функции нет.

I>ищите где определена функция, в какой либе, потом его и анализируйте.
I>подробных инструкций у меня нет, за этим в ваш любимый поисковик

Так дело то в том, что исходники мне даны. Поэтому и написал, что может gdb как то может помочь...
-------------------------
Сергей Ч.
Нижний Новгород
Re[2]: сборка с помощью gcc
От: ChistovSE  
Дата: 14.02.11 08:44
Оценка:
Здравствуйте, qqqqq, Вы писали:

Q>В С, такие функции возвращают int


Хорошо, то что по-умолчанию ф-ция int возвращает это, теперь, понятно. А как насчёт параметров ф-ции ?


я пишу так:

int main(){

funtion();
funtion(10);
funtion(10,20,30,40);
return 0;

}

и всё работает! funtion, конечно, возвращает случайный int, я это printf'ом проверил. Но что с параметрами то делать? Получается, что function принимает любое кол-во параметров ?
-------------------------
Сергей Ч.
Нижний Новгород
Re[5]: сборка с помощью gcc
От: ilnar Россия  
Дата: 14.02.11 10:10
Оценка: :)
Здравствуйте, ChistovSE, Вы писали:

CSE>Здравствуйте, ilnar, Вы писали:


I>>пви не поможет, если исходников функции нет.

I>>ищите где определена функция, в какой либе, потом его и анализируйте.
I>>подробных инструкций у меня нет, за этим в ваш любимый поисковик

CSE> Так дело то в том, что исходники мне даны. Поэтому и написал, что может gdb как то может помочь...


что тогда мешает посмотреть описание в исходниках этой функции??
Re[2]: сборка с помощью gcc
От: ilnar Россия  
Дата: 14.02.11 10:15
Оценка: -2
Здравствуйте, qqqqq, Вы писали:

Q>В С, такие функции возвращают int


вовсе не обязательно.
int вы получаете изза конвенции возвращаемых значений, и считываете, кажется регистр eax
а что там окажется, возвращаемое значение, или тупо случайный мусор — это надо код смотреть.

что касается параметоров функции, они, акже, согласно конвенции вызова, передаются по определенным правилам, в случае с этой функцией, скорее всего через стек. сколько значений из стека возьмет функция — это снова надо в код взглянуть
если функция берет только 1 параметр, ты хоть 10 других в конце припиши, язык С тебе противиться и строго проверять число параметров не будет, разве что продвинутые компиляторы тебе укажут на твою очепятку
Re[3]: сборка с помощью gcc
От: ilnar Россия  
Дата: 14.02.11 10:16
Оценка:
Здравствуйте, ilnar, Вы писали:

I>Здравствуйте, qqqqq, Вы писали:


Q>>В С, такие функции возвращают int


I>вовсе не обязательно.

I>int вы получаете изза конвенции возвращаемых значений, и считываете, кажется регистр eax
I>а что там окажется, возвращаемое значение, или тупо случайный мусор — это надо код смотреть.

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

I>если функция берет только 1 параметр, ты хоть 10 других в конце припиши, язык С тебе противиться и строго проверять число параметров не будет, разве что продвинутые компиляторы тебе укажут на твою очепятку

http://ru.wikipedia.org/wiki/Calling_convention
у топикстартера скорее всего cdecl
Re[3]: сборка с помощью gcc
От: qqqqq  
Дата: 14.02.11 22:24
Оценка:
Она может берет только первый параметер, а остальные игнорирует. Как ты эту функцию определил в своем коде, там где main(), случайно не как extern funtion();? И что такое any_symbol?

Вот пожалуйста это компилируется но только один аргумент используется
Файл 1:
extern funtion();

   funtion();
   funtion(0);
   funtion(1);
   funtion(1,2);
   funtion(1,2,3);
   funtion(1,2,3, 4);


Файл 2:

#include <stdio.h>
funtion(int i)
{
   printf("i= %d ", i);
}
Re: сборка с помощью gcc
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.02.11 12:37
Оценка: :)
Здравствуйте, ChistovSE, Вы писали:

CSE>Объявления function нет в хедере. Мне не понятно, какой возвращаемый тип у этой ф-ции. Возможно, void... Но хотелось бы знать точно.

CSE>Также any_symbol может быть любым набором символов и gcc выдавать ошибок не будет.

Во народ пошел! Совсем вы со своими плюсами забыли языки для настоящих мужчин

Если тип возвращаемого значения явно не указан, подразумевается int. При этом, однако, функция может и вовсе не возвращать ничего — слово void придумано слабаками значительно позже. Соответственно, компилятор в этом случае не помешает использовать "возвращенное" значение в точке вызова (поскольку знать не знает, возвращалось оно или нет), но заместо осмысленного значения там будет какой-то произвольный мусор.

Типы параметров, опять же, могут быть не описаны — в таком случае подразумевается int.
Re[3]: сборка с помощью gcc
От: Pzz Россия https://github.com/alexpevzner
Дата: 15.02.11 12:39
Оценка:
Здравствуйте, ChistovSE, Вы писали:

CSE>и всё работает! funtion, конечно, возвращает случайный int, я это printf'ом проверил. Но что с параметрами то делать? Получается, что function принимает любое кол-во параметров ?


Функция принимает столько параметров и таких, сколько ей положено создателем. Однако компилятор в точке вызова ничего про это не знает, и по этому поводу с диагностикой не лезет. И это ваша забота передать правильное число параметров правильного типа.
Re[3]: сборка с помощью gcc
От: BulatZiganshin  
Дата: 26.02.11 11:04
Оценка:
Здравствуйте, ChistovSE, Вы писали:

CSE>и всё работает! funtion, конечно, возвращает случайный int, я это printf'ом проверил. Но что с параметрами то делать? Получается, что function принимает любое кол-во параметров ?


а у тебя не возникало вопросов как работает сам printf?

в k&r C прототипов не было вовсе, а все функции имели тип int(...), выражаясь современным языком. и сейчас afaik при отсутствии прототипа/объявления функции присваивается этот тип
Люди, я люблю вас! Будьте бдительны!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.