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にフィードバックするために用いるものです。
ISO/IEC TS 17961:2013 C Secure Coding Rules(1)一覧
https://qiita.com/kaizen_nagoya/items/54e056195c4f11b850a1
一つの規則で複数回のコンパイルが必要な場合、別記事にしています。
作業予定
規則の例(断片等)をコンパイル、実行する予定です。
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
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.15. Escaping of the address of an automatic object [addrescape]
EXAMPLE 1 In this noncompliant example, a diagnostic is required because the address of the automatic object c_str remains in the pointer variable p when c_str goes out of scope in the function dont_do_this.
// ISO/IEC JTC 1/SC 22/WG 14 N 1624 Date: 2012-06-26 ISO/IEC TS 17961, p.7
// http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1624.pdf
/// lines are added by Dr. Kiyoshi Ogawa, 2018
/// 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
// EXAMPLE 1 In this noncompliant example, a diagnostic is required because the address of the automatic object c_str remains in the pointer variable p when c_str goes out of scope in the function dont_do_this.
#include <stdio.h> // for printf
#include <stdlib.h> // for EXIT_SUCCESS
const char *p;
void dont_do_this(void) {
const char c_str[] = "This will change";
p = c_str; // diagnostic required
printf("%s \n",p);
}
void innocuous(void) {
const char c_str[] = "Surprise, surprise";
puts(c_str);
}
int main(void) {
dont_do_this();
innocuous();
puts(p);
return EXIT_SUCCESS;
}
./gcc7ts.sh addrescape
$ clang addrescape.c
This will change
Surprise, surprise
This will change
$ gcc-7 addrescape.c
This will change
Surprise, surprise
Surprise-
EXAMPLE2 In this noncompliant example, a diagnostic is required because the address of the automatic object array is returned.
// ISO/IEC JTC 1/SC 22/WG 14 N 1624 Date: 2012-06-26 ISO/IEC TS 17961, p.7
// http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1624.pdf
/// lines are added by Dr. Kiyoshi Ogawa, 2018
/// 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
//EXAMPLE2 In this noncompliant example, a diagnostic is required because the address of the automatic object array is returned.
#include <stdio.h> // for printf
#include <stdlib.h> // for EXIT_SUCCESS
int *init_array(void) {
int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
printf("%d %d\n",array[0],array[1]);
return array; // diagnostic required
}
int main(void) {
int* i= init_array();
printf("%d %d\n",*i++,*i++);
return EXIT_SUCCESS;
}
./gcc7ts.sh addrescape2
$ clang addrescape2.c
addrescape2.c:6:10: warning: address of stack memory associated with local
variable 'array' returned [-Wreturn-stack-address]
return array; // diagnostic required
^~~~~
1 warning generated.
1 2
1 2
$ gcc-7 addrescape2.c
addrescape2.c: In function 'init_array':
addrescape2.c:6:10: warning: function returns address of local variable [-Wreturn-local-addr]
return array; // diagnostic required
^~~~~
1 2
./gcc7ts.sh: line 8: 94266 Segmentation fault: 11 ./$1g $2
EXAMPLE 3 In this noncompliant example, a diagnostic is required because the address of the automatic object fmt remains in the pointer variable ptr_param when fmt goes out of scope in the function squirrel_away.
// ISO/IEC JTC 1/SC 22/WG 14 N 1624 Date: 2012-06-26 ISO/IEC TS 17961, p.7
// http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1624.pdf
/// lines are added by Dr. Kiyoshi Ogawa, 2018
/// 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
// EXAMPLE 3 In this noncompliant example, a diagnostic is required because the address of the automatic object fmt remains in the pointer variable ptr_param when fmt goes out of scope in the function squirrel_away.
#include <stdio.h> // for printf
#include <stdlib.h> // for EXIT_SUCCESS
void squirrel_away(char **ptr_param) {
char fmt[] = "Error: %s\n";
/* ... */
*ptr_param = fmt; // diagnostic required
printf("%s",*ptr_param);
}
int main(void) {
char *ptr;
squirrel_away(&ptr);
/* ... */
printf("%s\n",ptr);
return EXIT_SUCCESS;
}
$ ./gcc7ts.sh addrescape3
$ clang addrescape3.c
Error: %s
ptr=
$ gcc-7 addrescape3.c
Error: %s
ptr=
参考文献
コンパイル用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
文書履歴
ver. 0.10 初稿 20180403
ver. 0.11 gcc-7, Example節項目追記 20180407
ver. 0.12 ありがとう追記 20230413
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.