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 |
Влияние: Низкое |
ИДЕНТИФИКАТОР CWE: 691 |