Main Content

MISRA C++:2023 Rule 21.10.2

The standard header file <csetjmp> shall not be used

Since R2024b

Description

Rule Definition

The standard header file <csetjmp> shall not be used.

Rationale

The header <csetjmp> provides the setjmp() and longjmp() functions, which can bypass the normal function return. Use of either function can result in undefined or unspecified behavior. For example, destructors for objects with automatic storage duration created after setjmp() and before longjmp() are not called when longjmp() jumps back to the state saved by setjmp(). This results in a resource leak.

Polyspace Implementation

Polyspace® reports a violation on any use of the setjmp() and longjmp() functions.

Troubleshooting

If you expect a rule violation but Polyspace does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

#include <csetjmp>
#include <iostream>

std::jmp_buf jumpBuffer;

void example1() {
    // Simulate an error condition
    if (true) {
        std::longjmp(jumpBuffer, 1);					    //Noncompliant
    }
}

int main() {
    if (setjmp(jumpBuffer) == 0) {						//Noncompliant
        std::cout << "Calling example1()" << std::endl;
        example1();
        std::cout << "example1() returned normally" << std::endl;
    } else {
        std::cout << "An error occurred in example1()" << std::endl;
    }

    return 0;
}

In this example, setjmp() saves the current execution state and longjmp() jumps back to that state when an error condition (simulated by if(true)) is encountered. This bypasses the normal C++ error handling mechanisms and can lead to errors such as resource leaks.

Check Information

Group: Language support library
Category: Required

Version History

Introduced in R2024b