LoginSignup
1

C Secure Coding Rules(7) 5.15. Escaping of the address of an automatic object [addrescape]

Last updated at Posted at 2018-04-03

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.

addrescape.c
// 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.

addrescape2.c
// 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.

addrescape3.c
// 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.

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
1