gcc(gnu), clang(llvm)コンパイルエラー・警告比較(5) R_08_04.c。docker(159)


やってきました。
gcc(gnu) clang(llvm)コンパイルエラー比較
長らくごぶさたしていました。

MISRA の解説書は有料ですが、Codeは無償であげてくれています。
MISRA C:2012 Example-Suite
https://gitlab.com/MISRA/MISRA-C/MISRA-C-2012/Example-Suite

全体の記録は
Misra Example Suite at docker コンパイル完了までの道のり
https://qiita.com/kaizen_nagoya/items/71f04a0204d5a1114577

順にコンパイルエラーが出たものを比較し、
エラーを取るのなら取ってみます。

-Wall でコンパイルしています。

R_08

$ clang 
R_08_01.c:22:8: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
extern x;                                      /* Non-compliant - implicit int type */
~~~~~~ ^
R_08_01.c:25:8: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
extern f ( void );                             /* Non-compliant - implicit int return type */
~~~~~~ ^
R_08_01.c:28:31: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
extern void g ( char c, const k );              /* Non-compliant - implicit int for parameter k */
                        ~~~~~ ^
R_08_01.c:32:12: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
typedef ( *pfi )( void );                       /* Non-compliant - implicit int return type */
~~~~~~~    ^
R_08_01.c:35:31: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
typedef void ( *pfv ) ( const x );              /* Non-compliant  - implicit int for parameter x */
                        ~~~~~ ^
R_08_01.c:41:10: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
   const y;                 /* Non-compliant - implicit int type */
   ~~~~~ ^
R_08_01.c:47:17: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
        const   y1;   /* Non-compliant - implicit int for member y */
        ~~~~~   ^
R_08_01.c:41:10: warning: unused variable 'y' [-Wunused-variable]
   const y;                 /* Non-compliant - implicit int type */
         ^
R_08_01.c:42:18: warning: unused variable 'y_ok' [-Wunused-variable]
   const int16_t y_ok;      /* Compliant     - explicit type */
                 ^
9 warnings generated.
R_08_03.c:30:13: error: conflicting types for 'g3'
       void g3 (        int * p1 );   /* Non-compliant - type qualifiers do not match
            ^
R_08_03.c:29:13: note: previous declaration is here
extern void g3 ( const  int * p1 );
            ^
R_08_03.c:59:6: error: conflicting types for 'g3'
void g3 ( int * p1 )  /* also breaks R.8.13 */
     ^
R_08_03.c:29:13: note: previous declaration is here
extern void g3 ( const  int * p1 );
            ^
2 errors generated.
R_08_04.c:27:17: warning: 'extern' variable has an initializer [-Wextern-initializer]
extern uint16_t speed = 6000u; /* Non-compliant - no declaration prior to this definition */
                ^
R_08_04.c:55:6: error: conflicting types for 'func43'
void func43 ( int16_t x, uint16_t y )
     ^
./R_08_04.h:28:13: note: previous declaration is here
extern void func43 ( int16_t x, int16_t y );
            ^
1 warning and 1 error generated.
R_08_08.c:25:16: warning: 'extern' variable has an initializer [-Wextern-initializer]
extern int32_t y8 = 10;     /* definition: external linkage: Breaks rule 8.4 */
               ^
R_08_08.c:26:16: error: static declaration of 'y8' follows non-static declaration
static int32_t y8;          /* internal linkage: Breaks rule 8.8 */
               ^
R_08_08.c:25:16: note: previous definition is here
extern int32_t y8 = 10;     /* definition: external linkage: Breaks rule 8.4 */
               ^
R_08_08.c:44:16: error: static declaration of 'h8' follows non-static declaration
static int32_t h8 ( void )   /* definition : internal linkage. Breaks rule 1.3 */
               ^
R_08_08.c:43:9: note: previous declaration is here
int32_t h8 ( void );         /* declaration: external linkage */
        ^
1 warning and 2 errors generated.
R_08_13_2.c:21:7: error: read-only variable is not assignable
   *p = 0;  /* Constraint Error */
   ~~ ^
1 error generated.

$ gcc 
R_08_01.c:22:8: warning: type defaults to 'int' in declaration of 'x' [-Wimplicit-int]
   22 | extern x;                                      /* Non-compliant - implicit int type */
      |        ^
R_08_01.c:25:8: warning: type defaults to 'int' in declaration of 'f' [-Wimplicit-int]
   25 | extern f ( void );                             /* Non-compliant - implicit int return type */
      |        ^
R_08_01.c:28:31: warning: type defaults to 'int' in declaration of 'k' [-Wimplicit-int]
   28 | extern void g ( char c, const k );              /* Non-compliant - implicit int for parameter k */
      |                               ^
R_08_01.c:32:12: warning: type defaults to 'int' in declaration of 'pfi' [-Wimplicit-int]
   32 | typedef ( *pfi )( void );                       /* Non-compliant - implicit int return type */
      |            ^~~
R_08_01.c:35:31: warning: type defaults to 'int' in declaration of 'x' [-Wimplicit-int]
   35 | typedef void ( *pfv ) ( const x );              /* Non-compliant  - implicit int for parameter x */
      |                               ^
R_08_01.c: In function 'R_8_1':
R_08_01.c:41:10: warning: type defaults to 'int' in declaration of 'y' [-Wimplicit-int]
   41 |    const y;                 /* Non-compliant - implicit int type */
      |          ^
R_08_01.c:47:17: warning: type defaults to 'int' in declaration of 'y1' [-Wimplicit-int]
   47 |         const   y1;   /* Non-compliant - implicit int for member y */
      |                 ^~
R_08_01.c:42:18: warning: unused variable 'y_ok' [-Wunused-variable]
   42 |    const int16_t y_ok;      /* Compliant     - explicit type */
      |                  ^~~~
R_08_01.c:41:10: warning: unused variable 'y' [-Wunused-variable]
   41 |    const y;                 /* Non-compliant - implicit int type */
      |          ^
R_08_03.c:30:13: error: conflicting types for 'g3'
   30 |        void g3 (        int * p1 );   /* Non-compliant - type qualifiers do not match
      |             ^~
R_08_03.c:29:13: note: previous declaration of 'g3' was here
   29 | extern void g3 ( const  int * p1 );
      |             ^~
R_08_03.c:59:6: error: conflicting types for 'g3'
   59 | void g3 ( int * p1 )  /* also breaks R.8.13 */
      |      ^~
R_08_03.c:29:13: note: previous declaration of 'g3' was here
   29 | extern void g3 ( const  int * p1 );
      |             ^~
R_08_04.c:27:17: warning: 'speed' initialized and declared 'extern'
   27 | extern uint16_t speed = 6000u; /* Non-compliant - no declaration prior to this definition */
      |                 ^~~~~
R_08_04.c:55:6: error: conflicting types for 'func43'
   55 | void func43 ( int16_t x, uint16_t y )
      |      ^~~~~~
In file included from R_08_04.c:22:
R_08_04.h:28:13: note: previous declaration of 'func43' was here
   28 | extern void func43 ( int16_t x, int16_t y );
      |             ^~~~~~
R_08_08.c:25:16: warning: 'y8' initialized and declared 'extern'
   25 | extern int32_t y8 = 10;     /* definition: external linkage: Breaks rule 8.4 */
      |                ^~
R_08_08.c:26:16: error: static declaration of 'y8' follows non-static declaration
   26 | static int32_t y8;          /* internal linkage: Breaks rule 8.8 */
      |                ^~
R_08_08.c:25:16: note: previous definition of 'y8' was here
   25 | extern int32_t y8 = 10;     /* definition: external linkage: Breaks rule 8.4 */
      |                ^~
R_08_08.c:44:16: error: static declaration of 'h8' follows non-static declaration
   44 | static int32_t h8 ( void )   /* definition : internal linkage. Breaks rule 1.3 */
      |                ^~
R_08_08.c:43:9: note: previous declaration of 'h8' was here
   43 | int32_t h8 ( void );         /* declaration: external linkage */
      |         ^~
R_08_13_2.c: In function 'h13':
R_08_13_2.c:21:7: error: assignment of read-only location '*p'
   21 |    *p = 0;  /* Constraint Error */
      |       ^
In file included from clear_lib.c:10:
clear_lib.c: In function 'g':
clear_lib.c:261:6: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  261 |  PR1((int)p,d);
      |      ^
misra_c.h:66:54: note: in definition of macro 'PR1'
   66 | #define PR1(a,b) (void)printf(" "#a  " = %" #b "\n", a)
      |                                                      ^
clear_lib.c: In function 'use_const_volatile_char_ptr':
clear_lib.c:274:6: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
  274 |  PR1((int)cv_cp,d);
      |      ^
misra_c.h:66:54: note: in definition of macro 'PR1'
   66 | #define PR1(a,b) (void)printf(" "#a  " = %" #b "\n", a)
      |              

docker hubでの作業

docker hubからの起動はこちら。

$ docker run it kaizenjapan/misra_c_2012_example /bin/bash

参考資料

仮説・検証(173)C言語(C++)に対する誤解、曲解、無理解、爽快。

[C][C++]の国際規格案の例題をコンパイルするときの課題7つ。
https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de
C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識
https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9
MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9
どうやって MISRA Example Suiteをコンパイルするか
https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

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

Autosar Guidelines C++14 example code compile list
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

C++ N4741, N4606, N3242 Source Compile Error List
https://qiita.com/kaizen_nagoya/items/2e736e04339b340ffb4d