开发者

Use of setjmp and longjmp in C when linking to C++ libraries

开发者 https://www.devze.com 2023-04-01 02:40 出处:网络
I would like to use setjmp and longjmp in a C program that links to a library that is implemented in C++ (but has a C API).

I would like to use setjmp and longjmp in a C program that links to a library that is implemented in C++ (but has a C API).

The C++ code does do dynamic memory allocation and pointers get passed through the API, 开发者_运维百科but as long as the C side of the code manages those (opaque) objects correctly, there shouldn't be any messing up when using longjmp, right?

I know it's not safe to use these functions in C++ code, but should it be safe in C code that is linked to C++ code?


The fact that you call C++ functions from your C code does not make setjmp and longjmp more unsafe than they always are.

What's important is that if your library allocates resources you must have recovery code in place to ensure that those are released properly after longjmp is called. While this is likely easy for your own allocations, it may be hard or impossible for the C++ library depending on how the C interface you use is structured.


setjmp/longjmp are, in general, not safe for use with C++. They effectively replicate the behavior of exceptions, but without unwinding the stack correctly (for instance, they will not run destructors for objects on stack frames that they forcibly exit). Where possible, use exceptions instead if you've got them.


Well, right and not right. longjmp will in general not call destructors, so using it in a code like the following:

void f(jmp_buf jb)
{
  some_cpp_object_with_a_nontrivial_destructor x;
  if (some_condition) longjmp(jb, 2);
  // some other code
}

will make all sorts of bad things happen. If you avoid such situations, you should be OK. (In general, longjmp must not jump across any active stack frames with objects having non-trivial destructors.)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号