warning: wrong type argument to increment
警告:voidポインタ++はgcc拡張機能
[-Wpointer-arith]
■この記事の概要
この記事では、C言語のgcc -pedantic
オプションについて解説しています。
このオプションはANSI標準に厳密に従うコードチェックを目的としますが、
実際のプロジェクトでは要件に応じた拡張機能の適切な活用が推奨されます。
ルールに過度に依存することで生じる非効率や誤解についても触れ、
適切なツールの選択の重要性を示しています。
■ヒステリックな警告が大量にあると警告は無視される
昔、高速道路に乗ったら降りるまで
キンコンキンコンなり続ける
速度警報装置があって
眠気を誘発して事故が多発したそうだ。
ヒステリックな警告が大量にあると
プログラマは警告を無視するか、
機械的に警告を抑止するためだけのコードを書き始める。
■gcc -pedanticで警告される拡張機能の例
#include <stdio.h>
void f(void *p)
{
//注意:voidポインタ++はgccの拡張機能です。
printf("%p\n",p); p++;
printf("%p\n",p); p++;
printf("%p\n",p); p++;
printf("%p\n",p); p++;
}
int main(void)
{
f("12345678") ;
}
コンパイラや静的解析ツールによっては警告ではなくてエラーとするものもあります。
組み込み系のソフトウェアでは拡張機能を許さないプロジェクトもありますが、エンタープライズ系では拡張機能を積極的に使うところもあります。
拡張機能はプロジェクトのルールに従い使い分けましょう。
尚、gccのマニュアルには -pedantic オプションは “こだわりのある人々を満足させるためにのみ 存在している“と記載されています。
■[gcc pedantic 学者ぶった人々]で検索
⇒gccを作った人が言ってるのだから間違いないでしょう。
参考:gcc -pedantic
「GCCはANSI標準を正しくサポートしていない」と主張し始める学者ぶった人々を黙らせるためだけの目的で存在するものです。
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_2.html
参考:clang -Weverything
https://quuxplusone.github.io/blog/2018/12/06/dont-use-weverything/