5.6. Calling functions with incorrect arguments [argcomp] C Secure Coding Rules(4)

# 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
on macOS 10.13.x
または
* Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
on macOS 10.12.6

## 環境(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.6. Calling functions with incorrect arguments [argcomp]
## EXAMPLE 1 In this noncompliant example, 
a diagnostic is required because the C Standard Library function strchr is called through the function pointer fp with incorrectly typed arguments.

```c:argcomp.c
//EXAMPLE 1 In this noncompliant example, a diagnostic is required because the C Standard Library function strchr is called through the function pointer fp with incorrectly typed arguments.

#include <stdio.h> // for printf
#include <stdlib.h> // for EXIT_SUCCESS
#include <string.h> // for strchr
// char * strchr( const char *str , int chr );

char *(*fp)();
void f(void) {
  char *c;
  fp = strchr;
 c = fp("12", (int)'2'); // diagnostic required
  /// change 12 to "12". 2 to (int)'2)
  printf("%s\n", c);
}

int main(int argc, char** argv){ //
  f(); //
  return EXIT_SUCCESS;//
}//
```

```shell-session
$ ./gcc7ts.sh argcomp
$ clang argcomp.c
2

$ gcc-7 argcomp.c
2
```

## EXAMPLE 2 In this noncompliant example, 
a diagnostic is required because the function copy is defined to take two arguments but is called with three arguments.

```c:argcomp2a.c
#include <stdio.h> // for printf
#include <string.h> // for strcpy
//EXAMPLE 2 In this noncompliant example, a diagnostic is required because the function copy is defined to take two arguments but is called with three arguments.
/* in another source file */

void copy(char *dst, const char *src) {
  if (!strcpy(dst, src)) {
  /* report error */
    printf("strcpy error\n");
  }
}
```

```c:argcomp2.c
#include <stdio.h> // for printf
#include <stdlib.h> // for EXIT_SUCCESS

/* in this source file -- no copy prototype in scope */
void copy();
void g(const char *s) {
  char buf[20];
  copy(buf, s, sizeof buf); // diagnostic required
  /* ... */
  printf("%s \n",s);
}
int main(int argc, char** argv){ //
  g("Hello World!"); //
  return EXIT_SUCCESS;//
}//
```

```shell-session
$ ./clg72.sh argcomp2 argcomp2a
$ clang argcomp2.c
Hello World! 

$ gcc-7 argcomp2.c
Hello World! 
```
## EXAMPLE 3 In this noncompliant example, 
a diagnostic is required because the function buginf is defined to take a variable number of arguments but is declared in another file with no prototype and is called.

```c:argcomp3a.c
#include <stdio.h> // for printf
/* in another source file */
void buginf(const char *fmt, ...) {
/* ... */
  printf(fmt,__func__, __LINE__);
}
```

```c:argcomp3.c
//EXAMPLE 3 In this noncompliant example, a diagnostic is required because the function buginf is defined to take a variable number of arguments but is declared in another file with no prototype and is called.

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

/* in this source file -- no buginf prototype in scope */
void buginf();
void h(void) {
  buginf("bug in function %s, line %d\n", __func__, __LINE__); // diagnostic required
/* ... */
}
int main(int argc, char** argv){ //
  h(); //
  return EXIT_SUCCESS;//
}//
```

```shell-session
$ ./clg72.sh argcomp3 argcomp3a
$ clang argcomp3.c
bug in function buginf, line 5

$ gcc-7 argcomp3.c
bug in function buginf, line 5
```

# EXAMPLE 4 In this noncompliant example, 
a diagnostic is required because the function f is defined to take an argument of type long, but f is called from another file with an argument of type int.

```argcomp4a.c
/* in somefile.c */
long f(long x) {
  return x < 0 ? -x : x;
}
```

```argcomp4.c
//EXAMPLE 4 In this noncompliant example, a diagnostic is required because the function f is defined to take an argument of type long, but f is called from another file with an argument of type int.

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

/* in otherfile.c */
int g(int x) {
  return f(x); // diagnostic required
}
int main(int argc, char** argv){ //
  printf("%d \n",g()); //
  return EXIT_SUCCESS;//
}//
```

```shell-session
 ./clg72.sh argcomp4 argcomp4a
$ clang argcomp4.c
argcomp4.c:6:10: warning: implicit declaration of function 'f' is invalid in C99
      [-Wimplicit-function-declaration]
  return f(x); // diagnostic required
         ^
1 warning generated.
1 

$ gcc-7 argcomp4.c
argcomp4.c: In function 'g':
argcomp4.c:6:10: warning: implicit declaration of function 'f' [-Wimplicit-function-declaration]
   return f(x); // diagnostic required
          ^
1 
```

# 参考文献

コンパイル用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++]の国際規格案の例題をコンパイルするときの課題７つ。
https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de


## 自己参照
Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

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

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

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

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

一覧の一覧( 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.
# 文書履歴(document history)
# 文書履歴
ver. 0.10 初稿 20180403
ver. 0.11 gcc-7, Example節項目, コンパイル対象2つ追記 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.