CERT.MSC.SIG_HANDLER.POF
シグナルハンドラーは古いプレーン関数である必要があります。
脆弱性とリスク
古いプレーン関数をシグナルハンドラーとして使用しない場合、実装で定義されている動作だけでなく、定義されていない動作も発生する可能性があります。C++ には存在するが C に存在しないという関数の数から考えて、この規則に適合していないと、穏やか (無害) な動作やプログラムの異常終了、無作為なコード実行など、さまざまな状況が発生する可能性があります。
軽減と防止
シグナルハンドラーは古いプレーン関数である必要があります。
例
コピー
#include <csignal>
static void sig_handler1(int sig) {
// Implementation details elided.
}
extern "C" void sig_handler2(int sig) {
// Implementation details elided.
}
void install_signal_handler1() {
if (SIG_ERR == std::signal(SIGTERM, sig_handler1)) { //Uncompliant code, sig_handler1 is not declared as extern "C" linkage.
// Handle error
}
}
void install_signal_handler2() {
if (SIG_ERR == std::signal(SIGTERM, sig_handler2)) { //Compliant code, sig_handler2 is a C linkage function.
// Handle error
}
}
static void g3() noexcept(false);
static void g3() noexcept(false) {}
extern "C" void sig_handler3(int sig) {
try {
g3(); // Uncompliant, call g3 which is not a POF
} catch (...){
// Handle error
}
}
void install_signal_handler3() {
if (SIG_ERR == std::signal(SIGTERM, sig_handler3)) {
// Handle error
}
}