VOOZH about

URL: https://qiita.com/kaizen_nagoya/items/caba4fddb9088ee07a1e

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


👁 Image
2

Go to list of users who liked

3

Share on X(Twitter)

Share on Facebook

Add to Hatena Bookmark

@kaizen_nagoya(Dr. Kiyoshi Ogawa)

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

2
Last updated at Posted at 2018-04-02

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: 意味のある出力が出るようにする。
 検討中。

現状では、変な代入、奇異な操作が頻出します。
コンパイルエラーが出ないようにするなるべく短い記述で済まそうという趣旨で、他意はありません。
よりよい記述に変更する予定です。

コンパイラ

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.

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;
}
$./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.

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;
}
$./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.

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;
}
./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
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

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

[C][C++]の国際規格案の例題をコンパイルするときの課題7つ。
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

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

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

大規模言語モデル講座 基礎編 2025 Autumn 敗因を勝因に
https://qiita.com/kaizen_nagoya/items/34ffd2b0c47a5f3665d9

MCP入門 〜面倒なことはAIエージェントにやらせよう〜 by からあげ を聞きながら
https://qiita.com/kaizen_nagoya/items/54b648c838fae8d57e38

MCP入門 〜面倒なことはAIエージェントにやらせよう〜 by からあげ を聞きながら、補足と反論 by ChatGPT
https://qiita.com/kaizen_nagoya/items/0939d58d31666562090c

【松尾研LLMコミュニティ】面倒なことはLLMにやらせよう "Beginning LLM"2024年10月17日 AI(9)
https://qiita.com/kaizen_nagoya/items/efdc23fbe67cdae2126e

ChatGPT利用の技4つ with ChatGPT
https://qiita.com/kaizen_nagoya/items/4a178bd6a09a4a471a7f

ChatGPTによるQiita記事の改良と補足
https://qiita.com/kaizen_nagoya/items/20604d6dd0702ab95c2f

ChatGPTによるQiita記事の改良と補足(2)
https://qiita.com/kaizen_nagoya/items/996275307ffc8c1243f8

本から始める 面倒なことはChatGPTにやらせよう by からあげ
https://qiita.com/kaizen_nagoya/items/f5ce2a18db54b5610e4b

C言語(C++)が必要な人と必要ない人
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1

C言語(C++)が必要な人、必要ない人 ChatGPT
https://qiita.com/kaizen_nagoya/items/a074cb8cd292d8d94bd4

C言語を習得する3つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b

C言語を習得する3つの方法 ChatGPT
https://qiita.com/kaizen_nagoya/items/4a3518a18fa49f46787f
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
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.

2

Go to list of users who liked

3
0

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2

Go to list of users who liked

3