setjmp и longjmp вызывают отклонение от нормального потока управления
Использование setjmp/longjmp происходит, когда вы используете комбинацию setjmp и longjmp или sigsetjmp и siglongjmp, чтобы отклониться от нормального потока управления и выполнить нелокальные скачки в вашем коде.
Используя setjmp и longjmp, или sigsetjmp и siglongjmp имеет следующие риски:
Нелокальные скачки уязвимы для нападений, которые используют распространенные ошибки, такие как переполнение буфера. Атакующие могут перенаправить поток управления и потенциально выполнить произвольный код.
Ресурсы, такие как динамически выделенная память и открытые файлы не могут быть закрыты, вызвав утечки ресурсов.
Если вы используете setjmp и longjmp в сочетании с обработчиком сигнала, неожиданный поток управления может произойти. POSIX® не задает, сохраняет ли setjmp маску сигнала.
Используя setjmp и longjmp или sigsetjmp и siglongjmp делает вашу программу трудной понять и поддержать.
Выполните нелокальные скачки в своем коде с помощью setjmp/longjmp или sigsetjmp/siglongjmp только в контекстах, где такие скачки могут быть выполнены надежно. Также используйте потоки POSIX, если это возможно.
На C++, чтобы моделировать бросок и ловлю исключений, стандартные идиомы использования, такие как выражения throw и операторы catch.
| Группа: Хорошая практика |
| Язык: C | C++ |
| Значение по умолчанию: 'off' |
Синтаксис командной строки: SETJMP_LONGJMP_USE |
| Влияние: низко |
| ID CWE: 691 |