Last Update 2021/10/19
-Wcast-qual
ポインタがキャストされる際、型修飾子が外された場合などに警告を出力
テスト概要
オプション無し、および-Wcast-qualオプションを使用した際の警告出力例
実行環境
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
使用ファイル
sample.c
#include <stdio.h>
int main(void)
{
const char c0[10] = "abcde";
const char *p0 = c0;
/* const修飾子を外して型キャスト */
char *p1 = (char *)p0;
*p1 = 'f';
printf("%s\n", p1);
char **p2;
char *pp[3];
char c1[10] = "fgh";
p2 = pp;
*p2 = c1;
/* 宣言時と異なり、const修飾子を付けて型キャスト */
const char **p3 = (const char **)p2;
**p2 = 'i';
printf("%s\n", *p3);
return 0;
}
動作テスト
オプション無しでコンパイルを実行
$ gcc sample.c 警告無し
$
-Wcast-qualオプション使用してコンパイルを実行
$ gcc -Wcast-qual sample.c
sample.c: In function ‘main’:
sample.c:9:13: warning: cast discards ‘const’ qualifier from pointer target type [-Wcast-qual]
char *p1 = (char *)p0;
^
sample.c:21:20: warning: to be safe all intermediate pointers in cast from ‘char **’ to ‘const char **’ must be ‘const’ qualified [-Wcast-qual]
const char **p3 = (const char **)p2;
^
$ 以下2種類の警告が発生
(1)型キャストの際にconst修飾子を外した事に対する警告
(2)安全のために途中のポインタを含め一律にconst修飾子の付加を求める警告