C5.5 Calling functions in the C Standard Library other than abort, _Exit, and signal from within a signal handler Secure Coding Rules(3) 

ISO/IEC TS 17961:2013
Information Technology — Programming languages, their environments and system software interfaces — C Secure Coding Rules
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1624.pdf

この文書は、ISO/IEC JTC1 SC22 WG14の作業文書(Working Draft)です。
公式のISO/IEC TS 17961:2013原本ではありません。

技術内容を検討し、ISO/IEC JTC1 SC22 WG14にフィードバックするために用いるものです。

 Coding Rules(0) C Secure , MISRA and so on 
 https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0
一つの規則で複数回のコンパイルが必要な場合、別記事にしています。

# 作業予定
規則の例(断片等)をコンパイル、実行する予定です。
1: コンパイルエラーが出ないようにする。
　一覧のaccfree.cがこの段階です。
2: 実行時エラーが出ないようにする。
　一覧のptrcomp.cがこの段階です。
3: 意味のある出力が出るようにする。
　検討中。

現状では、変な代入、奇異な操作が頻出します。
コンパイルエラーが出ないようにするなるべく短い記述で済まそうという趣旨で、他意はありません。
よりよい記述に変更する予定です。
 
## コンパイラ
1)
Apple LLVM version 9.1.0 (clang-902.0.39.1)
Target: x86_64-apple-darwin17.4.0
または
clang version 6.0.0 (tags/RELEASE_600/final)
Target: x86_64-apple-darwin17.4.0
2)
gcc-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

## 環境(Environment)
hosted Environment macOS 10.13.3 or 10.12.9

## コンパイル用shell script
C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

# 5.5. Calling functions in the C Standard Library 
other than abort, _Exit, and signal from within a signal handler [asyncsig]

## EXAMPLE 1 In this noncompliant example, 
a diagnostic is required because the C Standard Library function fprintf is called from the signal handler handler via the function log_message.

```c:asyncsig.c
// ISO/IEC JTC 1/SC 22/WG 14 N 1624 Date: 2012-06-26 ISO/IEC TS 17961, p.11
// EXAMPLE 1 In this noncompliant example, a diagnostic is required because the C Standard Library function fprintf is called from the signal handler handler via the function log_message.
/// Compiled on 
///  Clang(LLVM) clang version 6.0.0 (tags/RELEASE_600/final) 
///  GCC(GNU) gcc-7 (Homebrew GCC 7.3.0_1) 7.3.0
// hosted Environment macOS 10.13.3 or 10.12.9
//

#include <stdio.h> /// for printf
#include <stdlib.h> /// for EXIT_SUCCESS
#include "unistd.h"

#define MAXLINE 1024
char info[MAXLINE];
void log_message(void) {
  fprintf(stderr, "%s\n", info); // diagnostic required
}

void handler(int signum) {
  log_message();
}

int main(void) {
  if (signal(SIGINT, handler) == SIG_ERR) {
    /* Handle error */
  }
  /* An interactive attention signal might invoke handler()   from here on. */
  while (1) {
    /* Main loop program code */
    log_message();
    sleep(1);
    /* More program code */
  }
  return EXIT_SUCCESS;
}
```

```shell-session
$ ./gcc7ts.sh asyncsig
$ clang asyncsig.c
 //kill from other terminal
./gcc7ts.sh: line 4: 90664 Terminated: 15          ./$1l $2

$ gcc-7 asyncsig.c
 //kill from other terminal
./gcc7ts.sh: line 8: 90752 Terminated: 15          ./$1g $2
```

## EXAMPLE 2 In this noncompliant example, 
a diagnostic is required because the C Standard Library function raise is called from the signal handler int_handler.

```c:asyncsig2.c
//EXAMPLE 2 In this noncompliant example, a diagnostic is required because the C Standard Library function raise is called from the signal handler int_handler.

#include <stdio.h> //added by O.K. fro printf()
#include <stdlib.h> //added by O.K. for EXIT_SUCCESS
#include <signal.h> // added by O.K. for raise()

void term_handler(int signum) {
  /* SIGTERM handling specific */
  printf("signum:%d \n", signum);// added for output
}
void int_handler(int signum) {
  /* SIGINT handling specific */
  if (raise(SIGTERM) != 0) { // diagnostic required
    /* Handle error */
    printf("Handle error:%d \n", signum);// added for output
  }
}
int main(void) {
  if (signal(SIGTERM, term_handler) == SIG_ERR) {
    /* Handle error */
    printf("Handle error:signal(SIGTERM, term_handler) \n");// added for output
  }
  if (signal(SIGINT, int_handler) == SIG_ERR) {
    /* Handle error */
    printf("Handle error:signal(SIGINT, int_handler) \n");// added for output
  }
  /* Program code */
  if (raise(SIGINT) != 0) {
    /* Handle error */
    printf("Handle error:raise(SIGINT)\n");// added for output
  }
  /* More code */
  return EXIT_SUCCESS;
}
```

```shell_session
$ ./gcc7ts.sh asyncsig2
$ clang asyncsig2.c
signum:15 

$ gcc-7 asyncsig2.c
signum:15 
```

## EXAMPLE 3 In this noncompliant example, 
a diagnostic is required because the C Standard Library function longjmp is called from the signal handler handler.

```c:asyncsig3.c
//EXAMPLE 3 In this noncompliant example, a diagnostic is required because the C Standard Library function longjmp is called from the signal handler handler.

#include <stdio.h> //added by O.K. fro printf()
#include <stdlib.h> //added by O.K. for EXIT_SUCCESS
#include <setjmp.h>// added by O.K. for raise()
#include "unistd.h"

#define MAXLINE 1024
static jmp_buf env;
void handler(int signum) {
  longjmp(env, 1); // diagnostic required
}
void log_message(char *info1, char *info2) {
  static char *buf = NULL;
  static size_t bufsize;
  char buf0[MAXLINE];
  if (buf == NULL) {
    buf = buf0;
    bufsize = sizeof(buf0);
  }
/*
* Try to fit a message into buf, else re-allocate
* it on the heap and then log the message.
*/
/*** VULNERABILITY IF SIGINT RAISED HERE ***/
  if (buf == buf0) {
    buf = NULL;
  }
}
int main(void) {
  if (signal(SIGINT, handler) == SIG_ERR) {
  /* Handle error */
  }
  char *info1="setjump\n";
  char *info2="info2\n";
  /* info1 and info2 are set by user input here */
  if (setjmp(env) == 0) {
    while (1) {
  /* Main loop program code */
      log_message(info1, info2);
      sleep(1);
  /* More program code */
    }
  }
  else {
    log_message(info1, info2);
  }
return EXIT_SUCCESS;
}
```

```shell-session
./gcc7ts.sh asyncsig3
$ clang asyncsig3.c
^C
$ gcc-7 asyncsig3.c
^C
```

# 参考文献
ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da

C言語（C++)に対する誤解、曲解、無理解、爽快。
https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

MISRA C まとめ #include <misra_c.h>
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

どうやって MISRA C Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

 [C][C++]の国際規格案の例題をコンパイルするときの課題７つ。
https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

TOPPERSまとめ　#名古屋のIoTは名古屋のOSで
https://qiita.com/kaizen_nagoya/items/9026c049cb0309b9d451

docker(0) 資料集
https://qiita.com/kaizen_nagoya/items/45699eefd62677f69c1d

Qiita-dockerお宝鑑定団
https://qiita.com/kaizen_nagoya/items/509e125263559b5aed5b

The C++ Standard Library: clang++とg++でコンパイルしてみた(まとめ):14件
https://qiita.com/kaizen_nagoya/items/9bdfaa392443d13e5759

C++17 - The Complete Guide clang++とg++でコンパイルしてみた(まとめ):4件
https://qiita.com/kaizen_nagoya/items/c000f307e642990781e1

C++N3242, 2011, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/685b5c1a2c17c1bf1318

C++N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) Example code compile list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

C++N4741, 2018 Standard Working Draft on ISO/IEC 14882 sample code compile list
https://qiita.com/kaizen_nagoya/items/3294c014044550896010

C++N4910:2022 Standard Working Draft on ISO/IEC 14882(0) sample code compile list
https://qiita.com/kaizen_nagoya/items/fc957ddddd402004bb91

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

ISO/IEC TS 17961:2013 C Secure Coding Rules(1) All list(to be confirmed)
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1

プログラマによる、プログラマのための、統計と確率のプログラミングとその後 統計と確率一覧（０）
https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴
ver 0.10 初稿 20180403
ver 0.11 gcc-7、Example節項目追記 20180407
### 最後までおよみいただきありがとう4ざいました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.