А>результат у меня А>[quote] А>caught code=0xc00000fd address=0x401060 А>stack: base=0x30000 before=0x12ff18 handler=0x32ab8 exception=0x33000 remain=0x3000 size=0x100000 А>[/quote] А>Походу я ошибся насчет 4 кб, ядро венды кидает SEH на 3й странице от базы, обработчику остается 12кб
я вот тоже подумал, почему они должны оставлять одну страницу в запас, а не N? оказалось три. где-то может и конфигурируется типо хак
Это полностью корректная программа, которую абстрактная машина должна выполнять бесконечно.
V>stack overflow, но разве нельзя было на уровне языка(ов) это предуcмотреть
А на уровне языка нет никакого stack. Соответственно, не может быть никакого overflow.
Re[2]: бесконечная рекурсия: почему нет ограничений?
вопрос в догонку. правильно ли я понимаю, что в коде ниже под каждый инстанциированный объект класса Test в его методе-функции foo() при её вызове будет заведена _своя_ статическая переменная?
#define MAX_EXECUTION_DEPTH 100
class Test{
public:
//...void foo() const{
static int cnt = 0;
if (cnt++ < MAX_EXECUTION_DEPTH){
//do smth useful here
--cnt;
}
}
};
int main(){
Test t1, t2, t3;
t1.foo(); t2.foo(); t3.foo();
return 0;
}
Здравствуйте, varnie, Вы писали:
V>интересуюсь, почему в языках С/C++ никаким образом не предусмотрено предотвращение бесконечной рекурсии. в инете искал, не нашел инфы. V>берем простой пример: V>
V>компилим, запускаем: "segmentation fault: 11 (core dumped)". V>stack overflow, но разве нельзя было на уровне языка(ов) это предуcмотреть, введя директиву для установления максимальной глубины вызовов, плюс прицепить вызов а-ля abort() при превышении этого значения. V>или же создатели С/C++ руководствовались правилом "если вы хотите выстрелить себе в ногу, окей, мы не будем вам в этом мешать"? (вольный пересказ известного крылатого высказывания). V>спрашиваю из чистого любопытства. спасибо за инфу.
все понял (собственно, что я предполагал, то и оказалось верным), но все же хотел на всякий случай поинтересоваться ввиду моего пытливого ума.
еще бы кто-нибудь прояснил мне касаемо моего утверждения двумя постами выше, и я бы успокоилса
Поведенческого анализа нет практически во всех языках.
Его очень сложно реализовать. Вы привели простой пример, а если в f() много еще чего натыкано и даже return есть (но никогда не вызовется).
Проверка есть только синтаксическая ...
Думаю этого анализа нет, так как по идее нужно анализировать одновременно и код и синтаксис, то есть в общем случае сделать невозможно для release компиляции, но для debug реально.
Вероятно в скором времени появится. Сейчас идет работа над внедрением PHP в структуру ASP.NET. А PHP нетипитизированный язык, придется делать какие-то проверки ... тогда и это внедрят по ходу дела.
ЗЫ: а кто Вам мешает подобную проверку разработать самому?
Доброго времени суток! Мир Вам! С уважением Clevelus.
Если мой ответ понравился — оцените, ни на что не влияет, но будет приятно.
Re[3]: бесконечная рекурсия: почему нет ограничений?
Здравствуйте, varnie, Вы писали:
V>вопрос в догонку. правильно ли я понимаю, что в коде ниже под каждый инстанциированный объект класса Test в его методе-функции foo() при её вызове будет заведена _своя_ статическая переменная? V>
Здравствуйте, varnie, Вы писали:
V>вопрос в догонку. правильно ли я понимаю, что в коде ниже под каждый инстанциированный объект класса Test в его методе-функции foo() при её вызове будет заведена _своя_ статическая переменная? V>
нет конечно. все static переменные входят в область глобальных переменных. размер которой расчитывается линкером. таким образом это переменная одна на весь класс вообще.
static это просто декларация ГЛОБАЛЬНОЙ переменной ограниченной видимости. инициализируется тоже при инициализации глобальных переменных.
Re[5]: бесконечная рекурсия: почему нет ограничений?
Здравствуйте, varnie, Вы писали:
V>вопрос в догонку. правильно ли я понимаю, что в коде ниже под каждый инстанциированный объект класса Test в его методе-функции foo() при её вызове будет заведена _своя_ статическая переменная?
Нет, будет одна на всех, от количества вызовов не зависит.
Вот так будет несколько:
template<int>
struct Test
{
void foo() const{
static int cnt = 0;
//...
}
};
int main()
{
Test<__LINE__> t1, t2;
Test<__LINE__> t3;
Test<__LINE__> t4;
t1.foo();
t2.foo();
t3.foo();
t4.foo();
}
Здесь будет три статических объекта.
Re[7]: бесконечная рекурсия: почему нет ограничений?
Здравствуйте, varnie, Вы писали:
V>Здравствуйте, c-smile, Вы писали:
CS>>Здравствуйте, varnie, Вы писали:
V>>>собственно, я про что-то подобное применительно к миру С/С++ и осведомлялса изначально.
CS>>У тебя был выход по segmentation fault. Это такая форма abort(). CS>>А какой вариант выхода тебе нужен? V>такой, чтобы я имел возможность его перехватить в самой программе и корректно его отработать.
Ага, обработаешь. у тебя ведь стековая память кончилась. запуск процедуры, у которой будут локальные параметры приведёт к исключению (нет то где их разместить), хотя банально может не быть места под собственно само сохранение адреса возврата.
... << RSDN@Home 1.2.0 alpha rev. 787>>
Re[4]: бесконечная рекурсия: почему нет ограничений?
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Здравствуйте, varnie, Вы писали:
V>>вопрос в догонку. правильно ли я понимаю, что в коде ниже под каждый инстанциированный объект класса Test в его методе-функции foo() при её вызове будет заведена _своя_ статическая переменная?
ЮЖ>Нет, будет одна на всех, от количества вызовов не зависит. ЮЖ>Вот так будет несколько: ЮЖ>
Здравствуйте, OdesitVadim, Вы писали:
OV>Здравствуйте, varnie, Вы писали:
V>>Здравствуйте, c-smile, Вы писали:
CS>>>Здравствуйте, varnie, Вы писали:
V>>>>собственно, я про что-то подобное применительно к миру С/С++ и осведомлялса изначально.
CS>>>У тебя был выход по segmentation fault. Это такая форма abort(). CS>>>А какой вариант выхода тебе нужен? V>>такой, чтобы я имел возможность его перехватить в самой программе и корректно его отработать. OV>Ага, обработаешь. у тебя ведь стековая память кончилась. запуск процедуры, у которой будут локальные параметры приведёт к исключению (нет то где их разместить), хотя банально может не быть места под собственно само сохранение адреса возврата.
стековая память еще не кончилась в нормальной ос.
ос начинает такую панику несколько ранее, имея в запасе некую часть пользовтательского стека, именно для возможности им обработки ошибок. например ос вводит в доступные еще одну страницу стека пользователя. но если пользователь и этот кусок исчерпает ос уронит весь процесс.
тут мы это с анонимом обсуждали.
и это правльное поведение оси.
Re[5]: бесконечная рекурсия: почему нет ограничений?
Здравствуйте, merk, Вы писали:
... M>вы человека путаете. если тут будут три обьекта, то тут будут три разных инстанцированных типа. а это уже высокие материи.
Да, тут три разных типа. Просто хотел показать когда может быть "несколько" объектов.
M>а что такое __LINE__?
Число — номер строки.
Здравствуйте, varnie, Вы писали:
V>интересуюсь, почему в языках С/C++ никаким образом не предусмотрено предотвращение бесконечной рекурсии. в инете искал, не нашел инфы.
Стоит подумать, сколько раз в жижни среднего программиста — С++-ника встречается такая бага и сколько времени в среднем уходит на отладку. Я думаю и то и другое незначительно.
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[6]: бесконечная рекурсия: почему нет ограничений?
у меня есть класс примерно как класс Test выше (реализующий семантику "функция"), один в один с таким же механизмом предотвращения выполнения ф-ции на глубину превышающую MAX_EXECUTION_DEPTH (перед и после вызова самого исполнения ф-ции я воткнул printf("counter=%d\n", counter).
это не беск. рекурсия, и мой вывод подтверждает корректность реализованных действий. (счетчик увеличился только дважды)
я несколько запутан о том, как понимать эти выводы, но факт в том что я вышерасписанным способом через заведние статич. переменной и отслеживанием её значения реализовал простое предотвращение превышение глубины вызова ф-ций самих из себя.
если взять на вооружение что вы сказали что статич. переменная в методе класса одна на все объекты этого класса, тогда я не догоняю, как тогда понять результаты выше?
спасибо за прояснение.
counter=1
counter=2
counter=3
2 //вывод из тела test()
counter=3
counter=3
2 //вывод из тела test()
counter=3
counter=3
2 //вывод из тела test()
counter=3
counter=2
counter=1