1. ホーム
  2. gcc

gccコンパイルオプション -fpermissive

2022-02-15 21:31:41

manマニュアルでのこのオプションの説明は以下の通りです。    

   -fpermissive
           不適合なコードに関するいくつかの診断を、エラーから警告に格下げします。したがって、-fpermissive を使用すると、一部の不適合コードのコンパイルが可能になります。
このオプションは、不適合コードに関する診断をエラーから警告にダウングレードします。

このオプションは、コードチェックの厳密性を低下させるため、避けた方がよいでしょう。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

const static char *source = "source";

int main(int argc, char *argv[])
{
	char buf[512];
	snprintf(buf, "%s", source);
	return 0;
}


このコードでは、snprintfは第2パラメータsizeof(buf)を使用しておらず、このオプションを使用しない場合、コンパイル結果は次のようになります。

fpermissive.cpp: In function 'int main(int, char**)':
fpermissive.cpp:10: Error: Invalid conversion from type 'const char*' to type 'size_t'
fpermissive.cpp:10: error: initializing real parameter 2, of type 'int snprintf(char*, size_t, const char*, ...)'


ご覧の通り、エラーが報告され、そのオプションでコンパイルすると、以下のようになります。

fpermissive.cpp: In function 'int main(int, char**)':
fpermissive.cpp:10: Warning: Invalid conversion from type 'const char*' to type 'size_t'
fpermissive.cpp:10: warning: initializing real parameter 2, of type 'int snprintf(char*, size_t, const char*, ...)'


ご覧のように、エラーレベルから警告レベルに落ちることで、プログラムに予期せぬ問題が発生する可能性があるので、そのオプションの使用は避けた方がよいでしょう。