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
   }
 }