Цитата(antiwin @ Jul 17 2009, 14:59)

Условия проверяться не будут, т.к кол-во комбинаций=n! очень велико уже при n=10, где n-кол-во условных операторов. Просто будет собираться статистика вызовов каждой функции, анализироваться есть ли вложенные функции.? По поводу циклов не понял, уточните, а лучше пример в коде. На счет железа, это если что то из порта приходит? В любом случае условия не проверяются см. выше.
Пример конечно гипотетический, но
Код
int i;
char *p;
for (i=0; i<MAX; i++) //запускаем цикл по i (ну допустим количество опросов датчика или т. п.)
if (SOME_PIN_IS_LOW&&(i&0x01)) // если нужная нога - 0 и номер опроса нечетный, то просим памяти
p= (char*)malloc(SOME_MEMORY);
С одной стороны, если функция вызывается и возвращается обратно, то стек она освободит (допустим мы заведомо знаем сколько стека она отожрет), но в данном примере число вызовов malloc() и соответсвенно количество требуемой памяти будет определяться временем сохранения истинных условий, естественно количество вызовов может варьировться от 0 до MAX/2 раз.
Определить хватит ли памяти можно только прогоном программы иначе никак. Сомневаюсь что Ваш анализатор справится с задачей "просто заглянув исходник". Конечно данный пример не показывает как можно "перелезть" через вершину стека, однако я думаю что он показателен в смысле того что нельзя заранее определить сколько памяти требуется.
Можно также упомянуть вложенные прерывания (хотя перед использованием этого приема нужно крепко подумать), оценить частоту и количество вызовов, а также уровень вложенности, которых по C исходнику с помощью машины тоже вряд-ли реально.
Наконец стоит вспомнить о рекурсивных функциях - какая глубина рекурсии потребуется можно сказать только при полностью известных исходных данных, т. е. в том случае когда собственно программа обрабатывает заранее известную информацию, и результат ее (программы) работы в принципе тоже известен.
Например
Код
void some_recursive_func(int i, long int a, long int b); // некая рекурсивная функция
char read_some_port(void); // функция чтения порта, возвращающая практически случайное число от 0 до 256
int main (void){
int i;
long int a;
i = (int)read_some_port(); // читаем в i значение порта
some_recursive_func(i, a, a); // вызываем нашу рекурсивную функцию
return;
}
void some_recursive_func(int i, long int a, long int b){ // собственно функция
if (i>0){ // если i положительная, то уменьшаем ее
--i;
b=a++; // делаем что-то
some_recursive_func (i, a, b); // вызываем функцию . Вопрос лишь в том соклько раз она вызовется (и соответсвенно сколько стека отъест)?
}
}
Конечно приведенные примеры сильно утрированы, но они простые, а в реальности могут быть на порядки сложнее, поэтому в общем случае мое мнение таково - ни один анализатор не сможет оценить реальные потребности в памяти по C исходникам при сколько-либо сложной задаче (т. е. в том случае где это нужно).