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 |