реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос на миллион (GCC)
antiwin
сообщение Jul 2 2009, 07:15
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 20-05-09
Пользователь №: 49 303



Привет всем, такой вот проблем: как можно узнать адрес в ОЗУ выше которого стек не "перерастет"? Это нужно сделать на этапе компиляции.
И еще, можно ли в теле функции узнать тип возвращаемого значения т.е допустим определена функция void *foo(...), далее где то вызывается int *ptr=foo(...), как в теле foo узнать что это указатель на int?
Go to the top of the page
 
+Quote Post
aesok
сообщение Jul 2 2009, 07:20
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(antiwin @ Jul 2 2009, 11:15) *
Привет всем, такой вот проблем: как можно узнать адрес в ОЗУ выше которого стек не "перерастет"? Это нужно сделать на этапе компиляции.


Нет. Это можно только узнать после соборки поэкта. Проанализировав дерево вызовов функций и размеры их фрейм буферов.

Цитата(antiwin @ Jul 2 2009, 11:15) *
И еще, можно ли в теле функции узнать тип возвращаемого значения т.е допустим определена функция void *foo(...), далее где то вызывается int *ptr=foo(...), как в теле foo узнать что это указатель на int?


Никак нельзя.

Анатолий.
Go to the top of the page
 
+Quote Post
antiwin
сообщение Jul 2 2009, 07:30
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 20-05-09
Пользователь №: 49 303



жаль

Цитата(aesok @ Jul 2 2009, 11:20) *
Нет. Это можно только узнать после соборки поэкта. Проанализировав дерево вызовов функций и размеры их фрейм буферов.

Ну я так подозреваю выход есть в написании скрипта, анализирующий синтаксис всех сишников. Но это уже делает компилятор, неужели никак нельзя.

Сообщение отредактировал antiwin - Jul 2 2009, 07:33
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jul 2 2009, 10:33
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(antiwin @ Jul 2 2009, 11:30) *
Ну я так подозреваю выход есть в написании скрипта, анализирующий синтаксис всех сишников. Но это уже делает компилятор, неужели никак нельзя.


В плюсах можно извернуться

Код
void* f_int(int a, long b, int type)
{
//  ваша функция
}

class TRet
{
  int a;
  long b;
public:
  TRet(int a, long b) : a(a), b(b) {}
  operator int*() { return f_int(a, b, 1); }
  operator float*() { return f_int(a, b, 2); }

};

TRet f(int a, long b) { return TRet(a, b); }


Вызовы конструктора и операторов преобразования скорее всего будут проинлайнены и все сведется к вызову f_int

Цитата(antiwin @ Jul 2 2009, 11:30) *
Ну я так подозреваю выход есть в написании скрипта, анализирующий синтаксис всех сишников. Но это уже делает компилятор, неужели никак нельзя.


Максимальный размер стека может зависеть от входных данных, так что анализ текста программы не поможет. Тут надо строить какие-то допущения на основании знания логики ее работы, или просто запустить программу и посмотреть, сколько стека она скушала
Go to the top of the page
 
+Quote Post
777777
сообщение Jul 2 2009, 11:19
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(aesok @ Jul 2 2009, 11:20) *
Нет. Это можно только узнать после соборки проекта. Проанализировав дерево вызовов функций и размеры их фрейм буферов.

Боюсь что таже так нельзя. Потому что вызовы могут быть рекурсивными. Кроме того, функции можно вызывать по указателю, а такие вызовы не встроишь в дерево. Я уж не говорю о том, что каждая функция может запихнуть в стек что-то по своему желанию, помимо параметров и локальных переменных.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 05:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01399 секунд с 7
ELECTRONIX ©2004-2016