longjmp
От: Аноним  
Дата: 23.06.04 13:38
Оценка:
Подскажите в общих чертах что делает функция longjmp
Re: longjmp
От: SergeMukhin Россия  
Дата: 23.06.04 13:44
Оценка: :)))
Здравствуйте, Аноним, Вы писали:

А>Подскажите в общих чертах что делает функция longjmp


Restores stack environment and execution locale.

void longjmp(
jmp_buf env,
int value
);
Parameters
env
Variable in which environment is stored.
value
Value to be returned to setjmp call.
Remarks
The longjmp function restores a stack environment and execution locale previously saved in env by setjmp. setjmp and longjmp provide a way to execute a nonlocal goto; they are typically used to pass execution control to error-handling or recovery code in a previously called routine without using the normal call and return conventions.

A call to setjmp causes the current stack environment to be saved in env. A subsequent call to longjmp restores the saved environment and returns control to the point immediately following the corresponding setjmp call. Execution resumes as if value had just been returned by the setjmp call. The values of all variables (except register variables) that are accessible to the routine receiving control contain the values they had when longjmp was called. The values of register variables are unpredictable. The value returned by setjmp must be nonzero. If value is passed as 0, the value 1 is substituted in the actual return.

Call longjmp before the function that called setjmp returns; otherwise the results are unpredictable.

Observe the following restrictions when using longjmp:

Do not assume that the values of the register variables will remain the same. The values of register variables in the routine calling setjmp may not be restored to the proper values after longjmp is executed.
Do not use longjmp to transfer control out of an interrupt-handling routine unless the interrupt is caused by a floating-point exception. In this case, a program may return from an interrupt handler via longjmp if it first reinitializes the floating-point math package by calling _fpreset.
Note Be careful when using setjmp and longjmp in C++ programs. Because these functions do not support C++ object semantics, it is safer to use the C++ exception-handling mechanism.
---
С уважением,
Сергей Мухин
Re: longjmp
От: Glоbus Украина  
Дата: 23.06.04 13:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите в общих чертах что делает функция longjmp


Это мое личное мнение, но мне кажется эти функции (setjmp/longjmp) — страшная порнография.
Удачи тебе, браток!
Re: longjmp
От: ssm Россия  
Дата: 23.06.04 13:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите в общих чертах что делает функция longjmp

long jump
Re[2]: longjmp
От: kiamor  
Дата: 23.06.04 13:51
Оценка:
Здравствуйте, Glоbus.

G>Это мое личное мнение, но мне кажется эти функции (setjmp/longjmp) — страшная порнография.


Зависит от контекста. В услових дефицита ресурсов (встраиваемые системы, например) и ограничений по времени, использование этих функций может помочь в создании (не удивляётесь) простого и понятного кода. Без двенадцатиэтажных обработок ошибок и прочей фигни. Всё зависит от условий, знаете ли. М-да.
Re[3]: longjmp
От: Glоbus Украина  
Дата: 23.06.04 14:00
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Здравствуйте, Glоbus.


G>>Это мое личное мнение, но мне кажется эти функции (setjmp/longjmp) — страшная порнография.


K>Зависит от контекста. В услових дефицита ресурсов (встраиваемые системы, например) и ограничений по времени, использование этих функций может помочь в создании (не удивляётесь) простого и понятного кода. Без двенадцатиэтажных обработок ошибок и прочей фигни. Всё зависит от условий, знаете ли. М-да.


Эт конечно вполне возможно, но вот настораживают такие строчки в мсдн

Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. Also, using these functions in C++ programs may degrade performance by preventing optimization on local variables. Use the C++ exception handling try/catch constructs instead.

Удачи тебе, браток!
Re[4]: longjmp
От: rus blood Россия  
Дата: 23.06.04 14:03
Оценка:
G>Эт конечно вполне возможно, но вот настораживают такие строчки в мсдн

G>

G>Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. Also, using these functions in C++ programs may degrade performance by preventing optimization on local variables. Use the C++ exception handling try/catch constructs instead.


Ну, стек не будет раскручен.
Т.е. деструкторы объектов не будут вызываны при выходе из блоков видимости.
Имею скафандр — готов путешествовать!
Re[5]: longjmp
От: Glоbus Украина  
Дата: 23.06.04 14:29
Оценка:
Здравствуйте, rus blood, Вы писали:


G>>Эт конечно вполне возможно, но вот настораживают такие строчки в мсдн


G>>

G>>Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. Also, using these functions in C++ programs may degrade performance by preventing optimization on local variables. Use the C++ exception handling try/catch constructs instead.


RB>Ну, стек не будет раскручен.

RB>Т.е. деструкторы объектов не будут вызываны при выходе из блоков видимости.

И как было сказано выше будет еще

degrade performance by preventing optimization on local variables

Да и ваще с точки зрения дизигна это крупнй про..б, если приходится такими методами прыгать по программе. Может конечно есть экзотические ситуахи, где такие вещи как longjmp помогут, но че-то я так на вскидку не могу придумать.
Удачи тебе, браток!
Re: longjmp
От: Кодт Россия  
Дата: 23.06.04 14:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите в общих чертах что делает функция longjmp


Разрушает стек, вот что она делает!

setjmp запоминает значения точки исполнения программы (EIP) и стека (ESP,EBP).
longjmp восстанавливает их.

При этом, разумеется, не выполняется никакого кода по раскручиванию стека — в том числе явного.
Если функция, из которой выпрыгнули, держала какие-либо ресурсы (выделенную память), то происходит утечка.
static jmp_buf jb;

void a()
{
  if(setjmp(jb))
  {
    b();
  }
  else
  {
    // точка приземления
  }
}

void b()
{
  char* data = malloc(10000);
  c();
  free(data); // не дождётесь!
}

void c()
{
  longjmp(jb, 1); // выпрыгнули
}

Поскольку С++ делает много неявной работы по разматыванию стека (деструкторы, блоки try-catch), выпрыгивание может привести к полнейшему цугундеру.
Перекуём баги на фичи!
Re[2]: longjmp
От: Аноним  
Дата: 23.06.04 14:37
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>Подскажите в общих чертах что делает функция longjmp


К>Разрушает стек, вот что она делает!


К>setjmp запоминает значения точки исполнения программы (EIP) и стека (ESP,EBP).

К>longjmp восстанавливает их.

К>При этом, разумеется, не выполняется никакого кода по раскручиванию стека — в том числе явного.

К>Если функция, из которой выпрыгнули, держала какие-либо ресурсы (выделенную память), то происходит утечка.
К>
К>static jmp_buf jb;

К>void a()
К>{
К>  if(setjmp(jb))
К>  {
К>    b();
К>  }
К>  else
К>  {
К>    // точка приземления
К>  }
К>}

К>void b()
К>{
К>  char* data = malloc(10000);
К>  c();
К>  free(data); // не дождётесь!
К>}

К>void c()
К>{
К>  longjmp(jb, 1); // выпрыгнули
К>}
К>

К>Поскольку С++ делает много неявной работы по разматыванию стека (деструкторы, блоки try-catch), выпрыгивание может привести к полнейшему цугундеру.

а вот что в MSDN например написано

The longjmp function restores a stack environment and execution locale previously saved in env by setjmp
Re[3]: longjmp
От: Кодт Россия  
Дата: 23.06.04 15:04
Оценка:
Здравствуйте, Аноним, Вы писали:

К>>Поскольку С++ делает много неявной работы по разматыванию стека (деструкторы, блоки try-catch), выпрыгивание может привести к полнейшему цугундеру.


А>а вот что в MSDN например написано


А>The longjmp function restores a stack environment and execution locale previously saved in env by setjmp


Восстанавливает, конечно. Вопрос, в каком объёме.
Регистры EIP, ESP, EBP — да. А всё остальное?
Тем более, что разматывание стека — это определённые действия, а про действия longjmp ничего не знает.
Перекуём баги на фичи!
Re[4]: longjmp
От: kiamor  
Дата: 23.06.04 21:04
Оценка:
Здравствуйте, Glоbus.

Ежели мы говорим о программировании для Windows — согласен, этих функций следует избегать. Выше я говорил об использовании вообще, безотносительно конкретной ОС.
Re[5]: longjmp
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 24.06.04 05:30
Оценка:
setjmp это функции библиотеки языка Си, используются в UNIX,
есть такая книга (года так 1990) "Программирование на Си в UNIX",
там подробно описываются эту функции на раду в функциями POSIX.
Re[5]: longjmp
От: Кодт Россия  
Дата: 24.06.04 09:13
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Ежели мы говорим о программировании для Windows — согласен, этих функций следует избегать. Выше я говорил об использовании вообще, безотносительно конкретной ОС.


Не так.
Ежели мы говорим о программировании на C++. В MSDN прямо об этом сказано.

А в условиях дефицита ресурсов... Мало ли, захотелось тебе что-то очень реалтаймовое для WinCE сделать. Ну сделай с longjmp'ом. Только сам постерегись использовать конструкторы и исключения.
Перекуём баги на фичи!
Re[6]: longjmp
От: Кодт Россия  
Дата: 24.06.04 09:15
Оценка:
Здравствуйте, achmed, Вы писали:

A>setjmp это функции библиотеки языка Си, используются в UNIX,

A>есть такая книга (года так 1990) "Программирование на Си в UNIX",
A>там подробно описываются эту функции на раду в функциями POSIX.

Мне почему-то казалось, что setjmp/longjmp входит в Стандартную библиотеку Си (а не в POSIX).
Кстати говоря, POSIX — он не только для UNIX.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.