#error 指令があります。指令中のほかのトークンが、メッセージの一部として 出力されます。 このメッセージを生成するコードの例を次に示します。
#define ONE 2 #if ONE != 1 #error ONE != 1 #endif
メッセージ ID: E_ERROR_PRAGMA
コンパイル中に発生したエラーが原因となって、プログラムの処理を継続できません。エラーを修正して、再度実行してください。
メッセージ ID: E_CANNOT_RECOVER
コンパイラが標準出力を閉じようとした時に、ファイルシステムエラーが発生しました。 これは、ソースプログラムのエラーではありません。
メッセージ ID: E_FCLOSE_ERR
コンパイラが lock_lint のデータベースファイル (.ll) を 閉じる時に、ファイルシステムエラーが発生しました。
メッセージ ID: E_FCLOSE_LL_ERR
コンパイラが .ll ファイルを作成することができません。ファイルシステムエラー、あるいは、ディレクトリまたはファイルのパーミッションが正しくないことが原因と考えられます。
メッセージ ID: E_CANT_CREATE_LL_FILE
コンパイラが malloc() を内部で使用することができません。ほとんどの場合、スワップ領域が不足していることが原因です。
メッセージ ID: E_CANT_MALLOC_FILENAME
プログラムをコンパイルするのに必要なメモリーを確保することができません。ほとんどの場合、スワップ領域が不足していることが原因です。
メッセージ ID: E_OUT_OF_MEMORY
コンパイラが出力ファイルを /dev/null にリダイレクトしようとした時に、ファイルシステムエラーが発生しました。
メッセージ ID: E_CANT_FREOPEN_STDOUT
コンパイル中に、2 つの浮動小数点オペランド間で演算を行おうとした時に、オーバーフローが発生しました。演算によって浮動小数点例外が発生するため、コンパイルを停止します。
メッセージ ID: E_FP_CONST_CAUSE_EXCEPT
コンパイラが malloc() を内部で使用することができません。ほとんどの場合、スワップ領域が不足していることが原因です。
メッセージ ID: E_CANT_MALLOC_TMP_FILENAME
ファイルシステムエラーによって、コンパイラが .ll ファイルを 作成できません。 現在のディレクトリに書き込み権があることを確認してください。
メッセージ ID: E_CANT_OPEN_LL_FILE
コンパイラが、lock_lint のデータベースファイルを破棄できません。
メッセージ ID: E_CANT_FREOPEN_LL_DEV_NULL
ヘッダー名が < で始まる #include 指令に、右括弧 > がありません このメッセージを生成するコードの例を次に示します。
#include <stdio.h
メッセージ ID: E_INCLUDE_MISSING
このメッセージは、-v オプションを指定している場合に表示されます。コメント中に、/* が使用されています。 このメッセージを生成するコードの例を次に示します。
/* これはコメント中に /* が使用されている コメント例です。 */
メッセージ ID: E_SLASH_STAR_IN_CMNT
コメントの読み取り中に、ファイルの終端 (EOF) に達しました。
メッセージ ID: E_EOF_IN_COMMENT
プリプロセッサ (前処理系) 指令において使用できる空白文字は、スペースと水平タブだけです。ソースコード中で、用紙送り文字や垂直タブなどの空白文字が使用されています。コンパイラは、これらの文字をスペースと同様に扱います。
メッセージ ID: E_WHITE_SPACE_IN_DIRECTIVE
文字列リテラルが二重引用符 " で囲まれていません (末尾の " がありません)。プリプロセッサ指令中で文字列リテラルを使用している場合は警告となり、コンパイラによって末尾に二重引用符 " が補われます。プリプロセッサ指令中以外で使用されている場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
char *p = "abc ;
メッセージ ID: E_NEWLINE_IN_STR_LITERAL
このメッセージは、-Xc オプションを指定している場合に表示されます。ソース行中で、指令名を指定すべきところに番号が使用されています。このような行は、コンパイラの内部処理用として予約されていますが、-Xc オプション (完全準拠モード) を指定している場合には、警告が出力されます。 このメッセージを生成するコードの例を次に示します。
# 9
メッセージ ID: E_INTERPRETED_AS_LINE_DIRECTIVE
プリプロセッサ指令行中の # のあとに続く識別子を認識できません。 このメッセージを生成するコードの例を次に示します。
# unknown foo
メッセージ ID: E_INVALID_DIRECTIVE
cc -P コマンドの実行結果として生成される .i ファイルは前処理とコンパイル処理の中間段階のファイルとして予約されています。.i ファイルを確認することによって、通常検出しにくいエラーを検出することができます。ただし、コンパイラが検出できるのは、内部処理で使用される特殊な指令に限られます。コンパイルされたソースファイル (.i ファイル) には、特殊な指令以外にプリプロセッサ指令が含まれています。
メッセージ ID: E_BAD_COMP_CNTRL_LINE
このメッセージは、-Xc オプションを指定している場合に表示されます。 ANSI C 標準以外の指令のうち、サポート対象となる指令を確認し、-Xc が指定されているかどうかをチェックします。 このメッセージを生成するコードの例を次に示します。
#assert system( unix )
メッセージ ID: E_UP_COMPATIBLE_DIRECTIVE
関数形式のマクロ呼び出しで、引数リストを区切る括弧 ( ) の間に指令があります。このようなコンテキストでは、以下の指令は使用できません。#ident, #include, #line, #undef. if 節中の偽のブロック中でこのメッセージが表示される場合は警告です。その他の場合はエラーです。 このメッセージを生成するコードの例を次に示します。
#define flm(a) a+4 int i = flm( #ifdef flm /* 可 */ #undef flm /* 不可: エラー */ 4 #else /* 可 */ #undef flm/* 不可: 警告 */ 6 #endif /* 可 */ );
メッセージ ID: E_DIRECTIVE_IN_MACRO_LIST
前処理とコンパイル処理との中間段階の内部処理に、#file 指令が使用されています。この指令は、コンパイルシステム用に予約されています。オペランドには文字列リテラルが必要です。
メッセージ ID: E_FILE_MISSING_LITERAL
#ident 指令のあとには、通常の (ワイド文字ではない) 文字列リテラルを続ける必要があります。 このメッセージを生成するコードの例を次に示します。
#ident no-string
メッセージ ID: E_IDENT_MISSING_LITERAL
コンパイラが入力ファイルを読み取ることができません。ファイルシステムエラーが原因と考えられます。通常、このエラーはインクルードファイルに対して出力されます。
メッセージ ID: E_READ_ERROR
コンパイルエラーが多すぎて、以降の処理を継続できません。以降のエラーを出力せずに、コンパイルを停止します。
メッセージ ID: E_TOO_MANY_ERRS
コンパイラ内部で malloc() 呼び出しが失敗しました。ほとんどの場合、スワップ領域が不足していることが原因です。
メッセージ ID: E_MALLOC_FAILS
コンパイラ内部で realloc() 呼び出しが失敗しました。ほとんどの場合、スワップ領域が不足していることが原因です。
メッセージ ID: E_REALLOC_FAILS
入力ファイルまたは出力ファイルを開くことができません。cc に指定した引数 (すなわちファイル名) が正しくないと考えられます。メッセージ中に、ファイルを開くことができない理由が示されます。 このメッセージを生成するコードの例を次に示します。
cc badname.c -c x.c
メッセージ ID: E_CANNOT_OPEN
このメッセージは、-Xt オプションを指定している場合に致命的エラーが発生すると表示されます。ソースコードでは、マクロが直接または間接のいずれかの形式で再帰的に呼び出されます。ANSI C の制限によって、マクロの再走査は続行されません。以前の C コンパイラでは、マクロの再走査が続行され、その結果致命的エラーが発生します。 ANSI C と従来の C コンパイラでは再走査の規則が異なります。ANSI C コンパイラで -Xt オプションを指定すると、従来の C コンパイラの動作がサポートされ、マクロが再帰的に呼び出された時には、このメッセージが出力されます。 このメッセージを生成するコードの例を次に示します。
#define a(x) b(x) #define b(x) a(x) a(3)
メッセージ ID: E_MACRO_RECURSION
NULL 文字 (文字コードがゼロの文字) があります。
メッセージ ID: E_NULL_CHAR_INPUT
このメッセージは、-Xt オプションを指定している場合に表示されます。ANSI C では、3 つの文字で 1 文字を表す 3 文字表記シーケンスがサポートされています。3 文字表記シーケンスはすべて、?? で始まります。. 3 文字表記として解釈されるシーケンスは、既存のコードでも使用されている可能性があるので、K&R C コンパイラでは、移行措置としてメッセージが出力されます。 このメッセージを生成するコードの例を次に示します。
char *surprise = "3 文字表記シーケンス ??!";
メッセージ ID: E_TRIGRAPH_REPLACED
空でないソースファイル、およびヘッダーは完全行で構成されている必要があります。 ファイルの最終行が改行文字で終わっていない場合に出力されるメッセージです。
メッセージ ID: E_NEWLINE_NOT_LAST
関数形式のマクロを呼び出すために引数を読み取っている間に、ファイルの終わり (EOF) に達しました。 このメッセージを生成するコードの例を次に示します。
#define mac(a) mac( arg1
メッセージ ID: E_EOF_IN_MACRO_ARG
#error 指令中のトークンは、有効な C のトークンにする必要があります。 ソースプログラムに無効なトークンが含まれています。 このメッセージを生成するコードの例を次に示します。
#error 038 - this is an invalid token
メッセージ ID: E_BAD_TOKEN_IN_ERROR_DIRECTIVE
すでに、多数の include ファイルが開いているので、新しい include ファイルを開くことができません。コンパ イラでは、最低 8 レベルでオペレーティングシステムで定義されている同時に開くことのできる最大ファイル数がサポートされます。このメッセージが出力される一般的な原因として、ある include ファイルの中にすでに取り込まれているファイルを、ある時点で再度取り込もうとしていると考えられます。
メッセージ ID: E_CANT_OPEN_INCLUDE_FILE
#include 指令で指定されたファイルが、検索パス上のディレクトリにありません。 このメッセージを生成するコードの例
#include "where_is_it.h"
メッセージ ID: E_CANT_FIND_INCLUDE_FILE
無効なトークンが含まれている文字列があります。前処理用の ## 演算子が無効なトークンの原因になっている可能性があります。無効なトークンは、メッセージ中に表示されます。無効なトークンが 21 文字以上である場合は、最初の 20 文字だけが出力され、以降は ". . ." と表示されます。なお、無効なトークンは無視されて処理されません。 このメッセージを生成するコードの例を次に示します。
#define PASTE(l,r) l ## r double d1 = 1e; double d2 = PASTE(1,e); int i = 1veryverylongnontoken;
メッセージ ID: E_INVALID_TOKEN
C 言語の有効なトークンとして認識できない文字列があります。 このメッセージを生成するコードの例を次に示します。
int i = 1$;
メッセージ ID: E_INVALID_INPUT_TOKEN
関数形式のマクロ定義に対する引数リストの処理中に、不適切なトークンがあります。 このメッセージを生成するコードの例を次に示します。
#define mac(a,4) a b c
メッセージ ID: E_INVALID_TOKEN_IN_DEFINE_MACRO
指令の最後の位置に、無効なトークンがあります。この無効なトークンがなければ有効な指令になります。 このメッセージを生成するコードの例を次に示します。
#line 7 "file.c
メッセージ ID: E_INVALID_TOKEN_IN_DIRECTIVE
#if 指令、または #elif 指令において、定数式の演算子としても整数定数としても有効でないトークンが使用されています。 このメッセージを生成するコードの例を次に示します。
#if 1 > "1" int i = 1; #endif
メッセージ ID: E_TOKEN_ILLEGAL_IN_DIRECTIVE
#if 指令、または #elif 指令中の defined 演算子の後には、識別子または括弧 ( ) で囲んだ識別子を続ける必要があります。ソースコードはこのような方法に従っていません。 このメッセージを生成するコードの例を次に示します。
#if defined int i = 1; #endif
メッセージ ID: E_INVALID_USE_OF_DEFINE
マクロに渡される引数の数が、マクロ定義中の個数と一致しません。 このメッセージを生成するコードの例を次に示します。
#define twoarg(a,b) a+b int i = twoarg(4);
メッセージ ID: E_ARGUEMENT_MISMATCH
プリプロセッサマクロに対する実引数に、トークンが含まれていません。ANSI C 標準では、このような状態は未定義と認識されます。従来の C コンパイラでは、空のトークンリストを引数なしとして扱います。このメッセージは、 -Xc オプションを指定した場合にも表示されます。 このメッセージを生成するコードの例を次に示します。
#define m(x) x+3 int i = m();
メッセージ ID: E_TOKENLESS_MACRO
コンパイラの内部エラーです。
メッセージ ID: E_INVALID_TARGET_FILENAME
#include 指令で、取り込むファイルが指定されていません。 このメッセージを生成するコードの例を次に示します。
#include
メッセージ ID: E_INCLUDE_MISSING_FILENAME
引数をマクロ展開できる、#include 指令を使用していますが、展開の結果、ファイル名として有効なトークンが得られません。 このメッセージを生成するコードの例を次に示します。
#define EMPTY #include EMPTY
メッセージ ID: E_INCLUDE_EXPANSION_NO_FILE
#include 指令中にファイル名が指定されていません。 このメッセージを生成するコードの例を次に示します。
#include <>
メッセージ ID: E_EMPTY_FILE_NAME
マクロ置換後のファイル名が指定されていません。 このメッセージを生成するコードの例を次に示します。
#define NULLNAME <> #include NULLNAME
メッセージ ID: E_EMPTY_HEADER_NAME
#include 指令に > がありません。 このメッセージを生成するコードの例を次に示します。
#include" が必要 */
メッセージ ID: E_NO_CLOSING_GREATER_THAN
#include 指令中のファイル指示子が正しくありません。文字列リテラルまたは正しい書式のヘッダー名にする必要があります。 このメッセージを生成するコードの例を次に示します。
#include stdio.h
メッセージ ID: E_BAD_FILE_SPEC
行番号指令で指定する行番号 (コンパイラが内部処理で使用) は、ゼロ以外の正の数値にする必要があります。 このメッセージを生成するコードの例を次に示します。
# 0 "foo.c"
メッセージ ID: E_ZERO_INVALID_IN_POUND_NUMBER
#line 指令で指定する行番号 (コンパイラが内部処理で使用) は、ゼロ以外の正の数値にする必要があります。 このメッセージを生成するコードの例を次に示します。
#line 0
メッセージ ID: E_ZERO_INVALID_IN_POUND_LINE
文字列リテラルが # < number > 指令のあとに必要です。 このメッセージを生成するコードの例を次に示します。
#15 notstring
メッセージ ID: E_STRING_EXPECTED_POUND_NO
#line 指令のあとには、文字列リテラルを続ける必要があります。 このメッセージを生成するコードの例を次に示します。
#line 12 int
メッセージ ID: E_STRING_EXPECTED_POUND_LINE_NO
プリプロセッサ指令行の先頭にある # のあとに、無効なトークンまたは 10 進以外の数値が指定されています。 このメッセージを生成するコードの例を次に示します。
#0x12
メッセージ ID: E_POUND_NUMBER_EXPECTED
#line のあとの行番号を表わす 10 進数を探しましたが、検出されたトークンが不適切であるか、または値がゼロの数になっています。 このメッセージを生成するコードの例を次に示します。
#line 09a
メッセージ ID: E_POUND_LINE_NO_EXPECTED
#line 指令の残りの部分が空白です。 行番号、およびオプションのファイル名が指定されていません。 このメッセージを生成するコードの例を次に示します。
#line
メッセージ ID: E_NO_TOKENS_IN_POUND_LINE
#line 指令中の式をマクロ展開しましたが、行番号として解釈されるトークンがありません。 このメッセージを生成するコードの例を次に示します。
#define EMPTY #line EMPTY
メッセージ ID: E_NO_TOKENS_AFTER_EXPANSION
関数形式のマクロ定義で、name が仮引数として複数回使用されています。 このメッセージを生成するコードの例を次に示します。
#define add3(a,a,c) a + b + c
メッセージ ID: E_DUPLICATE_FORMAL_PARAM
ソースコードで、マクロが再定義されています。K&R C の以前のリリースでは、仮引数の順序とスペルを除いて、両方の定義が同じであれば、再定義することができました。ANSI C でマクロを正しく再定義するには、仮引数の順序とスペルも含めて、両方の定義が完全に一致している必要があります。このメッセージは、指定したオプションに関係なく、両方の定義が一致していない場合に出力されます。また -Xc オプションを使用している場合には、仮引数のスペルが一致しないだけでも、このメッセージが出力されます。 このメッセージを生成するコードの例を次に示します。
#define TIMES(a,b) a * b #define TIMES(a,b) a - b
メッセージ ID: E_MACRO_REDEFINED
文字定数の整数としての値は、その文字の文字コードから取得します。文字定数が複数の文字で構成される場合、余分な文字をどう扱うかはインプリメンテーションによって異なります。このメッセージは、本リリースの C コンパイラと旧リリースのコンパイラとでは、前処理において文字定数に適用される値の決定の方式が異なることを示しています。旧リリースでは、最初の文字だけが使用されます。実行可能コードにおける文字定数の値は変更されません。 このメッセージを生成するコードの例を次に示します。
#if 'ab' != ('b' * 256 + 'a') #error unknown encoding #endif
メッセージ ID: E_MULTI_CHAR_CHAR_CONST
このメッセージは、-Xt オプションを指定している場合に表示されます。#if 指令、または #elif 指令で使用したオペランドの値が、LONG_MAX (2147483647) を超えていますが、unsigned (符号なし) の接尾辞 (U) が付いていません。K&R C の以前のリリースでは、このような定数は、signed (符号つき) として解釈されていました (このため、実際には負の数になります)。ANSI C では unsigned の long int として扱うので、式の解釈に影響がある場合があります。このメッセージは、リリースの移行措置として表示され、旧リリースとは異なる方法で値が扱われることに注意をうながします。 このメッセージを生成するコードの例を次に示します。
#if 2147483648 > 0 char *mesg = "ANSI C 形式"; #endif
メッセージ ID: E_OPERAND_TREATED_AS_UNSIGNED
ソースファイルがインクルードするファイル名の指定で、/usr/include ディレクトリが記述されています。 このようなインクルード方法は、インプリメンテーションに依存するので、移植することができません。ヘッダーファイルを検索するデフォルトの場所のリストに /usr/include ディレクトリが含まれないシステムもあります。この場合は、違うファイルがインクルードされる可能性があります。 このメッセージを生成するコードの例を次に示します。
#include
メッセージ ID: E_INC_USR_INC_MAY_NOT_PORTABLE
コンパイラが、 #if, #elif, #else, #ifdef、または #ifndef 指令に対する、#endif に到達しないまま、ソースファイルの末尾に到達しました。 このメッセージを生成するコードの例を次に示します。
#ifndef STUB TranslationEntry* pageTable = NULL; /* ここ以降から、コンパイラは #endif を探す */ #ifdef CHANGED int newfuntion(int a); #endif /* この #endif は、#ifdef に対応 */ /* さらにコンパイラは #endif を探す */ /* この行以降にも #endif はない */
メッセージ ID: E_NO_MATCHING_ENDIF
#elif 指令は、#if 指令で始まる前処理の if 節中になければなりません。該当するコードに、 #if 指令がありません。 このメッセージを生成するコードの例を次に示します。
#elif defined(TWO) int i = 2; #endif
メッセージ ID: E_ELIF_MISSING_IF
#elif 指令のあとに式がありません。 このメッセージを生成するコードの例を次に示します。
#if defined(ONE) int i = 1; #elif int i = 4; #endif
メッセージ ID: E_ELIF_REQUIRES_CONST_EXP
前処理の if 節は、 #if、#elifs (省略可)、#else (省略可)、最後に #endif の順に構成する必要があります。 #else 指令のあとに #elif が使用されています。 このメッセージを生成するコードの例を次に示します。
#if defined(ONE) int i = 1; #elif defined(TWO) int i = 2; #else int i = 3; #elif defined(FOUR) int i = 4; #endif
メッセージ ID: E_ELIF_FOLLOWS_ELSE
前処理の if 節以外の位置に、#else 指令があります。 このメッセージを生成するコードの例を次に示します。
#else int i =7; #endif
メッセージ ID: E_ELSE_MISSING_IF
前処理の if 節中に、複数の #else 指令が使用されています。2 つ目以降の #else 指令は偽と評価されます。 このメッセージを生成するコードの例を次に示します。
#ifdef ONE int i = 1; #else int i = 2; #else int i = 3 #endif
メッセージ ID: E_TOO_MANY_ELSES
前処理の if 節以外の位置に #endif 指令があります。 このメッセージを生成するコードの例を次に示します。
int i = 1; #endif
メッセージ ID: E_IFLESS_ENDIF
#if 指令のあとに式がありません。 このメッセージを生成するコードの例を次に示します。
#if int i = 4; #endif
メッセージ ID: E_IF_REQUIRES_CONST_EXP
#ifdef プリプロセッサ指令のあとにマクロ名を続けて、定義されているかどうかを検査できるようにする必要があります。ソースコードで、識別子が指定されていません。#ifdef は、偽であるとして扱われます。 このメッセージを生成するコードの例を次に示します。
#ifdef int i = 1; #endif
メッセージ ID: E_IFDEF_REQUIRES_IDENTIFIER
#ifndef 指令のあとに識別子を続けて、定義されているかどうかを検査できるようにする必要があります。 このメッセージを生成するコードの例を次に示します。
#ifndef int i = 5; #endif
メッセージ ID: E_IFNDEF_REQUIRES_IDENTIFIER
-P オプションを使用している時に、.i ファイルを指定しています。 以下に例を示します。 cc -P tst.i
メッセージ ID: E_PREPROCESSING_DOT_I_FILE
コンパイラが標準出力 (stdout) にアクセスしている時に、ファイルシステムエラーが発生しました。
メッセージ ID: E_STDOUT_ERROR
コンパイラが標準エラー (stderr) にアクセスしている時に、ファイルシステムエラーが発生しました。
メッセージ ID: E_STDERR_ERROR
#assert 指令において、述語名が指定されていません。 このメッセージを生成するコードの例を次に示します。
#assert
メッセージ ID: E_EMPTY_ASSERT_DIRECTIVE
#assert 指令において、指令のあとに続くトークンが述語名になっていません。 このメッセージを生成するコードの例を次に示します。
#assert 5
メッセージ ID: E_ASSERT_IDENTIFIER_EXPECTED
#assert 指令において、述語のあとに括弧 ( がありません。 このメッセージを生成するコードの例を次に示します。
#assert system unix
メッセージ ID: E_ASSERT_ID_DOT_DOT_EXPECTED
#assert 指令の書式が正しくありません。指令のあとに表明と右括弧 ) がありません。 このメッセージを生成するコードの例を次に示します。
#assert system(
メッセージ ID: E_NO_TOKENS_AFTER_ASSERT_NAME
#assert 指令において、述語の括弧中に表明がありません。 このメッセージを生成するコードの例を次に示します。
#assert system()
メッセージ ID: E_ASSERT_NO_TKNS_BETWEEN_PARENS
#assert 指令において、表明の指定に必要な右括弧 ) がありません。 このメッセージを生成するコードの例を次に示します。
#assert system(unix
メッセージ ID: E_ASSERT_MISSING_PAREN
cc コマンドの -A- オプションで、オプションのあとに余分なトークンがあります。このトークンは無視されます。 このメッセージを生成するコードの例を次に示します。
cc -A-extra -c x.c
メッセージ ID: E_TOKENS_AFTER_A_IGNORED
cc コマンド行の引数 -A のあとには、表明する述語名を指定するか、定義済みのすべてのマクロおよび述語を削除する場合には - を付ける必要があります。 -A のあとのトークンはこのどちらにも該当しません。 このメッセージを生成するコードの例を次に示します。
cc -A3b2 -c x.c
メッセージ ID: E_IDENTIFIER_EXPECTED_AFTER_A
条件付きコンパイル指令中の # のあとに、識別子または述語名のいずれも指定されていません。 このメッセージを生成するコードの例を次に示します。
#if #system(unix) || # char *os = "sys"; #endif
メッセージ ID: E_IDENT_EXPECTED_AFTER_POUND
#if または #elif 指令において、# 演算子を使用して、名前定義されたようなマクロではなく述語を選択するには、述語のあとに括弧で囲んだトークンのリストを続ける必要があります。 このメッセージを生成するコードの例を次に示します。
#assert system(unix) #define system "unix" #if #system char *systype = system; #endif
メッセージ ID: E_PAREN_EXPECTED_AFTER_ID_PND
#if または #elif 指令において、# 演算子を使用して、名前定義されたようなマクロの代わりに述語を選択する場合は、述語のあとに括弧で囲んだトークンのリストを続ける必要があります。 このメッセージを生成するコードの例を次に示します。
#if #system( char *system = "unix"; #endif
メッセージ ID: E_TOKENS_EXPECTED_AFTER_ID_PND
テストする述語の表明で使用した名前が、#if 指令中または #elif 指令中にありません。 このメッセージを生成するコードの例を次に示します。
#if #system() char *sysname = "??"; #endif
メッセージ ID: E_TKNS_EXPECTED_BETWEEN_PARENS
#if 指令または #elif 指令中の、# 演算子のあとに続く述語のテストにおいて、表明を囲む右括弧 ) がありません。 このメッセージを生成するコードの例を次に示します。
#if # system(unix char *system = "unix"; #endif
メッセージ ID: E_MISSING_R_PAREN
#unassert 指令の中に、削除する述語名がありません。 このメッセージを生成するコードの例を次に示します。
#unassert
メッセージ ID: E_EMPTY_UNASSERT_DIRECTIVE
#unassert 指令では、表明解除する述語を指定する必要があります。 このメッセージを生成するコードの例を次に示します。
#unassert 5
メッセージ ID: E_UNASSERT_REQUIRES_IDENTIFIER
#unassert 指令において、述語のあとの表明と右括弧 ) がありません。 このメッセージを生成するコードの例を次に示します。
#unassert system(
メッセージ ID: E_TOKENS_EXPECTED_AFTER_L_PAREN
#unassert 指令では、削除する述語の表明を括弧で囲む必要があります。 このメッセージを生成するコードの例を次に示します。
#unassert system(unix
メッセージ ID: E_R_PAREN_EXPECTED
#unassert 指令において、述語の表明を区切る括弧 ( ) に囲まれたトークン がありません。 このメッセージを生成するコードの例を次に示します。
#unassert machine()
メッセージ ID: E_EMPTY_PREDICATE_ARGUMENT
#unassert 指令では、削除する述語の表明は、括弧で囲む必要があります。 このメッセージを生成するコードの例を次に示します。
#unassert system unix
メッセージ ID: E_L_PAREN_EXPECTED_AFT_FIRST_ID
ANSI C で定義されているマクロを、ソースコードで定義または再定義しようとしています。定義済みのマクロは変更されません。 このメッセージを生成するコードの例を次に示します。
#define __FILE__ "xyz.c" #define __LINE__ "10" #define __DATE__ "Jan 21 1993" #define __TIME__ "10:20:04"
メッセージ ID: E_CANT_REDEFINE_ANSI_PREDEFINE
前処理演算子 "defined" を、マクロ名として定義することはできません。 このメッセージを生成するコードの例を次に示します。
#define defined xyz
メッセージ ID: E_CANNOT_DEFINE_DEFINED
ANSI C では、事前定義シンボル __STDC__ の定義を解除することはできません。しかし ANSI C 環境と ANSI C 以外の環境の両方で動作するように記述した C コードをテストするような場合、この機能があると便利です。 たとえば、__STDC__ の有無を調べて、定義されている場合は関数のプロト型宣言を行い、未定義の場合は旧式の関数宣言と定義を行う C コードがあるとします。C コンパイラは、__STDC__ を事前定義するので、旧式のコードを検査するには、通常は別のコンパイラ (非 ANSI C コンパイラ) を使用する必要があります。しかし、Sun C コンパイラでは、(通常はコマンド行で) __STDC__ の定義解除をすることによって、この検査を行うことができます。このメッセージは、ANSI C の制限事項に反した機能を使用していることを通知するものです。 このメッセージを生成するコードの例を次に示します。
#undef __STDC__ /* 通常 cc のコマンド行で -U__STDC__ */ #ifdef __STDC__ int myfunc(const char *arg1, int arg2) #else /* 非 ANSI C */ int myfunc(arg1,arg2) char *arg1, /* oops */ int arg2; #endif { }
メッセージ ID: E_UNDEFINING__STDC__
ソースコードで、ANSI C ですでに定義されているマクロの定義を解除しようとしています。 このメッセージを生成するコードの例
#undef __FILE__ #undef __LINE__ #undef __DATE__ #undef __TIME__
メッセージ ID: E_CANT_UNDEFINE_ANSI_PREDEFINE
前処理演算子 "defined" の定義を解除することはできません。 このメッセージを生成するコードの例を次に示します。
#undef defined
メッセージ ID: E_CANT_UNDEFINE_DEFINED
cc -D コマンド行オプションのあとには、識別子を続ける必要があります。 このメッセージを生成するコードの例を次に示します。
cc -D3b2 -c x.c
メッセージ ID: E_D_OPT_ARG_NOT_AN_IDENTIFIER
cc コマンドに対する -D オプションで指定された識別子のあとにトークンを続ける場合は、最初のトークンは = にする必要があります。 このメッセージを生成するコードの例を次に示します。
cc -DTWO+2 -c x.c
メッセージ ID: E_D_OPT_NOT_FOLLOWED_BY_EQUAL
cc -U コマンド行オプションのあとには、識別子を続ける必要があります。 このメッセージを生成するコードの例を次に示します。
cc -U3b2 -c x.c
メッセージ ID: E_U_OPT_ARG_NOT_AN_IDENTIFIER
-U オプションを指定するコマンド行で、定義を解除するマクロ名のあとにトークンが指定されています。 このメッセージを生成するコードの例を次に示します。
cc -Uunix,u3b2 -c x.c
メッセージ ID: E_TOKENS_IGNORED_AFTER_U_OPT
#define 指令に、定義するマクロまたはその他のトークンのいずれもありません。 このメッセージを生成するコードの例を次に示します。
#define
メッセージ ID: E_EMPTY_POIND_DEFINE_DIRECTIVE
#define 指令のあとには、定義するマクロの名前を続ける必要があります。 このメッセージを生成するコードの例を次に示します。
#define +3
メッセージ ID: E_PND_DEF_REQUIRES_MACRO_NAME
関数形式のパラメータ定義で、#define 指令と同じ論理行に ) 文字がありません。 このメッセージを生成するコードの例を次に示します。
#define mac(a
メッセージ ID: E_INCOMPLETE_DEF_MACRO_PARAMS
関数形式のマクロ定義におけるマクロパラメータリストの書式が正しくありません。各識別子をカンマで区切る必要があります。 このメッセージを生成するコードの例を次に示します。
#define mac(a,b,) a b
メッセージ ID: E_SYNTAX_ERROR_IN_MACRO_PARAMS
マクロ定義で、# または ## の演算子のあとに、さらに別の # または ## が続いています。 このメッセージを生成するコードの例を次に示します。
#define bug(s) # # s #define bug2(s) # ## s
メッセージ ID: E_BAD_SHARP_OR_SHARPS_IN_MACRO
## 演算子は 2 項連結演算子なので、マクロ定義のマクロ置換リスト中で最初のトークンには使用できません。 このメッセージを生成するコードの例を次に示します。
#define mac(s) ## s
メッセージ ID: E_CANT_BEGIN_MACRO_WITH_SHARP
マクロ定義で # 演算子のあとに続く識別子は、関数形式マクロの仮引数にする必要があります。 このメッセージを生成するコードの例を次に示します。
#define mac(a) "abc" # b
メッセージ ID: E_NON_FORMAL_ID_FOLLOWS_SHARP
このメッセージは、-Xt オプションを指定している場合に表示されます。コンパイラが、見かけ上の連結を ## 演算子と同様に扱うことを示します。この演算子を使用するようにソースコードを変更することをお勧めします。 このメッセージを生成するコードの例を次に示します。
#define PASTE(a,b) a/*GLUE*/b int PASTE(prefix,suffix) = 1; /* "prefixsuffix" を作成 */
メッセージ ID: E_COMMENT_REPLACED_BY_SHARPS
このメッセージは、-Xa オプションまたは -Xc オプションを指定している場合に表示されます。K&R C の以前のリリースでは、2 つのトークンの間にコメントを入れてマクロ中に並置すると、2 つのトークンを連結することができます。ただしこの動作は、定義および保証されていません。ANSI C には、同じ用途に利用できる ## 演算子が定義されているので、これを使用するようにしてください。このメッセージは、旧バージョンの動作がサポートされていないことを示します。 このメッセージを生成するコードの例を次に示します。
#define PASTE(a,b) a/*GLUE*/b int PASTE(prefix,suffix) = 1; /* "prefixsuffix" は生成されない */
メッセージ ID: E_COMMENT_DOSNT_CONCAT_TOKENS
K&R C の以前のリリースでは、マクロ定義の一部である文字列リテラル中の仮引数の値を置換することが可能でした。ANSI C では、この方法は使用できません。 ANSI C では、別の方法で同じ処理を行うことができます。文字列化を行う演算子 # によって、マクロ引数のトークンが文字列リテラルに変換され、隣接する文字列リテラルは連結されます。正しい書式は次のとおりです。
#define HELLO(name) name char *hello_mindy = HELLO("Mindy");
このメッセージを生成するコードの例を次に示します。
#define HELLO(name) "name" char *hello_mindy = HELLO(Mindy);
メッセージ ID: E_MACRO_REPLACEMENT_IN_STRING
K&R C の以前のリリースでは、マクロ定義の一部である文字定数中の仮引数の値を置換することができます。ANSI C では、この方法は使用できません。 ANSI C で使用するこの構文は次のとおりです。
#define CTRL(x) (x037) /* 書式制御文字 */ int ctrl_c = CTRL('c');このメッセージを生成するコードの例を次に示します。
#define CTRL(x) ('x'037) /* 書式制御文字 */ int ctrl_c = CTRL(c);
メッセージ ID: E_MACRO_REPLACEMENT_CHAR_CONST
このメッセージは、-Xa オプションまたは -Xc オプションを指定している場合に表示されます。-Xt モードで行われるマクロ置換が、-Xa モードまたは -Xc モードでは行われないことを示します。
メッセージ ID: E_NO_REPLACEMENT_IN_STRING
このメッセージは、-Xa オプションまたは -Xc オプションを指定している場合に表示されます。-Xt モードで行われるマクロ置換が、-Xa モード または -Xc モードでは行われないことを示します。
メッセージ ID: E_NO_REPLACEMENT_IN_CHAR_CONST
文字列化演算子 # のあとには、関数形式マクロの仮引数の名前を続ける必要があります。 このメッセージを生成するコードの例を次に示します。
#define mac(a) # + a
メッセージ ID: E_ID_REQUIRED_FOR_POUND_DEFINE
# または ## 演算子は、マクロ定義のマクロ置換リスト中で最後のトークンとして使用することはできません。 このメッセージを生成するコードの例を次に示します。
#define mac1(s) abc ## s ## #define mac2(s) s #
メッセージ ID: E_CANT_END_MACRO_WITH_SHARP
#undef 指令中に、定義解除するマクロ名がありません。 このメッセージを生成するコードの例を次に示します。
#undef
メッセージ ID: E_EMPTY_UNDEF_DIRECTIVE
#undef のあとには、定義を解除するマクロの名前を続ける必要があります。この指令のあとにあるトークンが識別子ではありません。 このメッセージを生成するコードの例を次に示します。
#undef 4
メッセージ ID: E_ID_EXPECTED_AFTER_UNDEF
指令の行に、余分なトークンが含まれています。そのトークンは無効です このメッセージを生成するコードの例を次に示します。
#undef a b /* 1 つだけ定義を解除できる */
メッセージ ID: E_TKNS_IGNORED_AT_END_OF_DIR
#if または #elif 指令中に必要な数値が見つかりません。 このメッセージを生成するコードの例を次に示します。
#if 1 + int i = 1; #endif
メッセージ ID: E_NUMBER_EXPECTED
前処理の条件付きコンパイル指令の定数式の書式が正しくありません。必要な演算子がありません。 このメッセージを生成するコードの例を次に示します。
#if 1 4 int i = 1; #endif
メッセージ ID: E_MISSING_OPERATOR
#if または #elif の指令中に、不要な右括弧 ) があります。 このメッセージを生成するコードの例を次に示します。
#if ) 1 int i = 1; #endif
メッセージ ID: E_UNEXPECTED_R_PAREN
#if または #elif の指令中に、不要な左括弧 ( があります。 このメッセージを生成するコードの例を次に示します。
#if 1 ( int i = 1; #endif
メッセージ ID: E_UNEXPECTED_L_PAREN
前処理の条件付きコンパイル指令の定数式の書式が正しくありません。演算子に必要なオペランドがありません。 このメッセージを生成するコードの例を次に示します。
#define EMPTY #if EMPTY / 4 int i = 1; #endif
メッセージ ID: E_MISSING_OPERAND
式中にゼロによる除算があります。この除算が #if または #elif 指令中にある場合、結果はゼロと解釈されます。実行可能コードにゼロ除算がある場合は、警告になります。大域的な初期設定子または static 初期設定子にゼロ除算がある場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
f(void) { int i = 1/0; }
メッセージ ID: E_DIVISION_BY_ZERO
% 演算子の第 2 オペランドがゼロです。剰余演算子が #if または #elif 指令中にある場合、結果はゼロと解釈されます。 実行可能コードに剰余式がある場合は、警告になります。大域的な初期設定子または static 初期設定子に 剰余式がある場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
#if 42 % 0 int i = 1; #endif
メッセージ ID: E_MODULUS_BY_ZERO
文字列リテラルおよび文字定数で、\ のあとには特定の文字しか続けることができません。たとえば、c を続けることはできません。 ANSI C は \ を無視します。 このメッセージを生成するコードの例を次に示します。
int i = '\c';
メッセージ ID: E_DUBIOUS_ESCAPE_CHAR
文字列リテラルおよび文字定数で、特定の出力されない文字のみを、\ のあとに続けることができます。メッセージ中で括弧に囲まれた値は、16 進数で表わした文字コードです。
メッセージ ID: E_DUBIOUS_ESCAPE_UNPRINTABLE
このメッセージは、-Xt オプションを指定している場合に表示されます。 ほかの K&R C コンパイラでは、'\a' は 'a' と等価です。ただし、ANSI C では '\a' は警告文字として定義されています。対応する文字コードは 07 で、BEL 文字を表します。 このメッセージを生成するコードの例を次に示します。
int c = '\a';
メッセージ ID: E_ESC_A_IS_ANSI_ALERT
-Xs または -Xt のコンパイラモードを指定している時は、コンパイラは "\x" を "x" という文字列として解釈します。 ただし、ANSI C モード (-Xa および -Xc) の場合は、
"\x<16 進数>"によって、16 進エスケープシーケンスが指定されます。 このメッセージを生成するコードの例 (-Xs オプションでコンパイルした場合)
char *cp = "254 の 16 進数エスケープシーケンス: \xfe";
メッセージ ID: E_ESC_X_IS_ANSI_HEX_ESCAPE
このメッセージは、-Xa オプションまたは -Xc オプションを指定している場合に表示されます。文字定数、または文字列リテラルの中に \x エスケープがあると、16 進文字のエスケープが生成されます。\x のあとには、少なくとも 1 文字の 16 進数を続ける必要があります。 このメッセージを生成するコードの例を次に示します。
char *cp = "&\xz";
メッセージ ID: E_NO_HEX_DIGITS_AFTER_ESCAPE_X
文字定数または文字列リテラルにある 16 進エスケープ (\x) で、エスケープの累積値が大き過ぎます。下位の 32 ビットだけが保持されます。 このメッセージを生成するコードの例を次に示します。
int i = '\xabcdefedc';
メッセージ ID: E_OVERFLOW_IN_HEX_ESCAPE
文字が含まれない文字定数が使用されました。 このメッセージを生成するコードの例を次に示します。
f(void) { char c = ''; /* char c = ' '; とする */ }
メッセージ ID: E_EMPTY_CHAR_CONSTANT
文字定数中の文字数が多すぎて、1 つの整数に収まりません。通常の文字定数の場合は最初の 4 文字、ワイド文字定数の場合は最初の 1 文字だけが使用されます。2 文字以上の文字定数の使用には移植性がありません。 このメッセージを生成するコードの例を次に示します。
int i = 'abcde';
メッセージ ID: E_CHAR_CONST_TOO_LONG
ご使用中のシステムでは、文字列リテラルまたは文字定数の中のマルチバイト文字を、1 文字のワイド文字に変換できません。また、別の場所で検出されたマルチバイトは無視されています。
メッセージ ID: E_INVALID_MULTIBYTE_CHAR
文字定数または文字列リテラル中にある 16 進または 8 進のエスケープシーケンスによって、unsigned char よりもサイズが大きい値が生成されます。この値は余分な桁が切り捨てられます。 このメッセージを生成するコードの例を次に示します。
char *p = "\x1ff\400";
メッセージ ID: E_CHAR_ESC_DOES_NO_FIT_IN_CHAR
このメッセージは、-Xt オプションを指定している場合に表示されます。 0 で始まる整数定数に、8 進数でない数字が含まれています。 8 や 9 は無効な値ですが、それぞれ 8 および 9 の値として扱われます。 このメッセージを生成するコードの例を次に示します。
int i = 08;
メッセージ ID: E_BAD_OCTAL_DIGIT
前処理条件付きコンパイル指令の中で、括弧が対になっていません。 このメッセージを生成するコードの例を次に示します。
#if ((1) int i = 1; #endif
メッセージ ID: E_MISMATCHED_PARENS
#if または #elif 指令中にある、 ?~: 式の書式が正しくありません。 このメッセージを生成するコードの例を次に示します。
#if defined(foo) ? 5 int i; #endif
メッセージ ID: E_MISMATCHED_TERNARY_OP
マクロ展開後に、#if または #elif 指令中の式にトークンが含まれていません。 このメッセージを生成するコードの例を次に示します。
#define EMPTY #if EMPTY char *mesg = "EMPTY が空ではない"; #endif
メッセージ ID: E_EMPTY_CONST_EXP_AFTER_EXPAND
コンパイラが標準出力 (stdout) にアクセスする時に、ファイルシステムエラーが発生しました。
メッセージ ID: E_CANT_DUP_STDOUT
コンパイラが標準出力 (stdout) にアクセスする時に、ファイルシステムエラーが発生しました。
メッセージ ID: E_CANT_OPEN_ALT_STDOUT
コンパイラが /dev/null にアクセスする時に、ファイルシステムエラーが発生しました。
メッセージ ID: E_CANT_OPEN_DEV_NULL
中間ファイルの書き込み中に、ディスク領域が足りなくなりました。 一時ファイルを書き込むファイルシステムに十分な領域があることを確認してから、コンパイルを行なってください。TMPDIR 環境変数を使用すると、コンパイラが一時ファイルを書き込む位置を変更することができます。
メッセージ ID: E_TMPFILE_FILE_SYSTEM_FULL
関数定義中で、無効な型によってパラメータが宣言されています。型が未定義であるか、型に対応しない識別子が使用されています。通常このメッセージは、構文エラーメッセージのあとに出力されます。 このメッセージを生成するコードの例を次に示します。
int f1(what arg) { }
メッセージ ID: E_UNDEFINED_OR_MISSING_TYPE
このメッセージは、セミコロンがない、右の大括弧または中括弧がない、言語トークンが並置されている、などの構文エラーがある場合に出力されます。メッセージ中には、エラーが検出されたソースコードの行番号およびトークンが示されます。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = 3 /* セミコロンがない */ } f(int i){ int j; j = (i + 24; /* 右の括弧がない */ }
メッセージ ID: E_YACC_GENERIC_ERROR
このメッセージは、セミコロンがない、右の大括弧または中括弧がない、言語トークンが並置されている、などの構文エラーがある場合に出力されます。メッセージ中には、エラーが検出されたソースコードの行番号およびトークンが示されます。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = 3 /* セミコロンがない */ } f(int i){ int j; j = (i + 24; /* 右の括弧がない */ }
メッセージ ID: E_YACC_ERROR
void へのポインタを使用してオブジェクトにアクセスすることはできません。ソース中に、void への (おそらく修飾子のついた) ポインタを介して間接参照している式があります。 この間接参照は無視されます。ただし、式のその他の部分は有効です。 このメッセージを生成するコードの例を次に示します。
f(void){ volatile void *vp1, *vp2; *(vp1 = vp2);/* 代入はうまく実行できます */ }
メッセージ ID: E_ACCESS_VIA_VOID_PTR_IGNORED
現在の switch 文に、同じ定数値を持つ case 文が 2 つ存在します。 このメッセージを生成するコードの例を次に示します。
f(void){ long long i = 5; switch(i) { case 4: case 4: break; } }
メッセージ ID: E_DUP_CASE_IN_SWITCH_L
現在の switch 文に、同じ定数値を持つ case 文が 2 つ存在します。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = 5; switch(i) { case 4: case 4: break; } }
メッセージ ID: E_DUP_CASE_IN_SWITCH
asm 文は、関数本体の中でのみ使用できます。外部宣言のレベルでは使用できません。 このメッセージを生成するコードの例を次に示します。
asm(" .align 4 "); /* 誤 */ void f(void) { asm(" nop "); /* 正 */
メッセージ ID: E_ASM_ILLEGAL_OUTSIDE_FUNC
旧バージョンの asm() に対する引数は、ワイド文字列リテラルではなく、標準の文字列リテラルにする必要があります。 このメッセージを生成するコードの例を次に示します。
asm(L"wide string literal not allowed");
メッセージ ID: E_ASM_ARG_MUST_BE_STRING
旧バージョンの asm() で使用された文字列リテラルに、NUL (文字コード 0) が組み込まれています。 このメッセージを生成するコードの例を次に示します。
asm("this is an old-style asm with embedded NUL: \0");
メッセージ ID: E_EMBEDDED_NUL_ILLEGAL_IN_ASM
このメッセージは、-v、-O、-xO[level] オプションを指定している場合に表示されます。関数中に asm 文があると、その関数の最適化は行なわれません。 このメッセージを生成するコードの例を次に示します。
void foo(void) { asm(".volatile"); asm(" st %g0, [%sp+0x44]"); asm(" ld [%sp+0x44], %fsr"); asm(" nop"); asm(".nonvolatile"); }
メッセージ ID: E_ASM_DISABLES_OPTIMIZATION
前処理の完了後、ソースファイル中にトークンがありません。 ANSI C では、トークンのないファイルについては、メッセージが出力されます。 このメッセージを生成するコードの例を次に示します。
#ifdef COMPILE int token; #endif
メッセージ ID: E_EMPTY_TRANSLATION_UNIT
ロックへのアクセスに、(実体を特定できない) 単なるポインタを使用しているので、どのロックが操作されているかを lock_lint が特定できません。 このメッセージを生成するコードの例を次に示します。
struct G_Mutex { mutex_t* amutex; int global_data; }; struct G_Mutex* global_mutex; int add_data() { mutex_lock(global_mutex->amutex); /* <=== 警告 */ global_mutex->global_data++; mutex_unlock(global_mutex->amutex); /* <=== 警告 */ return global_mutex->global_data; } ================== /* lock_lint が処理できるコード例 */ struct G_Mutex { mutex_t amutex; /* <=== OK */ int global_data; }; int add_data() { mutex_lock(&global_mutex->amutex); /* <=== OK */ global_mutex->global_data++; mutex_unlock(&global_mutex->amutex); /* <=== OK */ return global_mutex->global_data; }
メッセージ ID: E_LOCK_FUNC_IGNORES_PTR
lock_lint でソースコードを静的に解析しても、関数呼び出しで ?: 演算子が使用されているので、渡されているパラメータを特定することができません。 このメッセージを生成するコードの例を次に示します。
mutex_t mutex1; mutex_t mutex2; mutex_lock((1==1)? &mutex1 : &mutex2);
メッセージ ID: E_CONDITIONAL_OP_LOCK_CHOICE
lock_lint によるソースコードの静的解析で、指定された関数がロックを獲得することができたとみなされます。 このメッセージを生成するコードの例を次に示します。
mutex_t mutex1; if (mutex_trylock(&mutex1)) goto getlock;
メッセージ ID: E_ASSUME_SUCCESSFUL_LOCK
lock_lint でソースコードを静的解析しても、関数呼び出しで ?: 演算子が使用されているので渡されているパラメータを特定することができません。lock_lint によるソースコードの静的解析では、該当する条件変数が対応する関数にパラメータとして渡されているとみなされます。 このメッセージを生成するコードの例
int waitWriter; f() { cond_t condt1, condt2; cond_wait((waitWriter == 0) ? condt1 : condt2); }
メッセージ ID: E_CONDITIONAL_OP_CONDVAR_CHOICE
lock_lint は、操作されているロックを特定することができないので、(実体を特定できない) 条件変数へのポインタは無視されます。 このメッセージを生成するコードの例を次に示します。
cond_t* ptr; int count = 0; /* 共有変数 */ while (count == 0) cond_wait(ptr); /* lock_lint が解析できる例 */ cond_t p; while (count == 0) cond_wait(&p);
メッセージ ID: E_CV_FUNC_IGNORES_SIMPLE_PTR
関数に 2 つの引数が必要ですが、2 番目の mutex 引数を指定していません。 このメッセージを生成するコードの例を次に示します。
kcondvar_t cvp; cv_wait(&cvp); /*====================== ** 正しい例: */ kcondvar_t cvp; kmutex_t mp; cv_wait(&cvp, &mp);
メッセージ ID: E_SECOND_MUTEX_MISSING
void 型のオペランドがあります。 このメッセージを生成するコードの例を次に示します。
f(void){ void v(void); int i = v(); }
メッセージ ID: E_OPERAND_CANT_BE_VOID_TYPE
-Xs オプションを使用すると、2 文字の代入演算子の間に空白を入れることができます。 2 文字の代入演算子には、次のようなものがあります。
+=, -=, *=, /=, &=, |=, ^=, %=ただし、-Xs オプション以外のコンパイラモードでは、2 文字の代入演算子の間に空白を入れることはできません。 このメッセージを生成するコードの例を次に示します。
int i + = 1; /* += 演算子 */ int k - = 1;
メッセージ ID: E_WHITESPACE_IN_CHAR_ASSIGN_OPS
ANSI C と旧バージョンの K&R C では、型拡張の規則が多少異なります。現リリースでは、デフォルトでは以前の規則が適用されます。コンパイラコマンドに -Xa オプションを指定すると、ANSI C の規則を適用することができます。 旧バージョンの K&R C の型拡張の規則では、unsigned 型のまま評価されます。式に unsigned 型のオペランドがある場合、オペランドが共通の unsigned 型に拡張されたあとに、演算が実行されます。 ANSI C では、値を保持したまま型を拡張する規則を使用します。unsigned 型は、その値がすべて signed 型で表現できる場合は signed 型に拡張されます。 また、ANSI C と旧バージョンの K&R C では、符号ビットを暗黙に設定する整数定数型に関する規則が異なります。 型拡張に関する規則が異なると、オペランドが "unsigned" であるかどうかに影響される、演算子の動作も異なる可能性があります。
o 除算演算子: /, /=, %, %= o 右シフト演算子: >>, >>= o 関係演算子: <, <=, >, >=このメッセージは、プログラム中に、演算子の動作が将来変わる可能性のある式があることを示しています。式の中に明示的にキャストを挿入することによって、動作を確定することができます。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; /* 定数が、K&R C の場合は int 、ANSI C の場合は unsigned */ i /= 0xf0000000; }
メッセージ ID: E_ANSI_CONST_UNSIGNED_OP
ANSI C と旧バージョンの K&R C では、型拡張の規則が多少異なります。現リリースでは、デフォルトでは以前の規則が適用されます。cc コマンドに -Xa オプションを指定すると、ANSI C の規則を適用することができます。 旧バージョンの K&R C の型拡張の規則では、unsigned 型のまま評価されます。式に unsigned 型のオペランドがある場合、オペランドが共通の unsigned 型に拡張されたあとに、演算が実行されます。 ANSI C では、値を保持したまま型を拡張する規則を使用します。unsigned 型は、その値がすべて signed 型で表現できる場合は signed 型に拡張されます。 型拡張に関する規則が異なると、オペランドが "unsigned" であるかどうかに影響される、演算子の動作も異なる可能性があります。
o 除算演算子: /, /=, %, %= o 右シフト演算子: >>, >>= o 関係演算子: <, <=, >, >=このメッセージは、プログラム中に、演算子の動作が将来変わる可能性のある式があることを示しています。次のように、式の中に明示的にキャストを挿入することによって、動作を確定することができます。
f(void){ unsigned char uc; int i; /* K&R C の場合は unsigned、ANSI C の場合は signed の除算 */ i /= (unsigned int) uc; }このメッセージを生成するコードの例を次に示します。
f(void){ unsigned char uc; int i; /* K&R C の場合は unsigned、ANSI C の場合は signed の除算 */ i /= uc; }
メッセージ ID: E_SEMANTICS_OF_OP_CHG_IN_ANSI_C
整数定数が大きすぎて、unsigned long 型にできません。 このメッセージを生成するコードの例を次に示します。
int i = 123456789012345678901;
メッセージ ID: E_INTEGRAL_CONSTANT_TOO_LARGE
接尾辞で指定された型に対して、定数の値が大きすぎるので、unsigned int 型に拡張されます。
メッセージ ID: E_CONST_PROMOTED_UNSIGNED_INT
接尾辞で指定された型に対して、定数の値が大きすぎるので、unsigned long 型に拡張されます。
メッセージ ID: E_CONST_PROMOTED_UNSIGNED_LONG
このメッセージは、-v オプションを指定している場合に表示されます。接尾辞で指定された型に対して定数が大きすぎるので、long long 型または unsigned long long 型に拡張されます。 このメッセージを生成するコードの例を次に示します。
if (9223372036854775807L > 0) printf("符号拡張された\n"); if (9223372036854775807UL > 0) printf("符号拡張された\n");
メッセージ ID: E_CONST_PROMOTED_UNSIGNED_LL
接尾辞で指定された型に対して、定数の値が大きすぎるので、long 型に拡張されます。
メッセージ ID: E_CONST_PROMOTED_LONG
このメッセージは、-v オプションを指定している場合に表示されます。接尾辞で指定された型に対して定数が大きすぎるので、long long 型または unsigned long long 型に拡張されます。 このメッセージを生成するコードの例を次に示します。
if (9223372036854775807L > 0) printf("符号拡張された\n"); if (9223372036854775807UL > 0) printf("符号拡張された\n");
メッセージ ID: E_CONST_PROMOTED_LONG_LONG
浮動小数点定数が大きすぎて、float 型にできません。 このメッセージを生成するコードの例を次に示します。
float f = 1e300f;
メッセージ ID: E_CONV_CONST_FP_FLOAT_OUT_RANGE
浮動小数点定数が大きすぎて、long double 型にできません。
メッセージ ID: E_CNV_CNST_FP_LONG_DBL_OUTRANGE
浮動小数点定数が大きすぎて、double 型にできません。
メッセージ ID: E_CONV_CONST_FP_DBL_OUT_RANGE
このメッセージは、-Xc オプションを指定した場合にエラーが発生すると表示されます。プログラムには、&... が含まれているので、-Xc オプションを使用してコンパイルされます。 ANSI C では、&... は無効なので、明示的に使用しないでください。
メッセージ ID: E_AND_DOT_DOT_DOT_INVALID
整数値を生成するために、コンパイル時に評価できる整数定数または式が必要です。コンパイル時に評価できない、整数以外の値、オブジェクトへの参照、演算子が、式中で使用されています。 このメッセージを生成するコードの例を次に示します。
int ia[5.0];
メッセージ ID: E_INTEGRAL_CONST_EXP_EXPECTED
プログラム中で、-> または . の演算子が使用されており、name が 演算子の左で参照される構造体または共用体のメンバーではなく、別の構造体または共用体のメンバーになっています。 メンバーが一意でない場合はエラーになります。一意のメンバーとは、複数の構造体または共用体の一部であり、すべての構造体および共用体において型とオフセットが同じであるメンバーのことです。 このメッセージを生成するコードの例を次に示します。
struct s1 { int x,y;}; struct s2 { int q,r;}; f(void){ struct s1 *ps1; ps1->r = 3; }
メッセージ ID: E_IMPROPER_MEMBER_USE
プログラムが、いずれの構造体としても宣言されていない構造体または共用体のメンバーを参照しています。 このメッセージを生成するコードの例を次に示します。
struct s { int x;}; f(void){ struct s q; q.y = 1; }
メッセージ ID: E_UNDEFINED_STRUCT_UNION_MEMBER
-> 演算子の左にあるオペランドが、構造体、共用体、またはそれらに対するポインタではありません。また、宣言されたすべての構造体および共用体の中で、メンバー name が一意になっていません。-> 演算子を、構造体または共用体だけに使用し、メンバーが、左のオペランドに対応する構造体または共用体に属している必要があります。
メッセージ ID: E_NON_UNIQUE_REQRS_S_U_PTR
. 演算子の左にあるオペランドが、構造体、共用体、またはそれらに対するポインタではありません。また、宣言されたすべての構造体および共用体の中で、メンバー name が一意になっていません。. 演算子を、構造体または共用体だけに使用し、メンバーが、左のオペランドに対応する構造体または共用体に属している必要があります。 このメッセージを生成するコードの例を次に示します。
struct s1 { int x,y;}; struct s2 { int y,z;}; f(void){ long *lp; lp.y = 1; }
メッセージ ID: E_NON_UNIQUE_REQRS_S_U_OBJ
このメッセージは、-v オプションを指定している場合に表示されます。 プログラム中で宣言されていない関数を呼び出しています。 関数が int の値を返すと仮定されることを示しています。 このメッセージを生成するコードの例を次に示します。
void v(void){ g(); }
メッセージ ID: E_IMPLICIT_DECL_FUNC_RETURN_INT
スコープ内に宣言されていないシンボルが参照されています。 このメッセージを生成するコードの例を次に示します。
f(void){ g(i); }
メッセージ ID: E_UNDEFINED_SYMBOL
有効でなくなったスコープ中でオブジェクトが宣言されています。ANSI C では、このようなオブジェクトを参照すると、エラーになります。このような関数の呼び出しは、戻り値が int となる 関数の呼び出しとして解釈されます。C コンパイラは、以前の宣言を記憶しているので、これを使用します。このメッセージによって、コンパイラが実行した内容を確認することができます。 このメッセージを生成するコードの例を次に示します。
f(void){ extern int i; double sin(double); } g(void){ double d = sin(1.5); i = 1; }
メッセージ ID: E_USING_OUT_OF_SCOPE_DECL
sizeof 演算子は、関数には適用できません。 このメッセージを生成するコードの例を次に示します。
int f(void); int i = sizeof(f);
メッセージ ID: E_CANT_TAKE_SIZEOF_FUNC
sizeof 演算子は、関数には適用できません。 このメッセージを生成するコードの例を次に示します。
int f(void); int i = sizeof(f);
メッセージ ID: E_CANT_TAKE_SIZEOF_FUNC_N
sizeof 演算子は、void 型には適用できません。 このメッセージを生成するコードの例を次に示します。
void v(void); int i = sizeof(v());
メッセージ ID: E_CANT_TAKE_SIZEOF_VOID
sizeof 演算子は、ビットフィールドには適用できません。 このメッセージを生成するコードの例を次に示します。
struct s { int x:3; } st; int i = sizeof(st.x);
メッセージ ID: E_CANT_TAKE_SIZEOF_BIT_FIELD
1 つのオペランドに対するその他のオペランドの型が、この演算子には不適切です。 このメッセージを生成するコードの例を次に示します。
f(void){ char *cp; int *ip; void *vp = ip + cp; }
メッセージ ID: E_OPERANDS_INCOMPATIBLE_TYPES
?: 式中の条件式は、スカラー型 (整数、浮動小数点、ポインタ) である必要があります。 このメッセージを生成するコードの例を次に示します。
struct s { int x; } st; f(void){ int i = st ? 3 : 4; }
メッセージ ID: E_FIRST_OPERAND_SCALAR_TYPE
. 演算子は、構造体または共用体のオブジェクトのみに適用されます。. の左にあるオペランドが、 配列、ポインタ、関数呼び出し、列挙型の定数または変数、レジスタに割り当てられたレジスタ値、のいずれかである場合はエラーになります。その他の場合は、警告になります。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s { short s;}; int i; i.s = 4; }
メッセージ ID: E_DOT_L_OPERAND_NOT_STRUCT_U
構造体または共用体のメンバーは、. 演算子の左のオペランドのメンバーである必要があります。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s { int x;}; char c; c.x = 1; }
メッセージ ID: E_CANT_ACCESS_MBR_NON_STRUCT_U
-> 演算子の左にあるオペランドが、構造体または共用体へのポインタになっていません。オペランドがポインタである場合は、警告になります。その他の場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
struct s { int x;}; f(void){ long *lp; lp->x = 1; } g(void) : struct s newStr; newS->x = 1; /* newStr は構造体だが、構造体へのポインタではない */ }
メッセージ ID: E_LEFT_MUST_BE_PTR_TO_STRUCT_U
整数型 (short, int, long など) オペランド用の演算子に対して、整数型以外のオペランドが指定されています。 このメッセージを生成するコードの例を次に示します。
struct Astr b; int a = 0x345 & b;
メッセージ ID: E_OPERAND_MUST_BE_INTEGRAL_TYPE
-、+ などの単項演算子のオペランドは、算術型にする必要があります。 このメッセージを生成するコードの例を次に示します。
struct Astr { int a; int b; } g(void) { struct Astr l; int k = l * 2; /* l は構造体 Astr で、算術型ではない */ l = -l; /* l は単項演算子 "-" または "+" のオペランド */ l = +l; /* だが、算術型ではない */ }
メッセージ ID: E_OPERAND_MUST_BE_ARITH_TYPE
単項演算子 "!" のオペランドは、スカラー型にする必要があります。また、"++" および "--" 演算子を使用している場合も、スカラー型にする必要があります。 このメッセージを生成するコードの例を次に示します。
struct aStr{ int a; int b; }; g(void) { struct aStr newStr; newStr++; /* 単項型演算子 ++ のオペランドは、スカラー型の必要がある */ newStr.a++; /* 正しい例 */ }
メッセージ ID: E_OPERAND_MUST_BE_SCALAR_TYPE
式の中に、サイズが不明のオブジェクトに対するポインタの演算が含まれています。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s *ps; g(ps+1); }
メッセージ ID: E_PTR_ARITH_MUST_KNOW_SIZE
減算のオペランドが両方ともポインタになっていますが、参照先の型が一致していません。同じ配列を指す同じ型のポインタどうしのみ、減算を行うことができます。 ポインタが同じサイズのオブジェクトを指している場合は、警告になります。その他の場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
f(void){ int *ip; char *cp; int i = ip - cp; }
メッセージ ID: E_BAD_POINTER_SUBTRACTION
関数呼び出しにおいて、関数または関数へのポインタの名前が正しくない式があります。 このメッセージを生成するコードの例を次に示します。
f(void){ char *p; p(); }
メッセージ ID: E_FUNC_DESIGNATOR_NOT_FUNC_TYPE
スコープ内でプロト型宣言されている関数を呼び出しており、呼び出し時に渡される引数の数が、宣言中のパラメータ数と一致していません。 このメッセージを生成するコードの例を次に示します。
int f(int); g(void){ f(1,2); }
メッセージ ID: E_PROTOTYPE_MISMATCH_ARGS
スコープ内でプロト型宣言されている関数を呼び出しており、呼び出し時に渡される引数の数が、宣言中のパラメータ数と一致していません。
メッセージ ID: E_PROTOTYPE_MISMATCH_ARG
このメッセージは、-v オプションを指定している場合に表示されます。関数の呼び出し時に関数に渡す引数の数が、関数に関するほかの情報と一致していません。ほかの情報とは、旧式 (非プロト型) の関数定義、またはスコープ外ではあるが記録が残っている関数プロト型宣言からの情報です。 旧式の関数定義を使用し、関数に可変数の引数がある場合には、このメッセージは正しくないことがあります。 このメッセージを生成するコードの例を次に示します。
extern int out_of_scope(); int f() { /* 関数に引数はない */ extern int out_of_scope(int); } int g() { f(1); /* f に引数はない */ out_of_scope(); /* out_of_scope に 1 つの引数が必要 */ }
メッセージ ID: E_ARGS_MISMATCH
このメッセージは、-v オプションを指定している場合に表示されます。関数の呼び出し時に関数に渡す引数の数が、関数に関するほかの情報と一致していません。ほかの情報とは、旧式 (非プロト型) の関数定義、またはスコープ外ではあるが記録が残っている関数プロト型宣言からの情報です。 旧式の関数定義を使用し、関数に可変数の引数がある場合には、このメッセージは正しくないことがあります。
メッセージ ID: E_ARG_MISMATCH
戻り値が構造体または共用体となる関数を呼び出す場合は、対応する構造体または共用体が完全に宣言されている必要があります。宣言されていない場合にこのメッセージが表示されます。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s g(); g(); }
メッセージ ID: E_CANT_RETURN_INCOMPLETE_TYPE
関数呼び出し中に、式の型が void である引数があります。 このメッセージを生成するコードの例を次に示します。
f(void){ void v(void); g(v()); }
メッセージ ID: E_VOID_EXP_MAY_NOT_BE_ARGS
関数呼び出し中の引数には、完全な型が必要です。渡された struct、union、または enum オブジェクトの型が不完全です。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s *st; g(*st); }
メッセージ ID: E_ARG_CANT_BE_UNKNOWN_SIZE
関数の引数を、関数プロト型宣言されている型に変換できません。 このメッセージを生成するコードの例を次に示します。
struct s {int x;} q; f(void){ int g(int,int); g(3,q); }
メッセージ ID: E_ARG_INCOMPATIBLE_WITH_ARG
代入演算のオペランドの型が不一致です。ポインタの型が一致していない場合は、警告になります。その他の場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
struct s { int x; } st; f(void){ int i; char *cp; const char *ccp; i = st; cp = ccp; }
メッセージ ID: E_ASSIGNMENT_TYPE_MISMATCH
キャストには適さないデータ型なので、式にキャストを適用することができません。キャストされる式の型とキャスト後の型の両方が、スカラー型である必要があります。ポインタは、整数型との間でのみキャストを行うことができます。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s {int x;} st; int i = (int) st; }
メッセージ ID: E_INVALID_CAST_EXPRESSION
関数からの戻り値を、その関数の戻り値の型に変換できません。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s { int x; } st; return( st ); }
メッセージ ID: E_RETURN_VALUE_TYPE_MISMATCH
一致しない型で変数が初期化されています。 たとえば、異なる型のオブジェクトを指すポインタを初期化しています。 このメッセージを生成するコードの例を次に示します。
struct s { int x; int y;}; const int i = 10; int *j = &i; /* <====== 型が一致していません */ struct s *foo = j; /* <====== 型が一致していません */
メッセージ ID: E_INITIALIZATION_TYPE_MISMATCH
switch 文の制御式を、int に変換できません。このメッセージは、"switch 式は整数型にする必要があります" のメッセージのあとに表示されます。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s {int x;} sx; switch(sx){ case 4: ; } }
メッセージ ID: E_INVALID_SWITCH_EXP_TYPE
このメッセージは、-v オプションを指定している場合に表示されます。関数の呼び出し時に関数に渡す引数の型が、関数に関するほかの情報と一致していません。ほかの情報とは、旧式 (非プロト型) の関数定義、またはスコープ外ではあるが記録が残っている関数プロト型宣言からの情報です。 問題の引数は、デフォルトの引数拡張規則に従って拡張されます。旧式の関数定義を使用し、関数に可変数の引数がある場合には、このメッセージは正しくないことがあります。 このメッセージを生成するコードの例を次に示します。
void f(i) int i; { } void g(void) { f("erroneous"); }
メッセージ ID: E_ARG_NOT_MATCH_REMEMBERED_TYPE
構造体または共用体のビットフィールドメンバーのアドレスを取得することはできません。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s { int x:3, y:4; } st; int *ip = &st.y; }
メッセージ ID: E_CANT_TAKE_ADDRESS_BIT_FIELD
レジスタ記憶クラスで宣言されたオブジェクトのアドレスを取得しようとしています。コンパイラが、実際にレジスタにオブジェクトを割り当てたかどうかにかかわらず、アドレスの取得はできません。配列を間接参照する時などは、暗黙のうちにオブジェクトのアドレスを使用しようとしている可能性があります。そのオブジェクトにレジスタが割り当てられている場合は、エラーです。その他の場合は、警告です。 このメッセージを生成するコードの例を次に示します。
f(void){ register int i; register int ia[5]; int *ip = &i; ia[2] = 1; }
メッセージ ID: E_CANT_TAKE_ADDRESS_REGISTER
取得できないアドレスを取得しようとしています。 このメッセージを生成するコードの例を次に示します。
f(void){ int *ip = &g(); }
メッセージ ID: E_BAD_OPERAND_FOR_UNARY_AND
* 演算子 (ポインタによる間接参照) のオペランドは、ポインタにする必要があります。このメッセージは、配列以外の部分に配列参照を行なった場合にも出力されます。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; *i = 4; i[4] = 5; }
メッセージ ID: E_CANT_DEREF_NON_POINTER_TYPE
if、for、while、または do-while の式は、整数、浮動小数点、またはポインタのいずれかの型にする必要があります。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s {int x;} st; while (st) {} }
メッセージ ID: E_CNTRL_EXP_MUST_BE_SCALAR_TYPE
代入演算によって変更されるオブジェクトを構成するオペランドに、キャストを適用することはできません。オペランドの型のサイズと、キャスト後の型のサイズが同じである場合は、警告になります。その他の場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; (long) i = 5; (short) i = 4; }
メッセージ ID: E_CAST_DOESNT_YIELD_LVALUE
演算子のオペランドが、変更可能な左辺値になっていません。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = --3; }
メッセージ ID: E_OPERAND_NOT_MODIFIABLE_LVALUE
演算子の左にあるオペランドが、変更可能な左辺値になっていません。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = 1; +i -= 1; }
メッセージ ID: E_L_OPERAND_NOT_MODIFIABLE_LVAL
void 型の式を void 以外にキャストすることはできません。 このメッセージを生成するコードの例を次に示します。
f(void){ void v(void); int i = (int) v(); }
メッセージ ID: E_BAD_CAST_OF_VOID_EXP
このメッセージは、-v オプションを指定している場合に表示されます。スコープ内にプロト型宣言がある関数に、列挙定数またはオブジェクトが渡されています。渡される引数の列挙型が、関数プロト型中の型と異なっています。 このメッセージを生成するコードの例を次に示します。
enum e1 { ec11 } ev1; enum e2 { ec21 } ev2; void ef(enum e1); void v(void){ ef(ec21); }
メッセージ ID: E_ENUM_TYPE_MISMATCH_ARG
演算子の両側の各オペランドの片方が列挙オブジェクトで、もう片方が異なる列挙型のオブジェクトまたは定数です。 このメッセージを生成するコードの例を次に示します。
enum e1 { ec11, ec12 } ev1; enum e2 { ec21, ec22 } ev2; void v(void){ if (ev1 > ec22) ; }
メッセージ ID: E_ENUM_TYPE_MISMATCH_OP
return 文に式が含まれていますが、宣言されている関数の型が void 型になっています。 このメッセージを生成するコードの例を次に示します。
void v(void){ return 3; }
メッセージ ID: E_VOID_CANT_RETURN_VALUE
コンパイラが malloc() を内部で使用しようとしましたが、失敗しました。通常、スワップ領域が不足していることが原因です。
メッセージ ID: E_CANT_MALLOC_ND1_TREE
サイズが未知のオペランドに対して、++、--、または = の演算子を適用しています。オペランドは通常、メンバーが宣言されていない構造体または共用体へのポインタです。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s *sp; sp++; }
メッセージ ID: E_UNKNOWN_OPERAND_SIZE
このメッセージは、-v オプションを指定している場合に表示されます。関係演算子を使用して、列挙型が異なる 2 つの列挙定数を比較しており、 これがエラーの原因となっています。列挙定数の値はコンパイル時に確定するので、比較の意味もその時にわかります。 このメッセージを生成するコードの例を次に示します。
enum e1 { ec11, ec12 } ev1; enum e2 { ec21, ec22 } ev2; void v(void){ if (ec11 > ec22) ; }
メッセージ ID: E_ENUM_CONSTS_HAVE_DIFF_TYPES
異なる型を指すポインタに対して、演算子を使用しています。 このメッセージを生成するコードの例を次に示します。
f(void){ char *cp; int *ip; if (ip < cp) ; }
メッセージ ID: E_OPERANDS_INCOMPAT_PTR_TYPES
演算子の一方のオペランドがポインタで、もう一方のオペランドが整数になっています。この組み合わせは不適切です。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = "abc"; int j = i ? 4 :"def"; }
メッセージ ID: E_BAD_PTR_INT_COMBINATION
スコープ内に関数プロト型宣言がある関数を呼び出すときに、ポインタが必要な箇所で整数が渡されています。または、整数が必要な箇所でポインタが渡されています。 このメッセージを生成するコードの例を次に示します。
int f(char *); g(void){ f(5); }
メッセージ ID: E_BAD_PTR_INT_COMB_ARG
データ型 long long int および unsigned long long int は ANSI C 標準ではないので、-Xc オプションを指定している場合には使用できません。
メッセージ ID: E_LONG_LONG_NOT_ALLOWED_XC
宣言の中で使用されている型識別子の組み合わせが不適切です。 このメッセージを生成するコードの例を次に示します。
short float f;
メッセージ ID: E_INVALID_TYPE_COMBINATION
このメッセージは、-v オプションを指定している場合に表示されます。 ANSI C 標準では、記憶クラス指示子を最初に記述して宣言を行う必要があります。 このメッセージを生成するコードの例を次に示します。
int static i;
メッセージ ID: E_TYP_STORAGE_CLASS_OBSOLESCENT
宣言中に複数の記憶クラスが指定されています。 このメッセージを生成するコードの例を次に示します。
f(void){ register auto i; }
メッセージ ID: E_ONLY_ONE_STORAGE_CLASS_ALLOWD
関数の外に置かれた宣言で、auto または register の 記憶クラスが使用されています。 このメッセージを生成するコードの例を次に示します。
auto int i; f(void){ }
メッセージ ID: E_AUTO_REG_INAPPROPRIATE_HERE
関数プロト型宣言で、記憶クラス指示子を指定することができますが、指定できるのは register だけです。 このメッセージを生成するコードの例を次に示します。
int f( register int x, auto int y );
メッセージ ID: E_ONLY_REG_VALID_FORMAL_PARAM
ANSI C では、型修飾子で typedef による定義を変更します。 このメッセージを生成するコードの例を次に示します。
typedef int INT; unsigned INT i
メッセージ ID: E_MODIFY_TYPEDEF_IGNORED
型識別子に、typedef によって定義された型と明示的な型修飾子が含まれています。typedef による宣言時に、すでに修飾子が指定されています。 このメッセージを生成するコードの例を次に示します。
typedef volatile int VOL; volatile VOL v;
メッセージ ID: E_TYPE_DEF_ALREADY_QUALIFIED
関数のプロト型宣言が、typedef によって union、struct、または enum として定義された名前で参照しています。その struct、union、または enum による定義は関数内で宣言されているため、プロト型宣言されている関数を定義する時にはスコープ外になります。したがって、プロト型宣言と関数定義が一致しなくなります。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s { int x;}; typedef struct s ST; extern int g(ST, struct s); }
メッセージ ID: E_DUBIOUS_REF_TYPEDEF
オブジェクトまたは関数が double と同義の long float として宣言されています。long float は、C コンパイラでは移行措置として使用できますが、ANSI C では認められていません。 このメッセージを生成するコードの例を次に示します。
long float f = 1.0;
メッセージ ID: E_USE_DOUBLE_INSTEAD_LONG_FLOAT
宣言中で、* のあとには、const または volatile の型修飾子のみを指定することができます。 このメッセージを生成するコードの例を次に示します。
int * const p; int * unsigned q;
メッセージ ID: E_ONLY_QUALS_ALLOWED_AFTER_STAR
配列のサイズが、ゼロまたは負の数に宣言されています。 このメッセージを生成するコードの例を次に示します。
int ia[-5]; int ib[0];
メッセージ ID: E_ZERO_OR_NEGATIVE_SUBSCRIPT
配列の宣言における次元の組み合わせによって、対象マシンには大き過ぎるオブジェクトが宣言されています。 このメッセージを生成するコードの例を次に示します。
int bigarray[2000000000];
メッセージ ID: E_ARRAY_DIMENSION_TOO_BIG
関数定義中で、パラメータ名として同じ名前が複数回使用されています。 このメッセージを生成するコードの例を次に示します。
int f(int i, int i) { } int g(i,j) int i; int i; { }
メッセージ ID: E_PARAM_REDECLARED
-Xt オプションを使用している場合に、パラメータの識別子中に "$" を 使用しています。これは、-Xa オプションまたは -Xc オプションを使用した場合には、構文エラーとなります。 このメッセージを生成するコードの例
int f(int i$j ){ };
メッセージ ID: E_DOLLAR_USED_IN_PARAMETER
-Xt オプションを使用している場合に、識別子中に "$" を使用しています。これは、-Xa オプションまたは -Xc オプションを使用した場合には、構文エラーとなります。 このメッセージを生成するコードの例を次に示します。
int a$b;
メッセージ ID: E_DOLLAR_USED_IN_IDENTIFIER
このメッセージは、-Xc および -v オプションを指定している場合に表示されます。K&R C では、可変数の引数を指定して固定の引数を 1 つも使用せずに、関数を定義することができます。ANSI C では、少なくとも 1 つの固定引数が必要です。 このメッセージを生成するコードの例を次に示します。
f(...){}
メッセージ ID: E_ANSI_REQS_FRML_PARM_BFORE_DOT
関数プロト型宣言中で、最初で 1 つのパラメータだけが void 型を使用できます。 このメッセージを生成するコードの例を次に示します。
int f(int,void);
メッセージ ID: E_VOID_MUST_BE_SOLE_PARAMETER
配列の次元が NULL であってはならない箇所で、NULL になっています。 問題の次元が一番外側にある場合は、警告になります。 その他の場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
int ia[4][]; struct s { int x, y[];}; int i = sizeof(int []);
メッセージ ID: E_NULL_DIMENSION
関数の配列または void 型の配列を、宣言しようとしています。 このメッセージを生成するコードの例を次に示します。
int f[5]();
メッセージ ID: E_CANT_DECL_ARY_OF_FUNC_VOID
戻り値の型が、関数または配列のポインタではなく、関数または配列である関数が宣言されています。 このメッセージを生成するコードの例を次に示します。
int f(void)[]; /* int の配列を返している関数 */
メッセージ ID: E_FUNC_CANT_RTN_FUNC_ARY
このメッセージは、-fd オプションを指定している場合に表示されます。旧式の関数定義が使用されています。 このメッセージを生成するコードの例を次に示します。
int f(a) char a; { }
メッセージ ID: E_OLD_STYLE_FUNC_DEF
このメッセージは、-fd オプションを指定している場合に表示されます。旧式の関数宣言が使用されています。 このメッセージを生成するコードの例を次に示します。
int f();
メッセージ ID: E_OLD_STYLE_FUNC_DECL
関数プロト型宣言に識別子リストを記述することはできません。型を宣言する必要があります。識別子リストは無視されます。 このメッセージを生成するコードの例を次に示します。
int f(i);
メッセージ ID: E_FUNC_PROTO_REQ_TYPES
void を単独で使用する場合は、const や volatile で修飾することはできません。 このメッセージを生成するコードの例を次に示します。
int f(const void);
メッセージ ID: E_BAD_QUALIFIERS_WITH_VOID
関数プロト型宣言で、void 型のパラメータ名が宣言されています。 このメッセージを生成するコードの例を次に示します。
int f(void v);
メッセージ ID: E_VOID_PARAM_CANT_HAVE_NAME
旧式の関数定義のパラメータ宣言中にある変数が、パラメータ識別子リスト中にはありません。 このメッセージを生成するコードの例を次に示します。
f(a,b) int i; {}
メッセージ ID: E_PARAM_NOT_IN_IDENTIFIER_LIST
旧式の C に定義されている asm 関数を使用しています。 このメッセージを生成するコードの例
int f(a) int a; { asm(" nop "); }
メッセージ ID: E_ASM_CANT_HAVE_OLD_STYLE_PARMS
関数プロト型定義で、パラメータ名が指定されていません。 このメッセージを生成するコードの例を次に示します。
int f(int){ }
メッセージ ID: E_FORMAL_PARAM_LACKS_NAME
関数に対して関数プロト型宣言をしていますが、旧式の定義方法を使用しています。定義されているパラメータ名の型と、プロト型宣言で使用されている型とが一致していません。 以下に、この診断の例を示します。
int f(char); int f(c) char c; { }f は、旧式の方法で定義されています。互換性を維持するために、f の引数を、デフォルトの引数の型拡張に従って拡張する必要があります。このため、関数が使用するのは、その値の char の部分だけですが、f に実際に渡されるべき値は、int です。このメッセージは、関数が必要としている int と、関数プロト型で宣言されている char とが不一致であることを示しています。 この不一致は、次の 2 つの方法で解決できます。 o int f(int); に関数プロト型を変更する。 o f を関数プロト型定義で定義する。
int f(char); int f(char c) {}このメッセージを生成するコードの例を次に示します。
int f(char *); int f(p) int *p; {}
メッセージ ID: E_PROTOTYPE_MISMATCH_PROMOTE
関数に対して関数プロト型宣言をしていますが、旧式の定義方法を使用しています。定義されているパラメータ名の型と、プロト型宣言で使用されている型とが一致していません。または、指定されているパラメータの数が正しくありません。 プロト型宣言と関数定義を確認してください。 このメッセージを生成するコードの例
int f(char*, int, char*); /* プロト型宣言 */ int f(a, b, c) /* 関数 f の定義 */ char* a; { int b; }f は、旧式の方法で定義されています。互換性を維持するために、f の引数を、デフォルトの引数の型拡張に従って拡張する必要があります。このため、関数が使用するのは、その値の char の部分だけですが、f に実際に渡されるべき値は、int です。このメッセージは、関数が必要としている int と、関数プロト型で宣言されている char とが不一致であることを示しています。 この衝突を解決するには、次の 2 つの方法があります。 o int f(int); に関数プロト型を変更する。 o 関数プロト型の定義で f を定義する。
メッセージ ID: E_PROTOTYPE_MISMATCH
関数プロト型宣言と関数の旧式の定義において、パラメータの数が一致していません。プロト型宣言でのパラメータ数は n 個、定義でのパラメータ数は m 個です。 このメッセージを生成するコードの例を次に示します。
int f(int); int f(i,j) int i,j; {}
メッセージ ID: E_PARAM_MISMATCH_DECL_DEFINED
識別子が、正しくない型の情報によって宣言されています。 型が定義されていない、または型として使用できない識別子が型として使用されている可能性があります。 このメッセージを生成するコードの例を次に示します。
what id1; int id2; id2 id3;
メッセージ ID: E_UNDEFINED_OR_NOT_A_TYPE
関数定義の宣言部分には、括弧を入れる必要があります。typedef で、識別子と括弧を付けて関数の型として定義した名前を使用して、関数自体を定義することはできません。 このメッセージを生成するコードの例を次に示します。
typedef int F(); F f{ }
メッセージ ID: E_PARENLESS_FUNC_DEF
旧式の方法で型を宣言しているか、不適切な型で代入が行われています。 このメッセージを生成するコードの例を次に示します。
const int i = 10; struct foo {int x; int y;}; foo = &i; /* foo には不適切な型 */ int f(); /* 旧式の宣言 */
メッセージ ID: E_OLD_STYLE_DECL_OR_BAD_TYPE
旧式の関数パラメータ name には、初期設定子を設定することはできません。 このメッセージを生成するコードの例を次に示します。
int f(i) int i = 4; {}
メッセージ ID: E_CANT_INITIALIZE_PARAM
ファイルスコープに空の宣言文と思われる文があります。K&R C では有効ですが、ANSI C では無効です。 このメッセージを生成するコードの例を次に示します。
int i;;
メッセージ ID: E_EMPTY_DECLARATION
このメッセージは、-Xc オプションを指定している場合に表示されます。 ブロックスコープで、記憶クラス static の関数が宣言されています。ANSI C の場合、ブロックスコープで extern 以外の記憶クラスを明示的に使用して関数を宣言すると、動作が未定義になります。K&R C の場合は、この方法で関数を宣言できます。その他のインプリメンテーションでは、この方法を使用することはできません。別の意味が加わることがあります。 このメッセージを生成するコードの例を次に示します。
void f(void){ static void g(void); }
メッセージ ID: E_STATIC_FUNC_AT_BLOCK_LEVEL
"asm" が、関数定義の外で使用されています。 このメッセージを生成するコードの例を次に示します。
asm(" nop "); asm(int f()); int f() { asm(" ..."); }
メッセージ ID: E_ASM_VALID_ONLY_FOR_FUNC_DEF
関数の定義に、typedef で定義された記憶クラスを使用することはできません。そのような typedef で定義された記憶クラスは無視されます。 このメッセージを生成するコードの例を次に示します。
typedef int f(void){}
メッセージ ID: E_TYPEDEF_VALID_ONLY_FUNC_DEF
関数の宣言または定義において、無効な記憶クラス指示子が使用されています。記憶クラスは省略可能です。また、使用できる指示子は extern および static だけです。使用された指示子は無視されます。 このメッセージを生成するコードの例を次に示します。
f(void){ auto g(void); }
メッセージ ID: E_SC_FUNC_MUST_STATIC_OR_EXTERN
関数の中で extern 記憶クラスを使用してオブジェクトを宣言する場合に、初期設定子を使用することはできません。 このメッセージを生成するコードの例を次に示します。
f(void){ extern int i = 1; }
メッセージ ID: E_CANT_INIT_EXTERN_DECL
このメッセージは、修正継続機能を使用して dbx からオプションを呼び出した場合に表示されます。static 変数を、プログラムの開始時に設定されていた値に再初期化することはできません。このメッセージは、入れ子になったブロック内で変数を宣言した時に出力されます。 また、#pragma weak var1 = var2 の var2 に対しても出力されます。さらに、static として再宣言された外部変数に対しても出力されます。 このメッセージを生成するコードの例 (入れ子になったブロック中で変数が宣言されている)
void main(int argc, char *argv[]) { static int g ; { static int k ; /* 再初期化できません */ ......... } }
メッセージ ID: E_CANT_FIXCONTINUE_REINITIALIZE
typedef には、初期設定子を設定することはできません。 このメッセージを生成するコードの例を次に示します。
typedef int INT = 1;
メッセージ ID: E_CANT_INIT_TYPEDEF
関数として宣言した名前には、初期設定子を設定することはできません。 このメッセージを生成するコードの例を次に示します。
int f(void) = 3;
メッセージ ID: E_CANT_INIT_FUNCTION
このメッセージは、-v オプションを設定している場合に表示されます。const オブジェクトは変更できません。初期値を指定しないと、オブジェクトの値はゼロになります。自動変数の場合、値は未定義になります。 このメッセージを生成するコードの例を次に示します。
const int i;
メッセージ ID: E_CONST_OBJ_SHOULD_HAVE_INITIZR
識別子が宣言されましたが、同じ識別子について以前に行われた宣言と矛盾 しているか、同じスコープで 2 回宣言されています。 K&R C の以前のリリースでは、2 つの型が同じに「近い」ときは (たとえば、SPARC における int と long など)、 矛盾する再宣言が許されていました。 しかし、ANSI C ではこのような型は 異なるものと見なされます。
int x; long x; int y; double y;関数の宣言で、引数情報の有無にかかわらず、出力されるメッセージの意味がわかりにくい場合があります。次の例を参照してください。
int f(char); int f();ANSI C の型の互換性に関する規則によって、型を指定していない関数宣言 (関数プロト型宣言以外の関数宣言) は、各パラメータの型がデフォルトの引数拡張規則によって変更されない場合のみ、関数プロト型と互換性が保たれます。この例では、char が拡張規則によって、int に拡張されます。したがって、2 つの宣言の型には、互換性がないことになります。
メッセージ ID: E_IDENTIFIER_REDECLARED
識別子が複数回定義されています。すなわち初期設定子によって、オブジェクトが複数回宣言されています。または、関数が複数回定義されています。 このメッセージを生成するコードの例を次に示します。
int i = 1; int i = 1;
メッセージ ID: E_IDENTIFIER_REDEFINED
関数のパラメータのうちの 1 つと同じ名前で、識別子が宣言されています。このブロック中でその識別子を参照すると、新しい宣言が参照されます。-Xa モードまたは -Xc モードの場合は、エラーになります。その他のモードの場合は、警告になります。 このメッセージを生成するコードの例を次に示します。
int f(int i,int INT){ int i; typedef int INT; }
メッセージ ID: E_DECLARATION_HIDES_PARAMETER
ファイルスコープで name が 2 回宣言されています。最初の宣言では、static の記憶クラスを指定していますが、2 つ目の宣言では記憶クラスが指定されていません。ANSI C の記憶クラスに関する規則では、2 回目以降に name を 再宣言する場合は、static を指定する必要があります。 このメッセージを生成するコードの例を次に示します。
static int i; int i;
メッセージ ID: E_ID_REDECL_ANSI_REQS_STATIC
このメッセージは、-Xc または -v オプションを指定している場合に表示されます。すでにスコープ外となったブロックで、name が extern として宣言され、その後 name が static として宣言されています。ANSI C は、このオブジェクトまたは関数を static として扱い、ソースファイル中のここより前の参照も含むすべての参照は、static として宣言された方を意味します。 このメッセージを生成するコードの例を次に示します。
f(void){ extern int i; } static int i;
メッセージ ID: E_OUT_SCOPE_EXTERN_REDECL_STAT
このメッセージは、-Xc または -v オプションを指定している場合に表示されます。名前 name が、ファイルスコープを持つように extern として宣言され、次に同じオブジェクトまたは関数が static と宣言されています。ANSI C では、最初にオブジェクトまたは関数を宣言する時に、実際の記憶クラスを指定する必要があります。K&R C では、このような宣言は許されており、あたかも最初に static と宣言されているかのように、オブジェクトまたは関数が扱われます。 このメッセージを生成するコードの例を次に示します。
extern int i; static int i;
メッセージ ID: E_EXTERN_PRIOR_REDECL_STATIC
ANSI C では、ファイルスコープで関数またはオブジェクトを最初に宣言する時に、記憶クラスを設定する必要があります。name の再宣言の仕方が、ANSI C の規則に適合していません。 このメッセージを生成するコードの例を次に示します。
g(void){ int f(void); static int f(void); }
メッセージ ID: E_INCONSISTENT_STOR_CLASS_FUNC
name を extern オブジェクトまたは関数の名前として使用したあと、同じブロック中で、static オブジェクトまたは関数の名前として再使用しています。static の name だけが利用可能です。 このメッセージを生成するコードの例を次に示します。
f(void){ extern int i; static int i; }
メッセージ ID: E_STATIC_REDECLARES_EXTERN
自動変数 name は、同じブロック中ですでに extern シンボルとして宣言されています。ANSI C ではこのような宣言はできませんが、旧リリースの K&R C ではこのような宣言を行うことができます。旧リリースとの互換性を保つために、このブロック中の name を参照すると、自動変数が参照されます。 このメッセージを生成するコードの例を次に示します。
f(void){ extern int i; int i; }
メッセージ ID: E_AUTO_REDECLARES_EXTERNAL
typedef によって name が宣言されていますが、name は同じブロック中ですでに extern として宣言されています。typedef で定義した識別子によって、extern と宣言したシンボルが無効になります。 このメッセージを生成するコードの例を次に示します。
f(void){ extern int INT; typedef int INT; }
メッセージ ID: E_TYPEDEF_REDCLS_EXTERN
name が typedef によって複数回宣言されています。あとの宣言と最初の宣言が同じ型になっています。 このメッセージを生成するコードの例
typedef int i; typedef int i;
メッセージ ID: E_TYPEDEF_REDECLARED
記憶クラスが extern である関数またはオブジェクト name が、スコープ外で再宣言されています。2 回目の宣言の型が、最初の宣言の型と一致しません。 このメッセージを生成するコードの例を次に示します。
f(void){ int *p = (int *) malloc(5*sizeof(int)); } g(void){ void *malloc(); }
メッセージ ID: E_INCONSISTENT_REDECL_EXTERN
記憶クラス static によって宣言されたオブジェクトまたは関数が再宣言されています。 2 回目の宣言の型が、最初の宣言の型と矛盾しています。 この問題は、以下の 2 つの状況で頻繁に発生します。 o 関数が、ファイルスコープ以外のスコープを持つ、記憶クラス static として宣言された。その後、最初の宣言の型と矛盾する型で、その関数を宣言した。 o 関数またはオブジェクトが、ファイルスコープを持つ、記憶クラス static として宣言された。その後、同じ関数またはオブジェクトが、ファイルスコープ以外のスコープを持ち、記憶クラス extern または、(関数の場合は) 記憶クラスなしで再宣言された。そして、途中に同じ名前だが無関係の宣言がある。 このメッセージを生成するコードの例を次に示します。
f(void){ static int myfunc(void); } g(void){ static char *myfunc(void); } static int x; f(void){ int x; /* 関連なし */ { extern float x; /* 最初の宣言に関連なし */ } }
メッセージ ID: E_INCONSISTENT_REDECL_STATIC
このメッセージは、-v オプションを指定している場合に表示されます。 内側のスコープ内で、関数 name が再宣言されています。外側の宣言は関数プロト型宣言ですが、内側の宣言に引数の情報がありません。ANSI C のスコープに関する規則によって、引数情報は一時的に無効となり、プロト型によって行われるはずの自動型変換が行われなくなります。 このメッセージを生成するコードの例を次に示します。
extern double sin(double); f(void){ extern double sin(); double d; d = sin(1); /* 注: double 型に変換されない */ }
メッセージ ID: E_OLD_STYLE_DECL_HIDES_PROTO
このメッセージは、-Xt オプションを指定している場合に表示されます。型が、struct、union、または enum の型識別子とタグによって宣言されており、その後元の宣言で使用した型識別子とは別の識別子を使用して宣言されています。 旧リリースの K&R C では、2 つの型を同じものとして扱います。ANSI C (-Xa または -Xc オプション) では、それぞれ別の型として扱われます。 このメッセージを生成するコードの例を次に示します。
struct s { int x, y, z;}; f(void){ unions foo; }
メッセージ ID: E_BASE_TYPE_IS_REALLY
このメッセージは、-Xt オプションを指定している場合に表示されます。 内側のスコープで、struct、union、または enum のタグが宣言されています。旧リリースの K&R C では、このタグは既存のタグ宣言を参照します。ANSI C では、このタグは新しいタグを使用します。-Xt オプションを指定すると、旧リリースの動作が行われます。 このメッセージを生成するコードの例を次に示します。
struct s1 { int x;}; f(void){ struct s1; struct s2 { struct s1 *ps1;}; /* s1 は 1 行目を参照します */ struct s1 { struct s2 *ps2;}; }
メッセージ ID: E_DECL_INTRODUCES_NEW_TYPE_ANSI
ANSI C では、各宣言ごとに次のものを実際に宣言する必要があります。 o 宣言子 o 構造体タグまたは共用体タグ o 列挙定数 宣言によってコンパイラに渡される情報はありません。 このメッセージを生成するコードの例を次に示します。
int; /* 識別子がない */ enum e { e1, e2 }; /* enum e の宣言 */ enum e; /* 新しい情報なし */
メッセージ ID: E_USELESS_DECLARATION
このメッセージは、-v、-Xa または -Xc オプションを指定している場合に表示されます。空の列挙型を指定している宣言があります。列挙型は、宣言する前に定義する必要があります。 このメッセージを生成するコードの例を次に示します。
enum test *ptr;
メッセージ ID: E_FWD_DECLARING_ENUM
typedef 記憶クラスによる宣言で、型の名前が宣言されていません。プログラミングエラーだと思われます。 このメッセージを生成するコードの例を次に示します。
typedef struct s { int x;};
メッセージ ID: E_TYPEDEF_DECLARES_NO_TYPE_NAME
type であったタグ name を再宣言しています。 このメッセージを生成するコードの例を次に示します。
struct q { int m1, m2;}; enum q { e1, e2 };
メッセージ ID: E_TAG_REDECLARED
タグによって、struct、union、または enum が関数プロト型宣言で参照されています。すでに関数中でタグが宣言されているので、プロト型宣言されている関数を定義する時には、スコープ外になります。このため、プロト型宣言と関数定義が一致しません。 このメッセージを生成するコードの例を次に示します。
f(void){ struct s {int x;}; int g(struct s *); }
メッセージ ID: E_DUBIOUS_TAG_IN_FUNC_PROTO
struct、union、または enum 型 が、関数のプロト型宣言のスコープ中で宣言されているか、または、旧式の関数定義のパラメータリスト中で宣言されていて、宣言中にそのデータ型の宣言子リストが含まれています。ANSI C のスコープ規則によると、タグの宣言は関数のプロト型宣言または定義の最後でスコープ外となるので、関数呼び出しの箇所で、常に型の不一致が発生します。関数のプロト型宣言以外の箇所で、その型のオブジェクトを宣言することが できません。関数のプロト型宣言または関数を定義する前に、struct、union、enum 型を宣言し、関数のプロト型宣言中ではそれをタグによって参照してください。 このメッセージを生成するコードの例
struct s {int x;}; int f(struct s st) {}================= /* 正しい例 */
int f(struct s {int x;} st) {}
メッセージ ID: E_DUBIOUS_DECL_USE_TAG_ONLY
struct、union、または enum 型が、関数のプロト型宣言のスコープ中で宣言されています。 つまり、struct、union、または enum 型が、関数のプロト型宣言中で宣言されているか、旧式の関数定義のパラメータリスト中で宣言されていて、宣言中にそのデータ型の宣言子リストが含まれています。ANSI C のスコープ規則によると、タグの宣言は関数のプロト型宣言または定義の最後でスコープ外となるので、関数呼び出しの箇所で、常に型の不一致が発生します。関数のプロト型宣言以外の箇所で、その型のオブジェクトを宣言することが できません。関数のプロト型宣言または関数を定義する前に、struct、union、enum 型を宣言し、関数のプロト型宣言中ではそれをタグによって参照してください。 このメッセージを生成するコードの例
int f(struct {int x; int y;}; ) struct s foo; { } ============ /* 正しい例 */ struct s {int x; int y;}; int f(struct s foo) { }
メッセージ ID: E_DUB_DECL_USE_TAG_ONLY_UNNAMED
新しく struct、union、または enum 型が、関数のプロト型宣言中で宣言されているか、旧式の関数定義のパラメータリスト中でタグによって宣言されています。ANSI C のスコープに関する規則によると、タグの宣言は関数のプロト型宣言または定義の最後でスコープ外となるので、関数呼び出しの箇所で、常に型の不一致が発生します。その型のオブジェクトを、関数以外の箇所で宣言することができません。 このメッセージを生成するコードの例を次に示します。
int f(struct s *);
メッセージ ID: E_DUBIOUS_TAG_DECLARATION
新しく struct、union、または enum 型が、関数のプロト型宣言中で宣言されているか、旧式の関数定義のパラメータリスト中で宣言されています。ANSI C のスコープに関する規則によると、タグの宣言は関数のプロト型宣言または定義の最後でスコープ外となるので、関数呼び出しの箇所で、常に型の不一致が発生します。その型のオブジェクトを、関数以外の箇所で宣言することができません。
メッセージ ID: E_DUBIOUS_TAG_DECL_UNNAMED
共用体の宣言で、メンバーに名前がありません。 このメッセージを生成するコードの例を次に示します。
union s { int i; char c;};
メッセージ ID: E_UNNAMED_UNION_MEMBER
構造体の宣言で、メンバーに名前がありません。 このメッセージを生成するコードの例を次に示します。
struct s { int i; char c;};
メッセージ ID: E_UNNAMED_STRUCT_MEMBER
このメッセージは、-Xc オプションを指定している場合に表示されます。 signed int または unsigned int 以外のビットフィールド型が使用されています (signed int または unsigned int の ビットフィールド型のみが移植性があります)。ANSI C では、int、char、short、および long のビットフィールド型がサポートされています。それぞれの型は、signed、unsigned、signed/unsigned の指定なし、のいずれでもかまいません。また、enum のビットフィールド型もサポートされています。 このメッセージを生成するコードの例を次に示します。
1 struct u { 2 unsigned v:1; 3 int w:1; 4 char x:8; 5 long y:8; 6 short z:8; 7 }; ============= (3) 警告: 移植性のないビットフィールド型 (4) 警告: 移植性のないビットフィールド型 (5) 警告: 移植性のないビットフィールド型 (6) 警告: 移植性のないビットフィールド型
メッセージ ID: E_NONPORTABLE_BIT_FIELD_TYPE
ビットフィールドの宣言で、指定されたビット数が大きすぎるため、宣言した型のオブジェクト中に割り当てられません。 このメッセージを生成するコードの例を次に示します。
struct s { char c:20;};
メッセージ ID: E_BIT_FIELD_TOO_BIG
ビットフィールドを指定した型に対しては、ビットフィールドを使用することはできません。ビットフィールドは、整数型に対してのみ宣言できます。 このメッセージを生成するコードの例を次に示します。
struct s { float f:3;};
メッセージ ID: E_INVALID_TYPE_FOR_BIT_FIELD
関数は、構造体または共用体のメンバーにすることはできません。ただし、関数へのポインタはメンバーにすることができます。メンバー名が関数として宣言されています。 このメッセージを生成するコードの例を次に示します。
struct s { int f(void);};
メッセージ ID: E_MEMBER_CANT_BE_FUNCTION
struct または union の宣言で、複数のメンバーに対して同じ名前が使用されています。 このメッセージを生成するコードの例を次に示します。
union u { int i; float i; };
メッセージ ID: E_DUPLICATE_MEMBER_NAME
サイズがゼロの構造体または共用体が宣言されています。 このメッセージを生成するコードの例を次に示します。
struct s { int ia[0];};
メッセージ ID: E_ZERO_SIZED_STRUCT_UNION
構造体または共用体の宣言で、メンバーの名前が指定されていません。 このメッセージを生成するコードの例を次に示します。
struct s { int :4; char :0;};
メッセージ ID: E_STRUCT_UNION_HAS_NO_NAMD_MBRS
構造体または共用体の宣言において、C 構文で最後のメンバーのあとに必要な ; がありません。 このメッセージを生成するコードの例を次に示します。
struct s { int x };
メッセージ ID: E_SEMI_COLON_REQD_AFT_LAST_MBR
同じスコープ内で、識別子が複数回宣言されています。 このメッセージを生成するコードの例を次に示します。
f(int i) { int j, i; }
メッセージ ID: E_ID_REDECLARED
関数中の列挙型の宣言で、引数名 name と同じ名前の列挙定数があります。この列挙定数によって、引数が無効になります。 このメッセージを生成するコードの例を次に示します。
int f(int i){ enum e { l, k, j, i }; }
メッセージ ID: E_ENUM_CONST_HIDES_PARAMETER
列挙定数の値が整数の最大値を超えています。 このメッセージを生成するコードの例を次に示します。
enum e { e1=2147483647, e2 }; /* e2 がオーバーフロー */
メッセージ ID: E_ENUM_VAL_OVERFLOWS_INT_MAX
列挙型宣言で、列挙子の値 name を設定する時に、式中で name が使用されています。ANSI C のスコープに関する規則によって、式中の name は、その時点でスコープ内にあるシンボルとして解釈されます。 このメッセージを生成するコードの例を次に示します。
int i; f(void){ enum e { i = i+1, j, k }; /* i+1 で大域的な i を使用 */ }
メッセージ ID: E_ENUM_USED_OWN_INITIALIZER
このメッセージは、-Xc または -v オプションを指定している場合に表示されます。列挙型の宣言の終わりに、余分なカンマがあります。 このカンマは、構文エラーとなります。 このメッセージを生成するコードの例を次に示します。
enum e { e1, e2, };
メッセージ ID: E_TRAILING_COMMA_IN_ENUM
集合体を初期化するときに、{ } で初期設定子を囲む必要があります。ただし文字列リテラルで文字配列、または式で自動構造体を初期化する場合を除きます。 このメッセージを生成するコードの例を次に示します。
int ia[5] = 1; f(void){ struct s { int x,y; } st = 1; }
メッセージ ID: E_INIT_REQUIRED
ANSI C では、自動構造体または自動共用体を初期化できます。ただし初期設定子は、初期化するオブジェクトと同じ型にする必要があります。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; struct s { int x; } st = i; }
メッセージ ID: E_STRUCT_UNION_INIT_REQUIRED
値が、与えられた変数の記憶領域に収まりません。値をこの領域から読み出しても、格納しようとした値と異なる場合があります。メッセージには、初期設定子が unsigned の場合は 16 進数、また signed の場合は 10 進数で値が示されます。 0x80 から 0xff までの 16 進値は、char には適合しません。0x8000 から 0xffff の値は short に適合しません。 また、0x80000000 から 0xffffffff までの値は、int には適合しません。 ただしこれらの値は、それぞれ対応する unsigned 型には適合します。 このメッセージを生成するコードの例を次に示します。
struct s {signed int m1:3; unsigned int m2:3;} st = {4, 5}; unsigned char uc = 300u;
メッセージ ID: E_INIT_DOES_NOT_FIT
文字配列を、文字列リテラルと別の値で同時に初期化することはできません。 このメッセージを生成するコードの例を次に示します。
char ca[] = { "abc", 'd' };
メッセージ ID: E_STR_LIT_ARRAY_INIT
文字配列を初期化する文字列リテラルの文字数が、n 文字多すぎて配列に収まりません。 このメッセージを生成するコードの例を次に示します。
char ca[3] = "abcd";
メッセージ ID: E_EXTRA_BYTE_IN_STR_IGNORED
外部 (extern)、静的 ( static)、または配列オブジェクトは、コンパイル時の定数でなければなりません。 自動構造体または共用体オブジェクトの初期設定子も、{} で囲まれている場合は、やはりコンパイル時の定数でなければなりません。メッセージ中の演算子は、コンパイル時に結合されないオペランドの演算子を示します。 このメッセージを生成するコードの例を次に示します。
int j; int k = j+1;
メッセージ ID: E_NON_CONST_INIT
構造体または共用体に対する初期設定子の数が多すぎます。 このメッセージを生成するコードの例を次に示します。
struct s { int x,y; } st = { 1,2,3 };
メッセージ ID: E_TOO_MANY_STRUCT_UNION_INIT
配列の初期設定子の数が多すぎます。 このメッセージを生成するコードの例を次に示します。
int ia[3] = { 1, 2, 3, 4 };
メッセージ ID: E_TOO_MANY_ARRAY_INIT
中括弧 { } で囲んだスカラーの初期設定で、複数の値が指定されています。 このメッセージを生成するコードの例を次に示します。
int i = { 1, 2 };
メッセージ ID: E_TOO_MANY_INIT_SCALAR
オブジェクトの初期化に使用する値は、そのオブジェクトに適するように変換するときに符号が拡張されます。 このメッセージを生成するコードの例を次に示します。
unsigned int x = -3;
メッセージ ID: E_INIT_SIGN_EXTEND
-xcrossfile オプションを使用する時には、-xO3 以上の最適化レベルを指定する必要があります。
メッセージ ID: E_XO3_NOT_SPECIFIED
文字定数を囲む左の ' に対応する右の ' が同じ行中にありません。 このメッセージを生成するコードの例を次に示します。
int i = 'a ;
メッセージ ID: E_NEWLINE_IN_CHAR_CONST
このメッセージは、-Xa または -Xc のオプションを指定している場合にエラーが発生すると、表示されます。ソースプログラム中に、有効な ANSI C トークン以外の文字があります。 このメッセージを生成するコードの例を次に示します。
int i = 1$;
メッセージ ID: E_INVALID_SOURCE_CHARACTER
ソースプログラム中に、有効な ANSI C トークン以外の文字があります。無効な文字自体は表示できません。無効な文字自体は表示できません。メッセージ中の 16 進数は、文字コードの 16 進値を表わしています。
メッセージ ID: E_INVALID_UNPRINTABLE_SRC_CHR
C 言語のトークンの書式に従っていない文字列があります。トークンとは、C 言語における最小の意味単位です。トークンには、予約語、識別子、定数、文字列リテラル、演算子、区切り子があります。 このメッセージを生成するコードの例を次に示します。
5d int 1e = 1; /* トークンの先頭に数字を使用することはできない */
メッセージ ID: E_INVALID_TOKEN_LEX
C 言語のトークンの書式に従っていない文字列があります。トークンとは、C 言語における最小の意味単位です。トークンには、予約語、識別子、定数、文字列リテラル、演算子、区切り子があります。 このメッセージを生成するコードの例を次に示します。
char 2whateveritistoolongmorethan255character... ; /* 長すぎる文字列 */
メッセージ ID: E_INVALID_TOKEN_TOO_LONG_LEX
標準文字の文字列リテラルとワイド文字の文字列リテラルを、混用して結合することはできません。たとえば、ワイド文字の文字列リテラルのあとに標準文字列リテラルを続けると、警告が出力されます。この場合は、両方がワイド文字として扱われます。また、標準文字列リテラルのあとにワイド文字の文字列リテラルを続けると、エラーとなります。 このメッセージを生成するコードの例を次に示します。
#includewchar_t wa[] = L"abc" "def"; char a[] = "abc" L"def";
メッセージ ID: E_CANT_CONCAT_WIDE_REG_STRINGS
-Xa または -Xt オプションを使用している場合、_Restrict は、C 言語の予約語です。 このメッセージを生成するコードの例を次に示します。
void func(int * _Restrict intptr);
メッセージ ID: E_KEYWORD_FOR_XA_AND_XT
L のあとに続く文字定数または文字列リテラルの中に 16 進数 または 8 進数のエスケープシーケンスがあると、unsigned char の範囲を超える値が生成されます。文字エスケープが大きすぎて、wchar_t 型のオブジェクトに収まらないため、切り捨てられます。
メッセージ ID: E_CHR_ESC_DOES_NOT_FIT_WCHAR
式の値が大きすぎて、double に変換できません。このような式が実行されるコード中にある場合は、警告です。その他の場合は、エラーです。 このメッセージを生成するコードの例を次に示します。
double f() { return 0xFFFFFFFFFFFFFFFF; }
メッセージ ID: E_CONV_TO_DOUBLE_OUT_OF_RANGE
式の値が大きすぎて、float にできません。このような式が実行されるコード中にある場合は、警告です。その他の場合は、エラーです。 このメッセージを生成するコードの例を次に示します。
float f = 1e300 * 1e300;
メッセージ ID: E_CONV_TO_FLOAT_OUT_OF_RANGE
double 定数の値が大きすぎて、整数型にできません。このような式が実行されるコード中にある場合は、警告になります。その他の場合は、エラーになります。 このメッセージを生成するコードの例を次に示します。
int i = 1e100;
メッセージ ID: E_CONV_DOUBLE_INTEGRAL_OUT_RNGE
シフト演算子のシフト回数 (右のオペランド) が負の値になっているか、シフトするオペランドのサイズを超えています。 このメッセージを生成するコードの例を次に示します。
f(){ short s; s <<= 25; }
メッセージ ID: E_SHIFT_CNT_NEG_TOO_BIG_L
シフト演算子のシフト回数 (右オペランド) が負の値になっているか、シフトするオペランドのサイズを超えています。 このメッセージを生成するコードの例を次に示します。
f(){ short s; s <<= 25; }
メッセージ ID: E_SHIFT_CNT_NEG_TOO_BIG
コンパイル時に、演算子の式を計算しようとし、結果がオーバフローすると判断されました。結果の下位 32 ビットが保持されます。 このメッセージを生成するコードの例を次に示します。
int i = 1000000 * 1000000;
メッセージ ID: E_INTEGER_OVERFLOW_DETECTED
コンパイル時に 2 つの浮動小数点オペランド間で演算を行おうとしましたが、オーバフローがあります。実行されるコード中に式がある場合は、警告になります。その他の場合は、エラーになります このメッセージを生成するコードの例を次に示します。
double d1 = 1e300 * 1e300;
メッセージ ID: E_FP_CONST_CALC_OUT_OF_RANGE
for または while ループの始まりの制御式に、その前にある制御文のために到達できません。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; goto lab; for (i = 1; i > 0; --i) { lab:; i=5; } }
メッセージ ID: E_LOOP_NOT_ENTERED_AT_TOP
goto、break、continue または return の文が前にあるために、到達することができない文があります。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; return i; i = 4; }
メッセージ ID: E_STATEMENT_NOT_REACHED
このメッセージは、-v オプションを指定している場合に表示されます。関数には、return 文を入れる必要があります。 このメッセージを生成するコードの例を次に示します。
#includemain(void) { (void) printf("Do the hippy-hippy shake.\n"); }
メッセージ ID: E_FUNC_HAS_NO_RETURN_STMT
現在の関数の複数の位置で、同じラベル名が使用されています。1 つのラベルのスコープは関数全体です。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; i = 1; if (i) { L: while (i) g(); goto L; } L: ; }
メッセージ ID: E_LABEL_REDEFINED
ループの終わりにある先頭に戻るためのコードに、到達および実行できないループがあります。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = 1; while (i) { return 4; } }
メッセージ ID: E_END_OF_LOOP_CODE_NOT_REACHED
関数中で、break 文の位置が正しくありません。たとえば、break 文が、ループ文または switch 文の外にあります。 このメッセージを生成するコードの例を次に示します。
f(void){ break; }
メッセージ ID: E_BREAK_OUTSIDE_LOOP_OR_SWITCH
continue 文が、ループのスコープ内に置かれていません。 このメッセージを生成するコードの例を次に示します。
f(void){ continue; }
メッセージ ID: E_CONTINUE_OUTSIDE_LOOP_SWITCH
このメッセージは、-v オプションを指定している場合に表示されます。現在の関数が、返す型とともに宣言されていますが、return 文に戻り値の式が指定されていません。 このメッセージを生成するコードの例を次に示します。
f(void){ return; }
メッセージ ID: E_FUNC_EXPECTS_TO_RETURN_VALUE
switch 文中の制御式が整数型でない文があります。制御式が浮動小数点型である場合は、警告になります。その他の場合は、エラーになります。浮動小数点の switch 式は、int に 変換されます。 このメッセージを生成するコードの例を次に示します。
f(void){ float x; switch (x) { case 4: ; } }
メッセージ ID: E_SWITCH_EXP_MUST_BE_INTEGRAL
case 文が、switch 文のスコープ外にあります。 このメッセージを生成するコードの例を次に示します。
f(void){ case 4: ; }
メッセージ ID: E_CASE_OUTSIDE_SWITCH
case 文のオペランドは、整数定数にする必要があります。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = 1; switch (i) { case 5.0: ; } }
メッセージ ID: E_NON_INTEGRAL_CASE_EXPRESSION
default ラベルが、switch 文のスコープ外にあります。 このメッセージを生成するコードの例を次に示します。
f(void){ default: ; }
メッセージ ID: E_DEFAULT_OUTSIDE_SWITCH
switch 文で、2 つの default ラベルが使用されています。 このメッセージを生成するコードの例を次に示します。
f(void){ int i = 5; switch(i) { default: default: break; } }
メッセージ ID: E_DUPLICATE_DEFAULT_IN_SWITCH
case 文で指定された式の値が、switch 文の制御式の型の範囲を超えているため、 case ラベルに到達できません。メッセージ中の value は、case 式が unsigned 型である場合は 16 進数、signed である場合は 10 進数で示されます。 このメッセージを生成するコードの例を次に示します。
f(void){ unsigned char uc; switch( uc ){ case 256: ; } }
メッセージ ID: E_UNREACHABLE_CASE_LABEL
このメッセージは、-v オプションを指定している場合に表示されます。case ラベルの値 value を、switch 文の制御式の型で表わすことができません。 このメッセージは、case 式の型と制御式の型が同じサイズで、case 式の実際のビット表現が変わらない場合に出力されます。たとえば、制御式が int 型、case 式が unsigned int 型の場合に出力されます。メッセージ中の値は、case 式が unsigned 型である場合は 16 進数、signed 型である場合は 10 進数の値で表されます。 以下の例の 0xffffffffu は、int として表すことはできません。case 式を制御式の型に変換するとき、有効な値は -1 になります。すなわち、i の値が 0xffffffff ではなく、-1 の場合、case に到達します。 このメッセージを生成するコードの例を次に示します。
f(void){ int i; switch( i ){ case 0xffffffffu: ; } }
メッセージ ID: E_CASE_LBL_AFFECTED_CONVERSION
void 型のオブジェクトを宣言することはできません。 このメッセージを生成するコードの例を次に示します。
void v;
メッセージ ID: E_CANT_HAVE_VOID_OBJECT
struct、union、または enum 型でオブジェクト名と タグを宣言していますが、型が不完全です。 このメッセージを生成するコードの例を次に示します。
struct s st;
メッセージ ID: E_INCOMPLETE_STRUCT_UNION_ENUM
メモリーが不足しています。ほとんどの場合は、スワップ領域が不足していることが原因となっています。
メッセージ ID: E_ST_SAVE_OUT_OF_MEMORY
メモリーが不足しています。ほとんどの場合は、スワップ領域が不足していることが原因となっています。
メッセージ ID: E_ST_LOOKUP_OUT_OF_MEMORY
static として宣言された関数 name が呼び出されていますが、翻訳単位に name という定義がありません。この状況は、翻訳単位全体を確認したあとに判断されるので、メッセージに表示される行番号は、ファイルの全行数に 1 を加えた値になります。 このメッセージを生成するコードの例を次に示します。
static int statfunc(int); void f(){ int i = statfunc(4); }
メッセージ ID: E_STATIC_FUNC_CALLD_NOT_DEFINED
現在の関数に goto が使用されていますが、関数中でターゲットのラベルが定義されていません。 このメッセージを生成するコードの例を次に示します。
f(void){ goto L; }
メッセージ ID: E_UNDEFINED_LABEL
このメッセージは、-v オプションを指定している場合に表示されます。 #pragma 指令はインプリメンテーションによって異なるため、無視される指令について警告が出力されます。メッセージ中に表示される #pragma は認識されません。 このメッセージを生成するコードの例を次に示します。
#pragma list
メッセージ ID: E_UNRECOGNIZED_PRAGMA_IGNORED
このメッセージは、-v オプションを指定している場合に表示されます。 ほかのトークンがない #pragma 指令があります。 このメッセージを生成するコードの例を次に示します。
#pragma
メッセージ ID: E_NO_TOKENS_FOLLOW_PRAGMA
メモリーが不足しています。ほとんどの場合、スワップ領域が不足していることが原因です。
メッセージ ID: E_DO_PRAGMA_OUT_OF_MEMORY
無効な形式の #pragma pack があります。無効な指令は無視されます。 このメッセージを生成するコードの例を次に示します。
#pragma pack
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA_PACK
#pragma pack は、構造体のオフセットを制御します。書式は、次のようにする必要があります。
#pragma pack(n)n には、各プラットフォームでの厳密な境界整列 (Intel = 4, sparc V8 = 8, sparc v9 = 16) より小さな 2 の乗数を指定します。n を省略した場合には、構造体メンバーの配置は自然な境界整列に戻ります。 pragma はすべての構造体メンバーの要求を満たす厳密な境界整列を指定します。pragma で設定した境界整列は、次の pack 指定があるまですべての構造体の メンバーに適用されます。同じ構造体に対して、異なる翻訳単位で異なる pack 指定を行なった場合、プログラムは予期せぬエラーが発生します。特に、すでにコンパイルされているライブラリのインターフェースを定義しているヘッダーファイルをインクルードするより前に pragma pack を指定しないでください。pragma pack 指定をする場合は、対象となる構造体の直前で行い、その構造体 の直後で #pragma pack() 指定を行い自然な境界整列に戻すことを推奨します。 このメッセージを生成するコードの例を次に示します。
#pragma pack(-2) #pragma pack(7) #pragma pack(256)
メッセージ ID: E_BAD_PRAGMA_PACK_VALUE
無効な形式の #pragma weak があります。無効な指令は無視されます。 このメッセージを生成するコードの例を次に示します。
#pragma weak write,_write
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA_WEAK
#pragma unknown_control_flow 中に、宣言されていない関数名があります。unknown_control_flow プラグマの書式は、次のとおりです。
#pragma unknown_control_flow ( 名前 [ , 名前 ... ] )プラグマで使用する関数は、#pragma 以前に宣言する必要があります。 このメッセージを生成するコードの例を次に示します。
#pragma unknown_control_flow(foo, bar) int foo(); int bar(); ============ 正しい例 int foo(); int bar(); #pragma unknown_control_flow(foo, bar)
メッセージ ID: E_UNKNOWN_CTRL_FLOW_UNDECLARED
#pragma no_side_effect 中に、宣言されていない関数名があります。no_side_effect プラグマの書式は、次のとおりです。
#pragma no_side_effect (名前 [, 名前 ...])プラグマで使用する関数は、#pragma 以前に宣言する必要があります。 このメッセージを生成するコードの例を次に示します。
/* 関数 abc は、どこにも定義または宣言されていません */ #pragma no_side_effect (abc)============ 正しい例
int abc(); #pragma no_side_effect (abc)
メッセージ ID: E_NO_SIDE_EFFECT_UNDECLARED
#pragma unknown_control_flow の書式が正しくありません。正しい pragma の設定方法は次の通りです。
#pragma unknown_control_flow ( 識別子 [,識別子 ...] )このメッセージを生成するコードの例を次に示します。
#pragma unknown_control_flow {a, b c}
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA_UCF
#pragma no_side_effect の書式が正しくありません。正しい pragma の設定方法は次の通りです。
#pragma no_side_effect (識別子 [, 識別子 ...])このメッセージを生成するコードの例を次に示します。
#pragma no_side_effect {a b}
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA_NSE
#pragma init または #pragma fini の書式が正しくありません。fini および init プラグマの書式は、次のとおりです。
#pragma fini (f1 [,f2, ...,fn]) #pragma init (f1 [,f2, ...,fn])このメッセージを生成するコードの例を次に示します。
#define ONE 1 f(); g(); #pragma fini {f, g}
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA
#pragma int_to_unsigned 指令で指定した関数の戻り値の型は、同じ型の unsigned の識別子にする必要があります。 このメッセージを生成するコードの例を次に示します。
extern int f(int); #pragma int_to_unsigned fl
メッセージ ID: E_MUST_B_TYPE_FUNC_RTN_UNSIGNED
無効な形式の #pragma int_to_unsigned があります。無効な指令は無視されます。 このメッセージを生成するコードの例を次に示します。
#pragma int_to_unsigned strlen();
メッセージ ID: E_IGNORE_MALFORMED_INTTOUNSIGND
#pragma align の構文が正しくありません。正しい構文は、次のとおりです。
#pragma align integer (ident [,ident ...])integer には、1 から 128 までの 2 のべき乗の値 (1, 2, 4, 8, 16, 32, 64, 128) を指定してください。ident には、大域変数または静的変数を指定してください (自動変数は不可)。 このメッセージを生成するコードの例を次に示します。
#pragma align 128 {astruct, aunion}
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA_ALIGN
メモリーが不足しています。ほとんどの場合は、スワップ領域が不足していることが原因となっています。
メッセージ ID: E_REALLOC_OUT_OF_MEMORY
#line 指令の後には、文字列リテラルを続ける必要があります。
メッセージ ID: E_STRING_EXPECTED_POUND_LINE
ビットフィールドに代入する定数が大きすぎるため、値が切り捨てられます。 次の例で、ビットフィールド z には、マシンによって 0xA祁、または -4xA軍 の 範囲の値が代入されます。 このメッセージを生成するコードの例を次に示します。
void v(void) { struct { signed x:3; /* 最大値は 3 */ unsigned y:3; /* 最大値は is 7 */ int z:3; /* 最大値は 7 */ } st; st.x = 3; st.x = 4; st.y = 7; st.y = 8; st.z = 7; st.z = 8; }
メッセージ ID: E_PRECISION_LOST_IN_BIT_FIELD
enum の宣言が正しくありません (出力形式:: Simple)。 このメッセージを生成するコードの例
1 enum e {int, two} en; ============ (1) 警告: 列挙型が定義されていません: e
メッセージ ID: E_ENUM_NEVER_DEF
副作用の可能性がある位置で、等価演算子が使用されています (出力形式: simple)。このメッセージを生成するコードの例
1 void 2 main(void) 3 { 4 int i = 0, j = 1; 5 for (i == j; i < 10; i++) 6 i == j; 7 } ============ (5) 警告: 代入演算子 = の使用が想定される場所に等価演算子 == が使用されています。 (6) 警告: 代入演算子 = の使用が想定される場所に等価演算子 == が使用されています。
メッセージ ID: E_ASSIGNMENT_NOT_EQUALITY
条件式が必要と思われる位置で、代入演算子が使用されています。このメッセージは、関数呼び出しの値を使用して変数への代入を行う場合、または文字列のコピーの場合には、出力されません。また、-h を指定して lint を起動した場合には表示されません (出力形式: simple)。このメッセージを生成するコードの例
1 int 2 main(void) 3 { 4 int y = 0; 5 int z = 0; 6 int j = 0; 7 int x, i; 8 i = (x = y) & (z == j); 9 if (y = x) 10 i = 1; 11 while (z = y) 12 i++; 13 while ((x = z) == y) 14 i--; 15 return (i + x); 16 } ============ (8) 警告: 等価演算子 == の使用が想定される場所に代入演算子 = が使用されています。 (9) 警告: 等価演算子 == の使用が想定される場所に代入演算子 = が使用されています。 (11) 警告: 等価演算子 == の使用が想定される場所に代入演算子 = が使用されています。
メッセージ ID: E_EQUALITY_NOT_ASSIGNMENT
プログラム中で定義された main() 関数のパラメータが 1 つだけ、または 3 つ以上指定されています。これは ANSI C の規則に反しています (出力形式: simple)。このメッセージを生成するコードの例
1 void 2 main(int argc, char **argv, char **envp) 3 {} ============ (2) 警告: 許可される引数の数は 0 個または 2 個です: main()
メッセージ ID: E_MAIN_PARAM
int 値を返さない main() 関数を使用しています。これは、ANSI C の規則に反しています (出力形式: simple)。このメッセージを生成するコードの例
1 char * 2 main(void) 3 { 4 return "a"; 5 } ============ (2) 警告: 関数は int 型である必要があります: main()
メッセージ ID: E_MAIN_RET_VAL
複数の文字から成る文字定数には移植性がありません (出力形式: simple)。このメッセージを生成するコードの例
1 int c = 'abc'; ============ (1) 警告: 移植性のない文字定数
メッセージ ID: E_NONPORTABLE_CHAR_CONST
関数により、自動変数へのポインタが返されます。自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 int * 2 f(int x) 3 { 4 int ia[10]; 5 int i; 6 if (x == 1) 7 return ia; 8 else 9 return &i; 10 } ============ (7) 警告: 関数が自動変数へのポインタを返しています (9) 警告: 関数が自動変数へのポインタを返しています
メッセージ ID: E_FUNC_RET_PTR_TO_AUTO
関数により、パラメータへのポインタが返されます。自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 int *f(int i) 2 { 3 return &i; 4 } ============ (3) 警告: 関数が引数へのポインタを返しています
メッセージ ID: E_FUNC_RET_PTR_TO_PARAM
break や return がないので、次の case 文が続けて実行されます。該当する case 文の前に /* FALLTHRU */ を付けるか、またはその case 文に直前の case 文からは到達しない場合には (下の例を参照) /* NOTREACHED */ を付けると、その case 文に対するメッセージは表示されなくなります。このメッセージは、-h を指定して lint を起動した場合には表示されません (出力形式: simple)。このメッセージを生成するコードの例
1 int 2 f(int i) 3 { 4 void error(); 5 switch (i) { 6 case 10: 7 i = 0; 8 case 12: 9 return (i); 10 case 14: 11 break; 12 case 15: 13 case 16: 14 break; 15 case 18: 16 i = 0; 17 /* FALLTHRU */ 18 case 20: 19 error("bad number"); 20 /* NOTREACHED */ 21 case 22: 22 return (i); 23 } 24 return (i); 25 } ============ (8) 警告: case 文を通り抜けます
メッセージ ID: E_CASE_FALLTHRU
lint 指令 /* EMPTY */ は、#if または #else のスコープ内にある必要があります。 このメッセージを生成するコードの例
int f(void) { /* EMPTY */ };
メッセージ ID: E_IF_ELSE_DIRECTIVE
if 文に、空文の if 部分があります。 if とセミコロンの間に /* EMPTY */ を入れると、その文に対してメッセージが表示されなくなります。-h を指定して lint を起動した場合には、このメッセージは表示されません (出力形式: Simple)。 このメッセージを生成するコードの例
1 void 2 v(int i) 3 { 4 if (i); 5 if (i == 10) 6 /* EMPTY */ ; 7 else 8 return; 9 } ============ (4) 警告: 文が帰結していません: if
メッセージ ID: E_NOP_IF_STMT
if 文に、空文の else があります。 else とセミコロンの間に /* EMPTY */ を入れると、その文に対してメッセージが表示されなくなります。-h を指定して lint を起動した場合には、このメッセージは表示されません (出力形式: simple)。 このメッセージを生成するコードの例
1 void 2 v(int i) 3 { 4 if (i) 5 return; 6 else; 7 } ============ (6) 警告: 文が帰結していません: else
メッセージ ID: E_NOP_ELSE_STMT
ファイル中で、変数または関数が static として宣言または定義されていますが、ファイル中で使用されていません。これらのオブジェクトは、宣言または定義したファイル以外では使用できないので、プログラム上の何らかのエラーと考えられます。 このメッセージを生成するコードの例を次に示します。
1 static int i; 2 static int f(void); 3 static int j = 1; ============ 静的シンボルが使用されていません (1) i (2) f (3) j
メッセージ ID: E_STATIC_UNUSED1
ファイル中で、変数または関数が static として宣言または定義されていますが、ファイル中で使用されていません。これらのオブジェクトは、宣言または定義したファイル以外では使用できないので、プログラム上の何らかのエラーと考えられます。 このメッセージを生成するコードの例を次に示します。
1 static int i; 2 static int f(void); 3 static int j = 1;
メッセージ ID: E_STATIC_UNUSED
関数の引数が使用されていません。関数定義の前に /* ARGSUSEDn */ を置くと、最初の n 個までの引数を除き、すべての引数に対するメッセージが表示されなくなります。-v を指定して lint を起動した場合には、このメッセージは表示されません。 このメッセージを生成するコードの例を次に示します。
1 static int f(int, int); 2 int 3 main(int argc, char *argv[]) 4 { 5 return (f(argc, 0)); 6 } 7 /* ARGSUSED1 */ 8 9 int 10 f(int x, int y) 11 { 12 return x; 13 } 14 ============ 引数が関数中で使用されていません (3) argv (関数: main)
メッセージ ID: E_FUNC_ARG_UNUSED1
関数の引数が使用されていません。関数定義の前に /* ARGSUSEDn */ を置くと、最初の n 個までの引数を除き、すべての引数に対するメッセージが表示されなくなります。-v を指定して lint を起動した場合には、このメッセージは表示されません。 このメッセージを生成するコードの例を次に示します。
1 static int f(int, int); 2 int 3 main(int argc, char *argv[]) 4 { 5 return (f(argc, 0)); 6 } 7 /* ARGSUSED1 */ 8 9 int 10 f(int x, int y) 11 { 12 return x; 13 } 14
メッセージ ID: E_FUNC_ARG_UNUSED
変数が宣言されていますが、関数中で使用されていません。 このメッセージを生成するコードの例を次に示します。
1 void main(void) 2 { 3 int i, j; 4 static k; 5 } 6 7 ============ 変数が関数中で使用されていません (3) i (関数: main) (3) j (関数: main) (4) k (関数: main)
メッセージ ID: E_FUNC_VAR_UNUSED1
変数が宣言されていますが、関数中で使用されていません。 このメッセージを生成するコードの例を次に示します。
1 void main(void) 2 { 3 int i, j; 4 static k; 5 } 6 7
メッセージ ID: E_FUNC_VAR_UNUSED
自動変数または関数パラメータが、宣言または設定されていますが、関数中で使用されていません。 このメッセージを生成するコードの例を次に示します。
1 void f(int i) 2 { 3 int j = 1; 4 i = 1; 5 } ============ 変数が関数中で設定されていますが使用されていません (1) i (関数: f) (3) j (関数: f)
メッセージ ID: E_FUNC_SET_NOT_USED1
自動変数または関数パラメータが、宣言または設定されていますが、関数中で使用されていません。 このメッセージを生成するコードの例を次に示します。
1 void f(int i) 2 { 3 int j = 1; 4 i = 1; 5 }
メッセージ ID: E_FUNC_SET_NOT_USED
あるオブジェクト型へのポインタが、別のオブジェクト型へのポインタに キャストされています。 このメッセージは、-p を指定して lint を起動した場合のみ出力され、特定の型を持たないポインタ void * については出力されません。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 int *ip; 5 char *cp = 0; 6 ip = (int *) cp; 7 } ============ ポインタのキャストが問題を引き起こす可能性があります (6)
メッセージ ID: E_BAD_PTR_CAST
到達できない文です。関数中に、到達できない文があります。この文の前に、/* NOTREACHED */ を置くと、該当する文に対するメッセージが表示されなくなります。 -b を指定して lint を起動した場合は、到達していないすべての break および空の文に対するメッセージは表示されません。このメッセージは、コンパイラによって出力されることもありますが、その場合はメッセージを非表示にすることはできません。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(int i) 3 { 4 switch (i) { 5 case 1: 6 return; 7 break; 8 case 2: 9 return; 10 /* NOTREACHED */ 11 break; 12 } 13 } ============ 到達できない文です (7)
メッセージ ID: E_STMT_NOT_REACHED
宣言されていない関数が呼び出されています。 この場合、lint は、関数が int を返すとみなします。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 f(); 5 } ============ int を返すように暗黙的に宣言されます (4) f
メッセージ ID: E_RET_INT_IMPLICITLY1
宣言されていない関数が呼び出されています。 この場合、lint は、関数が int を返すとみなします。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 f(); 5 }
メッセージ ID: E_RET_INT_IMPLICITLY
あるオブジェクト型へのポインタを、より強い境界整列条件のある 別のオブジェクト型へのポインタにキャストしています。キャスト結果が、2 つ目のポインタ型では無効になる可能性があります。また、-h を指定して lint を起動した場合には表示されません 。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 short *sp = 0; 5 int *ip; 6 ip = (int *) sp; 7 } 8 ============ ポインタのキャストによって境界整列が不正確になる可能性があります (6)
メッセージ ID: E_BAD_PTR_CAST_ALIGN
ビット単位の演算子のオペランドが、ANSI C で定義されている符号付き整数型の変数になっています。これらの演算子は、整数の内部表現に依存する値を返すので、演算子の動作は、その型のオペランドに対する、インプリメンテーションに依存して定義されます。
メッセージ ID: E_POSSIBLY_NONPORT_SBITWISE_OP
ビット単位の演算子のオペランドが、ANSI C で定義されている符号付き整数型の変数になっています。これらの演算子は、整数の内部表現に依存する値を返すので、演算子の動作は、その型のオペランドに対する、インプリメンテーションに依存して定義されます。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 int i; 5 signed int j; 6 i = i & 055; 7 j = j | 022; 8 } ============ signed 型値に対するビット単位の演算は移植性がなくなる可能性があります (6) (7)
メッセージ ID: E_NONPORT_SBITWISE_OP
通常の char 型の変数が、よりサイズが大きい整数型の変数に代入されています。 通常の char が signed または unsigned のどちらで扱われるかは、インプリメンテーションによって異なります。 このメッセージは、-p を指定して lint を起動した場合のみ出力され、-a を指定した場合は出力されません。 このメッセージを生成するコードの例を次に示します。
1 int 2 main(void) 3 { 4 char c = 0; 5 long l; 6 l = c; 7 return (l); 8 } ============ より大きな整数型への変換は符号拡張が不正確になる可能性があります (6)
メッセージ ID: E_BAD_SIGN_EXTEND
オブジェクトが、よりサイズが小さいデータ型のオブジェクトに代入されています。このメッセージは、-a を指定して lint を起動した場合には表示されません。また、明示的なキャストによってサイズがより小さい型に変換した場合も、このメッセージは表示されません。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 float f; 5 long long l = 2.5; 6 f = l; 7 } ============ 代入によって暗黙的により小さい型に変換されます (6)
メッセージ ID: E_ASSIGN_NARROW_CONV
void でない関数が、呼び出し側の関数に値を返しません。右の中括弧 } まで到達しない場合は、前に /* NOTREACHED */ を置くと、このメッセージが表示されなくなります。 このメッセージを生成するコードの例を次に示します。
1 int f(void) {} 2 void v(void) {} 3 h(void) 4 { 5 exit(1); 6 /* NOTREACHED */ 7 } ============ 関数が値を返さずに終了しています (1) f
メッセージ ID: E_FUNC_NO_RET_VAL1
void でない関数が、呼び出し側の関数に値を返しません。右の中括弧 } まで到達しない場合は、前に /* NOTREACHED */ を置くと、このメッセージが表示されなくなります。 このメッセージを生成するコードの例を次に示します。
1 int f(void) {} 2 void v(void) {} 3 h(void) 4 { 5 exit(1); 6 /* NOTREACHED */ 7 }
メッセージ ID: E_FUNC_NO_RET_VAL
外部変数または関数が宣言されていますが、内部ブロック中で使用されていません。 このメッセージを生成するコードの例を次に示します。
1 int 2 main(void) 3 { 4 int f(); 5 int g(); 6 return f(); 7 } ============ 宣言がブロック中で使用されていません (5) g
メッセージ ID: E_BLOCK_DECL_UNUSED1
外部変数または関数が宣言されていますが、内部ブロック中で使用されていません。 このメッセージを生成するコードの例を次に示します。
1 int 2 main(void) 3 { 4 int f(); 5 int g(); 6 return f(); 7 }
メッセージ ID: E_BLOCK_DECL_UNUSED
静的でない外部変数または関数が宣言されていますが、いずれのファイルにも定義がありません。このメッセージは、-u を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 extern int f(void); 2 int 3 main(void) 4 { 5 return f(); 6 } ============ 未定義の名前が使用されています f f.c(5)
メッセージ ID: E_NAME_USED_NOT_DEF1
静的でない外部変数または関数が宣言されていますが、いずれのファイルにも定義がありません。このメッセージは、-u を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 extern int f(void); 2 int 3 main(void) 4 { 5 return f(); 6 }
メッセージ ID: E_NAME_USED_NOT_DEF2
変数または関数が定義されていますが、いずれのファイルでも使用されていません。このメッセージは、-u を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 int i; ============ 名前が定義されていますが使用されていません i f.c(1)
メッセージ ID: E_NAME_DEF_NOT_USED1
変数または関数が定義されていますが、いずれのファイルでも使用されていません。このメッセージは、-u を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 int i;
メッセージ ID: E_NAME_DEF_NOT_USED2
静的でない外部変数または関数が宣言されていますが、いずれのファイルにも定義がありません。このメッセージは、-x を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 extern int f(void); 2 static int g(void); ============ 名前が宣言されていますが使用も定義もされていません f f.c(1)
メッセージ ID: E_NAME_DECL_NOT_USED_DEF1
静的でない外部変数または関数が宣言されていますが、いずれのファイルにも定義がありません。このメッセージは、-x を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 extern int f(void); 2 static int g(void);
メッセージ ID: E_NAME_DECL_NOT_USED_DEF2
変数が、複数のソースファイルで定義されています。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 char i = 'a'; file f_1.c: 1 long i = 1; ============ 名前が重複して定義されています i f.c(1) :: f_1.c(1)
メッセージ ID: E_NAME_MULTIPLY_DEF1
変数が、複数のソースファイルで定義されています。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 char i = 'a'; file f_1.c: 1 long i = 1;
メッセージ ID: E_NAME_MULTIPLY_DEF2
関数呼び出しの戻り値の型が、関数定義での型と一致していません。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 int * 2 f(int *ip) 3 { 4 return ip; 5 } file f_1.c: 1 void 2 g(void) 3 { 4 int i, *ip = &i; 5 i = f(ip); 6 } ============ 使用している値の型が整合していません f f.c(2) int *() :: f_1.c(5) int ()
メッセージ ID: E_INCONS_VAL_TYPE_USED1
関数呼び出しの戻り値の型が、関数定義での型と一致していません。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 int * 2 f(int *ip) 3 { 4 return ip; 5 } file f_1.c: 1 void 2 g(void) 3 { 4 int i, *ip = &i; 5 i = f(ip); 6 }
メッセージ ID: E_INCONS_VAL_TYPE_USED2
宣言または定義されている関数の戻り値の型が、この関数の別の宣言または定義での戻り値の型と一致していません。このメッセージは、変数の型の宣言が一致していない場合にも出力されます。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 void v(void) {} 2 void g(void); 3 extern int i; file f_1.c: 1 extern int f(void); 2 extern int g(void); 3 extern char i; ============ 宣言している値の型が整合していません g f.c(2) void () :: f_1.c(2) int () i f.c(3) int :: f_1.c(3) char
メッセージ ID: E_INCONS_VAL_TYPE_DECL1
宣言または定義されている関数の戻り値の型が、この関数の別の宣言または定義での戻り値の型と一致していません。このメッセージは、変数の型の宣言が一致していない場合にも出力されます。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 void v(void) {} 2 void g(void); 3 extern int i; file f_1.c: 1 extern int f(void); 2 extern int g(void); 3 extern char i;
メッセージ ID: E_INCONS_VAL_TYPE_DECL2
関数呼び出しの引数の型が、関数定義中の仮引数の型と一致していません。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 int 2 f(int *x, int *y) 3 { 4 return *x + *y; 5 } file f1.c: 1 int 2 main(void) 3 { 4 int i = 0; 5 extern int f(int, int); 6 return f(1, i); 7 } ============ 宣言している関数の引数が整合していません f (arg 2) f.c(3) int * :: f1.c(6) int
メッセージ ID: E_INCONS_ARG_USED1
関数呼び出しの実引数と仮引数の型が一致していません (出力形式: simple)。このメッセージを生成するコードの例
1 static void 2 g(x, y) 3 int x; 4 int *y; 5 { 6 return; 7 } 8 void 9 main(void) 10 { 11 float f = 4.5; 12 g(f, (int *) &f); 13 } ============ "f.c": 12 行目: 警告:引数の型が記憶されている型と整合していません: 1 番目の引数 使用している引数が整合していません: g(1 番目の引数) f.c(5) では int、f.c(12) で は double
メッセージ ID: E_INCONS_ARG_USED2
関数呼び出しの際の引数の数が不適切です。関数定義の前に、/* VARARGSn */ を置くと、n 個以上の引数が指定された関数呼び出しに対してはこのメッセージが表示されなくなります。また ANSI C の表記法である "..." を使用して関数を定義または 宣言すると、すべての引数に対してこのメッセージが表示されなくなります。 このメッセージを生成するコードの例を次に示します。
1 int f(int x, int y, int z) 2 { 3 return x + y + z; 4 } 5 int g(int x, ...) 6 { 7 return x; 8 } 9 /* VARARGS1 */ 10 int h(int x, int y, int z) 11 { 12 return x + y + z; 13 } 14 void main(void) 15 { 16 extern int f(), h(), g(int i, ...); 17 f(); 18 g(1, 2, 3, 4); 19 h(1, 2, 3, 4, 5); 20 } ============ 可変数の引数で関数が呼び出されています f f.c(1) :: f.c(17)
メッセージ ID: E_FUNC_USED_VAR_ARG1
関数呼び出しの際の引数の数が不適切です。関数定義の前に、/* VARARGSn */ を置くと、n 個以上の引数が指定された関数呼び出しに対してはこのメッセージが表示されなくなります。また ANSI C の表記法である "..." を使用して関数を定義または 宣言すると、すべての引数に対してこのメッセージが表示されなくなります。 このメッセージを生成するコードの例を次に示します。
1 int f(int x, int y, int z) 2 { 3 return x + y + z; 4 } 5 int g(int x, ...) 6 { 7 return x; 8 } 9 /* VARARGS1 */ 10 int h(int x, int y, int z) 11 { 12 return x + y + z; 13 } 14 void main(void) 15 { 16 extern int f(), h(), g(int i, ...); 17 f(); 18 g(1, 2, 3, 4); 19 h(1, 2, 3, 4, 5); 20 }
メッセージ ID: E_FUNC_USED_VAR_ARG2
void でない関数に、return 文がありませんが、式中でその関数の戻り値が使用されています。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 extern int fun(); 2 main() 3 { 4 return fun(); 5 } file f2.c: 1 int fun() 2 {} ============ 関数値が使用されていますが値が返されていません fun
メッセージ ID: E_FUNC_VAL_USED_NONE_RET1
void でない関数に、return 文がありませんが、式中でその関数の戻り値が使用されています。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 extern int fun(); 2 main() 3 { 4 return fun(); 5 } file f2.c: 1 int fun() 2 {}
メッセージ ID: E_FUNC_VAL_USED_NONE_RET2
関数中に return 文が使用されていますが、すべての関数呼び出しで、戻り値は無視されています。 このメッセージを生成するコードの例を次に示します。
1 int f(void) 2 { 3 return 1; 4 } 5 extern int f(void); 6 int main(void) 7 { 8 f(); 9 return 1; 10 } ============ 関数が返す値は常に無視されます f
メッセージ ID: E_FUNC_RET_ALWAYS_IGNOR1
関数中に return 文が使用されていますが、すべての関数呼び出しで、戻り値は無視されています。 このメッセージを生成するコードの例を次に示します。
1 int f(void) 2 { 3 return 1; 4 } 5 extern int f(void); 6 int main(void) 7 { 8 f(); 9 return 1; 10 }
メッセージ ID: E_FUNC_RET_ALWAYS_IGNOR2
関数中に return 文が使用されていますが、一部の関数呼び出しで、戻り値が無視されます。 このメッセージを生成するコードの例を次に示します。
1 int f(void) 2 { 3 return 1; 4 } 5 extern int f(void); 6 int main(void) 7 { 8 if(f()) { 9 return f(); 10 } 11 else { 12 f(); 13 return 1; 14 } 15 } ============ 関数が返す値は無視されることがあります f
メッセージ ID: E_FUNC_RET_MAYBE_IGNORED1
関数中に return 文が使用されていますが、一部の関数呼び出しで、戻り値が無視されます。 このメッセージを生成するコードの例を次に示します。
1 int f(void) 2 { 3 return 1; 4 } 5 extern int f(void); 6 int main(void) 7 { 8 if(f()) { 9 return f(); 10 } 11 else { 12 f(); 13 return 1; 14 } 15 }
メッセージ ID: E_FUNC_RET_MAYBE_IGNORED2
関数プロト型で宣言または定義されているパラメータの型が、別の宣言または定義の型と一致していません。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 int f(int); 2 int g(int); file f_1.c: 1 int f(int *ip); 2 int g(int *ip) {return *ip;} 3 ============ 宣言している関数の引数が整合していません g (arg 1) f_1.c(2) int * :: f.c(2) int f (arg 1) f.c(1) int :: f_1.c(1) int *
メッセージ ID: E_INCONS_ARG_DECL1
関数プロト型で宣言または定義されているパラメータの数が、別の宣言または定義での数と一致していません。すべての宣言で同じ数の引数が使用されている場合は、ANSI C の表記法である "..." を使用して、プロト型を宣言または定義すると、このメッセージが表示されなくなります。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 int 2 f(int x, int y) 3 { 4 return (x + y); 5 } 6 int 7 g(void) 8 { 9 int i, j = 0, k = 0; 10 i = f(j, k); 11 return (i); 12 } file f_1.c: 1 int f(int); 2 int g(int); ============ 可変数の引数で関数が宣言されています f f.c(2) :: f_1.c(1) g f.c(7) :: f_1.c(2)
メッセージ ID: E_FUNC_DECL_VAR_ARG1
関数プロト型で宣言または定義されているパラメータの数が、別の宣言または定義での数と一致していません。すべての宣言で同じ数の引数が使用されている場合は、ANSI C の表記法である "..." を使用して、プロト型を宣言または定義すると、このメッセージが表示されなくなります。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 int 2 f(int x, int y) 3 { 4 return (x + y); 5 } 6 int 7 g(void) 8 { 9 int i, j = 0, k = 0; 10 i = f(j, k); 11 return (i); 12 } file f_1.c: 1 int f(int); 2 int g(int);
メッセージ ID: E_FUNC_DECL_VAR_ARG2
プログラムを別のマシンに移植すると、プログラム中の外部名を区別できなくなる 可能性があります。これは、外部名の長さ、および大文字と小文字の区別に関する制限事項が、インプリメンテーションによって異なるためです。 -Xc を指定すると、ANSI C の下限に従って外部名が最初の 6 文字に切り捨てられ、大文字または小文字に統一されます。-p を指定すると、最初の 8 文字に切り捨てられ、大文字または小文字に統一されます。 このメッセージを生成するコードの例を次に示します。
1 int foobar1; 2 int FooBar12; 3 int foobar2; 4 int FOOBAR12; ============ -Xc の場合: シンボルは名前の切り詰めによって区別できなくなる可能性があります FooBar12 in f.c(2) :: foobar1 in f.c(1) foobar2 in f.c(3) :: FooBar12 in f.c(2) FOOBAR12 in f.c(4) :: foobar2 in f.c(3) -p の場合: シンボルは名前の切り詰めによって区別できなくなる可能性があります FOOBAR12 (4) in f.c :: FooBar12 (2) in f.c
メッセージ ID: E_INDISTING_FROM_TRUNC1
プログラムを別のマシンに移植すると、プログラム中の外部名を区別できなくなる 可能性があります。これは、外部名の長さ、および大文字と小文字の区別に関する制限事項が、インプリメンテーションによって異なるためです。 -Xc を指定すると、ANSI C の下限に従って外部名が最初の 6 文字に切り捨てられ、大文字または小文字に統一されます。-p を指定すると、最初の 8 文字に切り捨てられ、大文字または小文字に統一されます。 このメッセージを生成するコードの例を次に示します。
1 int foobar1; 2 int FooBar12; 3 int foobar2; 4 int FOOBAR12;
メッセージ ID: E_INDISTING_FROM_TRUNC2
[fs]printf() または [fs]scanf() 関数呼び出しの制御文字列に指定した変換指定子の数が、呼び出し中の引数の数より少ないです。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 int i = 0, j = 1; 6 (void) printf("%d", i, j); 7 } ============ 書式から参照されない余分な引数があります printf f.c(6)
メッセージ ID: E_TOO_MANY_ARG_FOR_FMT1
[fs]printf() または [fs]scanf() 関数呼び出しの制御文字列に指定した変換指定子の数が、呼び出し中の引数の数より少ないです。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 int i = 0, j = 1; 6 (void) printf("%d", i, j); 7 }
メッセージ ID: E_TOO_MANY_ARG_FOR_FMT2
[fs]printf() または [fs]scanf() 制御文字列の書式が正しくありません。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 (void) printf("%y"); 6 } ============ 書式文字列が正しくありません printf f.c(5)
メッセージ ID: E_BAD_FORMAT_STR1
[fs]printf() または [fs]scanf() 制御文字列の書式が正しくありません。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 (void) printf("%y"); 6 }
メッセージ ID: E_BAD_FORMAT_STR2
[fs]printf() または [fs]scanf() 関数呼び出しの制御文字列に指定した変換指定子の数が、呼び出し中の引数の数よりも多くなっています。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 int i = 1; 6 (void) printf("%d%d", i); 7 } ============ 書式から参照される引数が足りません printf f.c(6)
メッセージ ID: E_TOO_FEW_ARG_FOR_FORMAT1
[fs]printf() または [fs]scanf() 関数呼び出しの制御文字列に指定した変換指定子の数が、呼び出し中の引数の数よりも多くなっています。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 int i = 1; 6 (void) printf("%d%d", i); 7 }
メッセージ ID: E_TOO_FEW_ARG_FOR_FORMAT2
[fs]printf() または [fs]scanf() 関数呼び出しの制御文字列に指定した変換指定子と、引数が一致していません。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 int i = 0; 6 (void) printf("%s", i); 7 } 8 ============ 関数への引数の型と書式とが整合していません printf (arg 2) int :: (format) char * f.c(6)
メッセージ ID: E_BAD_FORMAT_ARG_TYPE1
[fs]printf() または [fs]scanf() 関数呼び出しの制御文字列に指定した変換指定子と、引数が一致していません。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 main(void) 4 { 5 int i = 0; 6 (void) printf("%s", i); 7 } 8
メッセージ ID: E_BAD_FORMAT_ARG_TYPE2
外部参照可能な変数または関数が大域的 (すなわち静的でない) として宣言されていますが、定義されたファイルの内部だけで参照されています。このメッセージは、-m を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 int 2 f(void) 3 { 4 return 1; 5 } 6 main(void) 7 { 8 return f(); 9 } ============ 大域的に宣言されていますが静的 (static) にすることができます f f.c(2)
メッセージ ID: E_GLOBAL_COULD_BE_STATIC1
外部参照可能な変数または関数が大域的 (すなわち静的でない) として宣言されていますが、定義されたファイルの内部だけで参照されています。このメッセージは、-m を指定して lint を起動した場合には、表示されません。 このメッセージを生成するコードの例を次に示します。
1 int 2 f(void) 3 { 4 return 1; 5 } 6 main(void) 7 { 8 return f(); 9 }
メッセージ ID: E_GLOBAL_COULD_BE_STATIC2
名前の記述において、16 個(制限値)を超える修飾子が使用されています (出力形式: simple)。このメッセージを生成するコードの例
1 int ************************ip = 0; ============ (1) 警告: 型に 16 個を超える修飾子がありますが、使用されるのは 16 個だけです。
メッセージ ID: E_MODIFIER_OVERFLOW
パラメータの数が n より少ない関数に、/* VARARGSn */ 指令を適用すると、n は、実際の関数定義で指定されているパラメータの数に減少します。 このメッセージを生成するコードの例を次に示します。
1 /* VARARGS4 */ 2 int 3 f(int x, int y, int z) 4 { 5 return (x + y + z); 6 } ============ (3) 警告: 引数の数が指令に対して正しくありません: /* VARARGS4 */: 有効な引数の数(3) は、指令によって検査される引数の数(4) より少なくてはいけません
メッセージ ID: E_DIRECTIVE_TOO_MANY_ARG
パラメータの数が n より少ない関数に、/* VARARGSn */ 指令を適用すると、n は、実際の関数定義で指定されているパラメータの数に減少します。 このメッセージを生成するコードの例を次に示します。
1 /* VARARGS4 */ 2 int 3 f(int x, int y, int z) 4 { 5 return (x + y + z); 6 } ============ (3) 警告: 引数の数が指令に対して正しくありません: /* VARARGS4 */: 有効な引数の数(3) は、指令によって検査される引数の数(4) より少なくてはいけません
メッセージ ID: E_DIRECTIVE_TOO_MANY_ARG2
配列でない自動変数に値を代入する行より前で、その自動変数を参照しています。変数のアドレスの取得は、変数が設定され使用されたものとみなされます。構造体または共用体に関しては、いずれかのメンバーに最初に代入を行うと、構造体または共用体の全メンバーに対して代入が行われたものとみなされます (出力形式: simple)。このメッセージを生成するコードの例
1 void 2 v(void) 3 { 4 int i, j, k; 5 static int x; 6 k = j; 7 i = i + 1; 8 x = x + 1; 9 } ============ (6) 警告:変数が設定以前に使用されている可能性があります。 j (7) 警告:変数が設定以前に使用されている可能性があります。 i
メッセージ ID: E_VAR_USED_BEFORE_SET
if、while、または for 文の制御式が定数になっています。 文の前に、/* CONSTCOND */ を置くと、このメッセージが表示されなくなります (出力形式: simple)。このメッセージを生成するコードの例
1 void 2 main(void) 3 { 4 if (!1) 5 return; 6 while (1) 7 f(); 8 for (; 1;); 9 for (;;); 10 /* CONSTCOND */ 11 while (1); 12 } ============ (4) 警告:条件のコンテキストに定数があります (6) 警告: 条件のコンテキストに定数があります (8) 警告: 条件のコンテキストに定数があります
メッセージ ID: E_CONSTANT_CONDITION
変数が副作用によって変更され、同じ式の別の位置で使用されています (出力形式: Simple)。 このメッセージを生成するコードの例
1 static int ia[10]; 2 void 3 v(void) 4 { 5 int i = 2; 6 ia[i++] = i; 7 } ============ (6) 警告:評価順序が未定義となります。 i
メッセージ ID: E_UNDEF_EVAL_ORDER
論理積 & において、オペランドの 1 つが、同一の変数と異なる 2 つの定数との等価性を検査している、または定数 0 です。定数が 0 の場合、式の前に /* CONSTCOND */ を置くと、このメッセージが表示されなくなります (出力形式: simple)。このメッセージを生成するコードの例
1 int 2 main(int argc, char *argv[]) 3 { 4 int i = argc; 5 i = (i == 1) & (i == 2); 6 i = (i == 1) & (i == 1); 7 i = (1 == i) & (i == 2); 8 i = (i == 1) & 0; 9 /* CONSTCOND */ 10 i = (0 & (i == 1)); 11 return (i); 12 } ============ (5) 警告: 論理式が常に偽です: 演算子 "&" (7) 警告: 論理式が常に偽です: 演算子 "&" (8) 警告: 論理式が常に偽です:演算子 "&"
メッセージ ID: E_FALSE_LOGICAL_EXPR
論理和 || において、オペランドの 1 つが、同一の変数と異なる 2 つの定数との不等価性を検査している、または 0 以外の定数です。0 以外の定数の場合、式の前に /* CONSTCOND */ を置くと、このメッセージが表示されなくなります (出力形式: simple)。このメッセージを生成するコードの例
1 int f(int i) 2 { 3 i = (i != 1) || (i != 2); 4 i = (i != 1) || (i != 1); 5 i = (1 != i) || (i != 2); 6 i = (i == 10) || 1; 7 /* CONSTCOND */ 8 i = (1 || (i == 10)); 9 return i; 10 } ============ (3) 警告: 論理式が常に真です: 演算子 "||" (5) 警告: 論理式が常に真です: 演算子 "||" (6) 警告: 論理式が常に真です: 演算子 "||"
メッセージ ID: E_TRUE_LOGICAL_EXPR
「通常」の char または unsigned の変数が、負またはゼロの値と比較されていますが、この比較は正しくない可能性があります。通常の char を signed (符号付き) として扱うかどうかは、インプリメンテーションによって定義されます(出力形式: simple)。このメッセージを生成するコードの例
1 void 2 v(char c, signed char sc) 3 { 4 int i; 5 i = (c == -5); 6 i = (c < 0); 7 i = (sc < 0); 8 } ============ (5) 警告: schar が negative constant と比較されています: 演算子 "==" (6) 警告: char が 0 と比較されています: op "<"このメッセージを生成するコードの例を次に示します。
1 void 2 v(unsigned int ui) 3 { 4 int i; 5 i = (ui > -2); 6 i = (ui < 0); 7 i = (ui <= 0); 8 i = (ui >= 0); 9 i = (ui > 0); 10 i = (-2 < ui); 11 i = (ui == -1); 12 i = (ui == -1U); 13 } ============ (5) 警告:unsigned と negative constant が比較されています: 演算子 ">" (6) 警告: unsigned と 0 が比較されています: 演算子 "<" (7) 警告: unsigned と 0 が比較されています: 演算子 "<=" (8) 警告: unsigned と 0 が比較されています: 演算子 ">=" (9) 警告: unsigned と 0 が比較されています: 演算子 ">" (10) 警告: unsigned と negative constant が比較されています: op "<" (11) 警告:unsigned と negative constant が比較されています: 演算子 "=="
メッセージ ID: E_SUSPICIOUS_COMPARISON
! 演算子のオペランドが、定数になっています。この文の前に、/* CONSTCOND */ を置くと、対応する文に対するメッセージが表示されなくなります。このメッセージは、-h を指定して lint を起動した場合には表示されません (出力形式: simple)。このメッセージを生成するコードの例
1 void main(void) 2 { 3 if (! 0) return; 4 /* CONSTCOND */ 5 if (! 0) return; 6 } ============ (3) 警告: 演算子に定数オペランドが与えられています:""!"
メッセージ ID: E_CONST_EXPR
符号なし整数型に、負の定数を代入しています。符号なし整数型にできるのは、正の値またはゼロだけです。 このメッセージを生成するコードの例を次に示します。
unsigned char uc = -1; unsigned int b = -13;
メッセージ ID: E_ASSIGN_NEG_CONST_TO_UNSIGNED
整数定数式の値が、代入先の整数型オブジェクトのサイズを超えているため、式の値が切り捨てられます (出力形式: simple)。このメッセージを生成するコードの例
1 unsigned char 2 f() 3 { 4 unsigned char uc; 5 uc = 255; 6 uc = 256; 7 return uc; 8 } ============ (6) 警告:代入によって定数が切り捨てられます。
メッセージ ID: E_CONST_TRUNCATED_BY_ASSIGN
ポインタのサイズが、代入先の整数型オブジェクトのサイズを超えています。 (出力形式: simple)。このメッセージを生成するコードの例
1 void 2 v(void) 3 { 4 int *ip; 5 char c; 6 c = ip; 7 } ============ (6) 警告:ポインタの変換でビットが失われます。
メッセージ ID: E_PTR_CONV_LOSES_BITS
ポインタではない実際の配列の添え字を表す定数式に、負の値が使用されています (出力形式: simple)。このメッセージを生成するコードの例
1 int 2 main(void) 3 { 4 int ia[10]; 5 return ia[5 * 2 / 10 - 2]; 6 } ============ (5) 警告:配列の添字に負の数は指定できません。 -1
メッセージ ID: E_NEG_ARRAY_SUBSCRIPT
配列要素の添え字の値が、配列の上限値を超えています (出力形式: simple)。このメッセージを生成するコードの例
1 int 2 f(void) 3 { 4 int ia[10]; 5 int *ip = ia; 6 while (ip != &ia[10]) /* アドレスとしての使用は可 */ 7 ip++; 8 return ia[5 + 6]; 9 } ============ (8) 警告: 配列の添字に 9 より大きな値は指定できません: 11
メッセージ ID: E_OVERFLOW_ARRAY_SUBSCRIPT
論理演算子とビット単位演算子が混在する式が、括弧で囲まれていません。このメッセージは、-h を指定して lint を起動した場合には、表示されません (出力形式: simple)。このメッセージを生成するコードの例
1 void 2 v(void) 3 { 4 int i = 0, j = 0, x; 5 x = (2 + i == 0); 6 x = (i & j == 0); /* (i & (j == 0)) と解釈 */ 7 x = (j == 1 & i); /* ((j == 1) & i) と解釈 */ 8 } ============ (6) 警告:優先度が混乱する可能性があります; 括弧 (7) 警告: 優先度が混乱する可能性があります; 括弧
メッセージ ID: E_PRECEDENCE_CONFUSION
HP-UX の printf や scanf のルーチンによって、long long 型の変数を出力したり読み込んだりすることはできません。
メッセージ ID: E_HPUX_BAD_FORMAT_STR1
HP-UX の printf や scanf のルーチンによって、long long 型の変数を出力したり読み込んだりすることはできません。
メッセージ ID: E_HPUX_BAD_FORMAT_STR2
変数または関数を定義していますが、ソースファイル中で使用されていません。 このメッセージを生成するコードの例を次に示します。
int f(); int main() { int a = 10; printf("関数 f() の呼び出しはない" ); return 0; } int f() { return (1+1); }
メッセージ ID: E_NAME_DEF_NOT_USED
変数または関数を定義していますが、ソースファイル中で使用されていません。 このメッセージを生成するコードの例を次に示します。
int f(); int main() { int a; printf("関数 f() の呼び出しと a の使用はない"); return 0; }
メッセージ ID: E_NAME_DECL_NOT_USED_DEF
変数が、複数回、異なる場所で宣言されています。 参照したい変数が、現在のスコープ内の別の変数定義によって、無効にならないように注意してください。 このメッセージを生成するコードの例
int x = 10; /* 大域変数 x */ int main() { int x = 1; /* 変数 x の別の定義 */ return f(x); } int f(int y) { int x = 5; /* 局所変数 x の宣言 x */ return (y + g(x)); /* 現在のスコープ中で x を使用 */ } int g(int z) { return (x*z); /* x を使用 */ }
メッセージ ID: E_NAME_MULTIPLY_DEF
指定したファイルを読み込んでいる時に、ファイルシステムエラーが発生しました。 これは、ソースプログラムのエラーではありません。
メッセージ ID: E_F_RD_ERR
指定したファイルを読み込んでいる時に、ファイルシステムエラーが発生しました。 これは、ソースプログラムのエラーではありません。
メッセージ ID: E_F_WR_ERR
指定したファイルを読み込んでいる時に、ファイルシステムエラーが発生しました。 これは、ソースプログラムのエラーではありません。
メッセージ ID: E_OPEN_F
enum のメンバーに、同じ名前で異なる値が定義されています。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 typedef enum { 2 ONE = 1, TWO = 3 3 } e; file f_1.c: 1 typedef enum { 2 ONE = 1, TWO 3 } e; ============ 列挙型のメンバーの宣言が整合していません TWO 3 f.c(2) :: 2 f_1.c(2)
メッセージ ID: E_ENUM
複数のソースファイルで、同じ名前で異なるマクロが定義されています。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 #define MAX_I 1 file f_1.c: 1 #define MAX_I 2 ============ マクロの定義が異なっています MAX_I f.c(1) :: f_1.c(1)
メッセージ ID: E_MCR_NODIFF
指定したインクルードファイルは、プログラムのコンパイル中に使用されていません。 このメッセージを生成するコードの例を次に示します。
#include/* 数学関数は使用されていない */ int main () { return 0; }
メッセージ ID: E_INCL_NO_US
未使用の enum メンバーがあります。 このメッセージを生成するコードの例を次に示します。
1 enum { 2 x, 3 y = 3, 4 z 5 } en; 6 main(void) 7 { 8 en = z; 9 return en; 10 } ============ 列挙型のメンバーが定義されていますが使用されていません x f.c(2) y f.c(3)
メッセージ ID: E_ENUM_UNUSE
typedef で宣言されている型が、プログラム中で使用されていません。 このメッセージを生成するコードの例を次に示します。
1 typedef long int LONG_INT_t; 2 void 3 main(void) 4 { 5 return; 6 } ============ typedef で定義されていますが使用されていません LONG_INT_t f.c(1)
メッセージ ID: E_TYPEDEF_UNUSE
typedef による、同じ名前に対する異なる定義があります。 このメッセージを生成するコードの例を次に示します。
1 typedef long int LONG_INT_t; 2 int 3 f(void) 4 { 5 typedef long long int LONG_INT_t; 6 LONG_INT_t li = 1; 7 return li; 8 } ============ typedef による宣言が整合していません LONG_INT_t long long f.c(1) :: long f.c(5)
メッセージ ID: E_TYPEDEF_INCONSIST
.c ファイルと同じ名前の .h ファイルがありません (出力形式: simple)。このメッセージを生成するコードの例
1 void 2 main(void) 3 { 4 int *ip; 5 ip = (int *) sizeof(int); 6 free(ip); 7 ip = (int *) malloc(sizeof(int) * 10); 8 ip++; 9 free(ip); 10 } ============ .c ファイルに対応する .h ファイルがありません /export/ld6/clint/LINT.EXMPLS/f/f.c
メッセージ ID: E_H_C_CHECK0
.h ファイルで extern 宣言されていますが、対応する .c ファイルで定義されていません。 このメッセージを生成するコードの例を次に示します。
file f.h: 1 extern int i; 2 extern int f(int x, int y); file f.c: 1 #include "f.h" 2 int ia[2]; 3 int i; 4 int 5 f(int x, int y) 6 { 7 ia[0] = x; 8 ia[1] = y; 9 if (ia[i] > ia[1]) 10 ia[0] = ia[1]; 11 return (x + y) / 2; 12 } ============ .c ファイルで extern 定義されていますが、対応する .h ファイルで宣言されていません ia f.c(2)
メッセージ ID: E_H_C_CHECK1
.c ファイルで extern 名が定義されていますが、対応する .h ファイルで宣言されていません。 このメッセージを生成するコードの例を次に示します。
file f.h: 1 int i; 2 extern int f(int x, int y); file f.c: 1 #include "f.h" 2 extern int i; 3 int 4 f(int x, int y) 5 { 6 int ia[2]; 7 ia[0] = x; 8 ia[1] = y; 9 if (ia[i] > ia[1]) 10 ia[0] = ia[1]; 11 return (x + y) / 2; 12 } 13 int 14 main(void) 15 { 16 i = 5; 17 return f(i, -i); 18 } ============ .c ファイルで extern 定義されていますが、対応する .h ファイルで宣言されていません main f.c(14)
メッセージ ID: E_H_C_CHECK2
関数が定義されていますが、実行時に使用されていません。たとえば、到達されないコードから関数が呼び出されています。 このメッセージを生成するコードの例を次に示します。
file f.c: 1 extern int f(void); 2 3 main(void) 4 { 5 int i = 0; 6 if (i > 0) 7 i = f(); 8 return i; 9 } file f_1.c: 1 int 2 f(void) 3 { 4 return 3; 5 } ============
メッセージ ID: E_UNCAL_F
プログラム中に、1 度も実行されない文があります。 このメッセージを生成するコードの例
int f() { printf("前に return 文がある\n"); return 0; assert(FALSE); /* <==== 到達できない文です */ }
メッセージ ID: E_STM_RCH
引数が、割り当てられたメモリーへのポインタになっていません。 (出力形式: simple)。このメッセージを生成するコードの例
1 #include <stdlib.h> 2 int *ip; 3 void 4 main(void) 5 { 6 free(*ip); 7 return; 8 } ============ f.c(6): 引数が正しくないため、メモリーを解放することができません
メッセージ ID: E_A_NOMEM
すでに解放されたメモリーを解放しています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip, *jp; 3 void 4 main(void) 5 { 6 ip = malloc(sizeof(int)); 7 jp = ip; 8 free(ip); 9 free(jp); 10 } ============ メモリーの解放が重複して行われています f.c(9) :: f.c(8)
メッセージ ID: E_P_FREE_DEALLOC
すでに解放された可能性のあるメモリーを解放しています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip, *jp; 3 void 4 main(int argc, char *argv[]) 5 { 6 ip = malloc(sizeof(int)); 7 *ip = 4; 8 jp = ip; 9 if (argc > 2) 10 free(ip); 11 free(jp); 12 } ============ メモリーの解放が重複して行われている可能性があります f.c(11) :: f.c(10)
メッセージ ID: E_P_FREE_DEALLOC_PSBL
解放されたメモリーを参照しています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip; 3 int 4 main(void) 5 { 6 int i; 7 ip = malloc(10); 8 *ip = 2; 9 free(ip); 10 i = *ip; 11 return (i); 12 } ============ 解放されたメモリーを参照しています f.c(10) :: f.c(9)
メッセージ ID: E_P_REF_DEALLOC
解放されたメモリーが参照される可能性があります。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip; 3 int 4 main(int argc, char *argv[]) 5 { 6 int i; 7 ip = malloc(10); 8 *ip = 2; 9 if (argc > 2) 10 free(ip); 11 i = *ip; 12 return (i); 13 } ============ 解放されたメモリーを参照している可能性があります f.c(13) :: f.c(12)
メッセージ ID: E_P_REF_DEALLOC_PSBL
解放されたメモリーへのポインタが使用されています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip; 3 void 4 main(void) 5 { 6 int *jp; 7 ip = malloc(10); 8 free(ip); 9 jp = ip; 10 } ============ 解放されたメモリーへのポインタを使用しています f.c(9) :: f.c(8)
メッセージ ID: E_P_USE_DEALLOC
解放されたメモリーへのポインタが使用される可能性があります。 このメッセージを生成するコードの例を次に示します。
1 #include2 void 3 f(char*ip) 4 { free(ip); 5 } 6 7 char 8 main(int argc, char *argv[]) 9 { char *ip, *jp; 10 11 ip = malloc(argc+4); 12 if (argc-- == 0) f(ip); 13 if (argc> 1) 14 { jp = ip; 15 return *jp; } 16 else 17 return '0'; 18 } ============
メッセージ ID: E_P_USE_DEALLOC_PSBL
変数へのポインタは解放できません。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 int 3 main(void) 4 { 5 int *ip; 6 int i; 7 ip = &i; 8 free(ip); 9 } ============ 変数へのポインタを解放しています i defined at f.c(6) :: f.c(8)
メッセージ ID: E_P_FREE_VAR
変数を指す可能性のあるポインタを解放しています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip; 3 int 4 main(int argc, char *argv[]) 5 { 6 int i; 7 if (argc > 2) 8 ip = &i; 9 else 10 ip = malloc(sizeof i); 11 *ip = 99; 12 free(ip); 13 return (++*ip); 14 } ============ 変数を指している可能性のあるポインタを解放しています i defined at f.c(6) :: f.c(12)
メッセージ ID: E_P_FREE_VAR_PSBL
すでに存在していない変数を指すポインタを使用して参照を行なっています。 自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 int *ip; 2 f(void) 3 { 4 int i = 0; 5 ip = &i; 6 return (i); 7 } 8 main(void) 9 { 10 int j; 11 j = f(); 12 j += *ip; 13 return (j); 14 } ============ 存在しなくなった変数へのポインタを使用して参照しています i defined at f.c(4) :: f.c(12)
メッセージ ID: E_P_REF_VAR
すでに存在していない変数を指すポインタを使用して、参照が行われる可能性があります。 自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 int *ip, ei; 2 f(int n) 3 { 4 int i = 0; 5 ip = &ei; 6 if (n > 0) 7 ip = &i; 8 return (i); 9 } 10 main(int argc, char *argv[]) 11 { 12 int j; 13 j = f(argc); 14 j += *ip; 15 return (ei + j); 16 } ============ 存在しなくなった変数へのポインタを使用して参照している可能性があります i defined at f.c(4) :: f.c(14)
メッセージ ID: E_P_REF_VAR_PSBL
すでに存在していない変数を指すポインタが使用されています。 自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 int *ip, ei; 2 f(void) 3 { 4 int x = 0; 5 ip = &x; 6 return (x); 7 } 8 main(void) 9 { 10 int i; 11 i = f(); 12 ip++; 13 return (ei + i); 14 } ============ 存在しなくなった変数へのポインタを使用しています x defined at f.c(4) :: f.c(12)
メッセージ ID: E_P_USE_VAR
すでに存在していない変数を指す可能性があるポインタが使用されています。 自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 int *ip, ei; 2 g(int n) 3 { 4 int x = 0, y = 1; 5 ip = &ei; 6 if (n > 0) 7 ip = &x; 8 return (x); 9 } 10 main(int argc, char * argv[]) 11 { 12 int i; 13 i = g(argc); 14 ip++; 15 return (ei + i); 16 } ============ 存在しなくなった可能性のある変数へのポインタを使用しています x defined at f.c(4) :: f.c(14)
メッセージ ID: E_P_USE_VAR_PSBL
関数が、ポインタに格納された、自動局所変数またはパラメータのアドレスを返しています。 自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 int * 2 f(void) 3 { 4 int i; 5 int *ip = &i; 6 return (ip); 7 } 8 void 9 main(void) 10 { 11 int *jp; 12 jp = f(); 13 (*jp)++; 14 } ============ 局所変数へのポインタを返しています i defined at f.c(4) :: f.c(6)
メッセージ ID: E_P_RET_VAR
関数が、自動局所変数のアドレスを返す可能性があります。 自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 static int * 2 f(int *ip) 3 { 4 int i; 5 int *jp = ip; 6 if (*ip > 5) 7 jp = &i; 8 return jp; 9 } 10 main(void) 11 { 12 int i = 1; 13 i += *f(&i); 14 return i; 15 } ============ 局所変数へのポインタを返している可能性があります i defined at E_P_RET_VAR_PSBL.c(4) :: E_P_RET_VAR_PSBL.c(8)
メッセージ ID: E_P_RET_VAR_PSBL
引数が NULL になります。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 #define ADDR 0 3 static int *ip; 4 main(void) 5 { 6 ip = ADDR * sizeof(int); 7 free(ip); 8 return 0; 9 } ============ NULL ポインタを解放しています f.c(7)
メッセージ ID: E_P_FREE_NULL
NULL になる可能性のあるポインタを解放しています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip; 3 main(int argc, char *argv[]) 4 { 5 if (argc == 2) 6 ip = 0; 7 else 8 ip = malloc(sizeof(int)); 9 free(ip); 10 return 0; 11 } ============ NULL である可能性のあるポインタを解放しています f.c(9)
メッセージ ID: E_P_FREE_NULL_PSBL
NULL ポインタを使用して参照を行なっています。 このメッセージを生成するコードの例を次に示します。
1 static int *ip; 2 int 3 main(void) 4 { 5 int i = 0; 6 ip = (int *) 0; 7 i = *ip; 8 i = i + *ip; 9 return (i); 10 } ============ NULL ポインタを使用して参照しています f.c(7)
メッセージ ID: E_P_REF_NULL
NULL ポインタを使用して、参照が行なわれる可能性があります。 このメッセージを生成するコードの例を次に示します。
1 static int *ip; 2 static int si = 99; 3 int 4 main(int argc, char *argv[]) 5 { 6 int i = 0; 7 if (argc == 2) 8 ip = (int *) 0; 9 else 10 ip = &si; 11 i = i + *ip; 12 return (i); 13 } ============ NULL ポインタを使用して参照している可能性があります f.c(11)
メッセージ ID: E_P_REF_NULL_PSBL
NULL ポインタが正しく使用されない可能性があります。 このメッセージを生成するコードの例を次に示します。
1 int 2 main(int argc, char * argv[]) 3 { 4 int *ip, *jp; 5 int i; 6 ip = 0; 7 if (argc > 1) 8 ip = &i; 9 jp = ip; 10 return (*jp)++; 11 } ============ NULL の可能性があるポインタを使用して変更しています ip defined at f.c(4) :: f.c(10)
メッセージ ID: E_P_USE_NULL_PSBL
引数が初期化されていません。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 void 3 main(void) 4 { 5 int *ip; 6 free(ip); 7 } ============ 初期化されていないポインタを解放しています ip defined at f.c(5) :: f.c(6)
メッセージ ID: E_P_FREE_UNINI
値が初期化されていない可能性があるポインタを解放しています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 3 void 4 main(int argc, char *argv[]) 5 { 6 int *ip; 7 if (argc == 0) 8 ip = malloc(sizeof(int)); 9 free(ip); 10 } ============ 値が初期化されていない可能性のあるポインタを解放しています ip defined at f.c(5) :: f.c(8)
メッセージ ID: E_P_FREE_UNINI_PSBL
値が初期化されていないポインタを使用して、参照が行われています。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 int i; 5 int *ip; 6 7 i = *ip; 8 } ============ 値が初期化されていないポインタを使用して参照しています ip defined at f.c(5) :: f.c(7)
メッセージ ID: E_P_REF_UNINI
初期化されていないポインタを使用して、参照が行われる可能性があります。 このメッセージを生成するコードの例を次に示します。
1 #include2 3 void 4 v(int i, char **p) 5 { 6 *p = (char *) malloc(sizeof(int) * (i + 1)); 7 **p = '0'; 8 } 9 10 char 11 main(int argc, char *argv[]) 12 { 13 char *cp; 14 if (argc) 15 v(argc, &cp); 16 return *cp; 17 } ============ 初期化されていないポインタを使用して参照している可能性があります cp defined at f.c(13) :: f.c(16)
メッセージ ID: E_P_REF_UNINI_PSBL
値が初期化されていないポインタを使用しています。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 int *ip; 5 6 ip++; 7 } ============ 値が初期化されていないポインタを使用しています ip defined at f.c(4) :: f.c(6)
メッセージ ID: E_P_USE_UNINI
値が初期化されていない可能性のあるポインタを使用しています。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(int argc, char *argv[]) 3 { 4 int i; 5 int *ip; 6 if (argc > 1) 7 ip = &i; 8 ip++; 9 } ============ 値が初期化されていない可能性のあるポインタを使用しています ip defined at f.c(5) :: f.c(8)
メッセージ ID: E_P_USE_UNINI_PSBL
不適切な方法で生成されたポインタを解放しています。たとえば、整数値がポインタ値に変換された可能性があります。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 int *ip; 5 ip = (int *) sizeof(int); 6 free(ip); 7 } ============ 疑わしい方法で作成されたポインタを解放しています f.c(6)
メッセージ ID: E_P_FREE_SUSP
不適切な方法で生成された可能性のあるポインタを解放しています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 void 3 main(int argc, char *argv[]) 4 { 5 int *ip; 6 ip = (int *) malloc(sizeof(int) * 10); 7 *ip = argc - 1; 8 if (*ip == 0) 9 ip = (int *) sizeof(int); 10 free(ip); 11 } ============ 疑わしい方法で作成された可能性のあるポインタを解放しています f.c(10)
メッセージ ID: E_P_FREE_SUSP_PSBL
不適切な方法で生成されたポインタを使用して、参照が行われています。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 int *ip; 5 int i; 6 ip = (int *) sizeof i; 7 i = *ip; 8 } ============ 疑わしい方法で作成されたポインタを使用して参照しています f.c(7)
メッセージ ID: E_P_REF_SUSP
不適切な方法で生成された可能性のあるポインタを使用して、参照が行われる可能性があります。 このメッセージを生成するコードの例を次に示します。
1 main(int argc, char *argv[]) 2 { 3 int *ip; 4 int i = argc; 5 ip = (int *) sizeof i; 6 if (argc > 2) 7 ip = &i; 8 return *ip; 9 } ============ 疑わしい方法で作成されたポインタを使用して参照している可能性があります E_P_REF_SUSP_PSBL.c(8)
メッセージ ID: E_P_REF_SUSP_PSBL
不適切な方法で生成されたポインタが使用されています。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(void) 3 { 4 int *ip, *jp; 5 int i = 0; 6 ip = (int *) sizeof i; 7 jp = ip; 8 } ============ 疑わしい方法で作成されたポインタを使用しています f.c(7)
メッセージ ID: E_P_USE_SUSP
不適切な方法で生成された可能性のあるポインタが使用されています。 このメッセージを生成するコードの例を次に示します。
1 void 2 main(int argc, char *argv[]) 3 { 4 int *ip, *jp; 5 int i = 99; 6 ip = (int *) sizeof i; 7 if (argc> 2) 8 ip = &i; 9 jp = ++ip; 10 } ============ 疑わしい方法で作成されたポインタを使用している可能性があります f.c(9)
メッセージ ID: E_P_USE_SUSP_PSBL
プログラム中で変数の値が使用されていません。 不必要な代入は、削除することができます。 このメッセージを生成するコードの例を次に示します。
1 static int *ip, i; 2 static void 3 f(void) 4 { 5 int *iq; 6 ip = &i; 7 iq = ip; 8 *ip = 7; 9 } 10 int 11 main(int argc, char *argv[]) 12 { 13 int j = 0xff; 14 f(); 15 j = 0x01; 16 if (argc > 2) 17 ip = &i; 18 else 19 ip = &j; 20 *ip = 1; 21 ip = ip + 1; 22 *ip = 2; 23 return (0); 24 } ============ 代入された値が使用されていません iq defined at f.c(5) :: set at f.c(7) i defined at f.c(1) :: set at f.c(8) j defined at f.c(13) :: set at f.c(13) j defined at f.c(13) :: set at f.c(15) j defined at f.c(13) :: set at f.c(22) i defined at f.c(1) :: set at f.c(22) 代入された値が使用されていません j defined at f.c(13) :: set at f.c(20) :: reset at f.c(22) i defined at f.c(1) :: set at f.c(20) :: reset at f.c(22)
メッセージ ID: E_ASGN_NEVER_USED
変数に値が代入されていますが、その値は、次に別の値が代入される前に使用されていません。不必要な代入は、削除することができます。 このメッセージを生成するコードの例を次に示します。
1 static int i; 2 int main (void) 3 { 4 int iq; 5 iq = 8; 6 i = 7; 7 iq = i; 8 return iq; 9 } ========== "t2.c", line 5: 警告: assigned value never used: iq defined at t2.c(4); reset at t2.c(7)
メッセージ ID: E_ASGN_RESET
定数データまたは変数が変更されています。 このメッセージを生成するコードの例を次に示します。
1 static const int ic = 1; 2 static void 3 f(int *ip) 4 { 5 (*ip)++; 6 } 7 main(void) 8 { 9 int *ip = (int *) ⁣ 10 f(ip); 11 return ic; 12 } ============ 定数データを変更しています ic defined at f.c(1) :: f.c(5)
メッセージ ID: E_ASGN_CONST
定数データまたは変数が変更される可能性があります。 このメッセージを生成するコードの例を次に示します。
1 static const int ic = 1; 2 static void 3 f(int *iq) 4 { 5 (*iq)++; 6 } 7 main(int argc , char* argv[]) 8 { 9 int *ip = (int *) ⁣ 10 int i; 11 if (argc > 2) 12 ip = &i; 13 f(ip); 14 return (*ip); 15 } ============ 定数データを変更している可能性があります ic defined at f.c(1) :: f.c(5)
メッセージ ID: E_ASGN_CONST_PSB
割り当てられたメモリーが、プログラム中で明示的に解放されていません。 このメッセージを生成するコードの例を次に示します。
1 #include <stdlib.h> 2 main(void) 3 { 4 int *ip; 5 ip = malloc(sizeof(long)); 6 *ip += 5; 7 return *ip; 8 } ============ メモリーが解放されていません f.c(5)
メッセージ ID: E_NEVER_DEALLOC
割り当てられたメモリーが、プログラム中で解放されていない可能性があります。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 void 3 v(int i) 4 { 5 char *cp; 6 cp = (char *) malloc(sizeof(int) * i); 7 *cp = 3; 8 if (i > 1) 9 free(cp); 10 } 11 main(int argc, char *argv[]) 12 { 13 v(argc); 14 } ============
メッセージ ID: E_NEVER_DEALLOC_PSB
変数またはメモリーが、設定する前に使用されています。 このメッセージを生成するコードの例を次に示します。
1 static int i; 2 void 3 main(void) 4 { 5 int j; 6 j += i; 7 } ============ 設定前に使用しています j defined at f.c(5)
メッセージ ID: E_USE_BEFORE_SET
変数が、設定する前に使用されている可能性があります。 このメッセージを生成するコードの例を次に示します。
1 int 2 main(int argc, char * argv[]) 3 { 4 int i; 5 if (argc>2) 6 i = 99; 7 i++; 8 return i; 9 } ============ 設定前に使用している可能性があります i defined at f.c(4)
メッセージ ID: E_USE_BEFORE_SET_PSB
変数またはメモリーに割り当てられた型の値が、別の型の値として使用されています。 このメッセージを生成するコードの例を次に示します。
1 main(void) 2 { 3 int i; 4 int *ip = &i; 5 *((char *) ip) = '1'; 6 return (*ip); 7 } ============ 使用している値の型が整合していません used as int :: i defined at f.c(3) f.c(6) :: f.c(5) set as char
メッセージ ID: E_VALUE_TYPE
変数またはメモリーに割り当てられた型の値が、別の型の値として使用される可能性があります。 このメッセージを生成するコードの例を次に示します。
1 main(int argc, char * argv[]) 2 { 3 int i; 4 int *ip = &i; 5 *ip = 0; 6 if (argc > 2) 7 *((char *) ip) = '1'; 8 return (*ip); 9 } ============ 使用している値の型が整合していない可能性があります used as int :: i defined at f.c(3) f.c(8) :: f.c(7) set as char
メッセージ ID: E_VALUE_TYPE_PSB
指定された関数が、プログラム中で呼び出されていないということが lint によって確認されました。
メッセージ ID: E_FUNC_UNREACHED
解放したメモリーが変更されています。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip; 3 static void f(void) { *ip=1;} 4 static void g(int i) { ip = malloc(i);} 5 static void h(void) { free(ip);} 6 void 7 main(void) 8 { 9 ip = malloc(10); 10 free(ip); 11 *ip = 1; 12 g(10); 13 h(); 14 f(); 15 } ============ 解放されたメモリーを変更しています f.c(3) :: f.c(5) f.c(11) :: f.c(10)
メッセージ ID: E_P_WRT_DEALLOC
解放したメモリーが変更される可能性があります。 このメッセージを生成するコードの例を次に示します。
1 #include <malloc.h> 2 static int *ip; 3 int 4 main(int argc, char *argv[]) 5 { 6 ip = malloc(8); 7 if (argc > 1) 8 free(ip); 9 *ip = argc; 10 return (*ip); 11 } ============ 解放されたメモリーを変更している可能性があります f.c(9) :: f.c(8)
メッセージ ID: E_P_WRT_DEALLOC_PSBL
すでに存在しない変数が変更されています。 自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 static int *ip; 2 static int si; 3 static int 4 f(void) 5 { 6 int i; 7 ip = &i; 8 i = 0; 9 return (i); 10 } 11 main(void) 12 { 13 int j; 14 j = f(); 15 *ip = 1; 16 j = j + f(); 17 *ip = 1; 18 return (si + j); 19 } ============ 存在しなくなった変数を変更しています i defined at f.c(6) :: f.c(15) i defined at f.c(6) :: f.c(17)
メッセージ ID: E_P_WRT_VAR
自動記憶クラスのオブジェクトは、そのブロック外で保持されることは保証されないので、このオブジェクトへのポインタは、ブロックが終わると未定義になります。 このメッセージを生成するコードの例を次に示します。
1 static int *ip; 2 static int si; 3 static int 4 f(void) 5 { 6 int i; 7 ip = &i; 8 i = 0; 9 if (si) 10 ip = &si; 11 return (i); 12 } 13 main(void) 14 { 15 int j; 16 j = f(); 17 *ip = 1; 18 j = j + f(); 19 *ip = 1; 20 return (si + j); 21 } ============ 存在しなくなった可能性のある変数を変更しています i defined at f.c(6) :: f.c(17) i defined at f.c(6) :: f.c(19)
メッセージ ID: E_P_WRT_VAR_PSBL
NULL ポインタを使用して変更が行われています。 このメッセージを生成するコードの例を次に示します。
1 static int *ip; 2 static void 3 v(void) 4 { 5 *ip = 1; 6 } 7 void 8 main(int argc, char *argv[]) 9 { 10 switch (argc) { 11 case 1: 12 ip = (int *) 0; 13 *ip = 1; 14 break; 15 case 2: 16 ip = (int *) 0; 17 v(); 18 break; 19 default: 20 v(); 21 } 22 } ============ NULL ポインタを使用して変更しています ip defined at f.c(1) :: f.c(5) ip defined at f.c(1) :: f.c(5) ip defined at f.c(1) :: f.c(13)
メッセージ ID: E_P_WRT_NULL
NULL になる可能性があるポインタを使用して変更が行われています。 このメッセージを生成するコードの例を次に示します。
1 #define VALUE 0 2 static int *ip; 3 static int si; 4 int 5 main(void) 6 { 7 ip = (int *) VALUE; 8 if (si) 9 ip = &si; 10 *ip = VALUE + 1; 11 return (si); 12 } ============ NULL の可能性があるポインタを使用して変更しています ip defined at f.c(2) :: f.c(10)
メッセージ ID: E_P_WRT_NULL_PSBL
あるオブジェクトを指すように初期化する前に、ポインタで間接参照しています。 このメッセージを生成するコードの例を次に示します。
1 f() { 2 int *p; 3 4 *p = 5; 5 } ========== "t2.c", line 4: 警告: modification using a pointer that is an uninitialized value p defined at t2.c(2) :: t2.c(4)
メッセージ ID: E_P_WRT_UNINI
値が初期化されていない可能性があるポインタを使用して、変更が行われています。 このメッセージを生成するコードの例を次に示します。
1 int 2 main(int argc, char *argv[]) 3 { 4 int *ip, i; 5 if (argc > 2) 6 ip = &i; 7 *ip = 1; 8 return i; 9 } ============ 値が初期化されていない可能性のあるポインタを使用して変更しています ip defined at f.c(4) :: f.c(7)
メッセージ ID: E_P_WRT_UNINI_PSBL
不適切な方法で生成されたポインタを使用して、変更が行われています。 このメッセージを生成するコードの例を次に示します。
1 static int *ip; 2 static void 3 f(void) 4 { 5 *ip = 1; 6 } 7 void 8 main(void) 9 { 10 ip = (int *) 4; 11 *ip = 1; 12 ip = (int *) 5; 13 f(); 14 *ip = 1; 15 } ============ 疑わしい方法で作成されたポインタを使用して変更しています f.c(5) f.c(11) f.c(14)
メッセージ ID: E_P_WRT_SUSP
不適切な方法で生成された可能性のあるポインタを使用して、変更が行われています。 このメッセージを生成するコードの例を次に示します。
1 #define VALUE 4 2 static int *ip; 3 static int si; 4 int 5 main(void) 6 { 7 ip = (int *) VALUE; 8 if (si) 9 ip = &si; 10 *ip = VALUE + 1; 11 return (si); 12 } ============ 疑わしい方法で作成された可能性のあるポインタを使用して変更しています f.c(10)
メッセージ ID: E_P_WRT_SUSP_PSBL
変数が定義されていますが、その変数の値または変数に割り当てられたメモリーが、使用されていません。 このメッセージを生成するコードの例を次に示します。
1 int * 2 f(void) 3 { 4 int i; 5 return (&i + (sizeof(int))); 6 } ============ 変数またはメモリーの内容が使用されていません i defined at f.c(4)
メッセージ ID: E_VRB_NEVER_USED
ラベルが定義されていますが、使用されていません。 このメッセージを生成するコードの例を次に示します。
1 f() 2 { 3 int k =7; 4 switch(k) { 5 case 1: 6 break; 7 defult: /* 検出されない構文エラー */ 8 return (10); 9 } 10 } =============== 未使用のラベル (7) default (関数: f)
メッセージ ID: E_LABEL_NOT_USED
実行可能な文が含まれていないループが、lint によって検出されました。 このメッセージを生成するコードの例を次に示します。
1 int i; 2 for (i = 0; i < 5; i++) ; /* empty for loop */ 3 while (i < 7) { } /* empty while loop */
メッセージ ID: E_LOOP_EMPTY
実引数が、対応する引数の型に暗黙で変換されています (出力形式: simple)。このメッセージを生成するコードの例
1 static void f(int x1) 2 { 3 printf("%d\n", x1); 4 } 5 void main () 6 { 7 float x; 8 x = 4.5; 9 f(x); 10 } ============ (9) 警告: float は int に変換されます: 1 番目の引数(関数: f)
メッセージ ID: E_ARGUMENT_CONVERT
ファイル番号が無効である (ファイルリスト中の空きスロットよりも大きい) ことが、コンパイラまたは lint によって検出されました。これは内部エラーです。
メッセージ ID: E_BAD_FILE_NUMBER
ソースファイルにアクセスできないため、lint は メッセージに対応するソース行を出力できません。たとえば、ソースファイルの名前変更、削除、移動が行われた可能性があります (出力形式: simple)。このメッセージを生成するコードの例
| |******* source line is not accessible ... | ! line 677, file.c warning: assigned value never used: ReturnVal
メッセージ ID: E_SRC_LINE_UNACCESSIBLE
ある #line 指令によって、lint がメッセージに表示されているソース行を出力できません (出力形式: simple)。このメッセージを生成するコードの例
file f.c: 1 #line 20 "nofile.c" 2 int i; 3 void 4 main(void) 5 { 6 return 99; 7 } ============ | |******* ファイルに #line 指令があるためにソース行を見つけられません |! 24 行目, nofile.c | エラー: void 関数は値を返すことはできません
メッセージ ID: E_SRC_LINE_UNACCESSIBLE2
呼び出している関数の引数の型を、関数プロト型宣言での型に変換できまません。このメッセージを生成するコードの例
struct s {int x; } q; int g(int, int); f() { g(3, q); }
メッセージ ID: E_ARG_INCOMPATIBLE_WITH_ARG_L
意味のない式または添字式があります。 このメッセージを生成するコードの例を次に示します。
int g() { 1; return 0; }
メッセージ ID: E_EXPR_NULL_EFFECT
宣言された型とは異なる型の戻り値が、この関数中の return 文に指定されています。コンパイラは、その戻り値を宣言された型に変換します。
1 char f() { 2 return 0xffffffffL; 3 }
メッセージ ID: E_IMPL_CONV_RETURN
ポインタよりもサイズが小さい整数型のオブジェクトが、ポインタの型に明示的にキャストされています。たとえば、32 ビット整数が、64 ビットポインタにキャストされています。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 int i; 5 char *ip; 6 ip = (char *) i; 7 } ============ "t.c", 6 行目: 警告: 32 ビット整数からポインタにキャストしています
メッセージ ID: E_CAST_TO_PTR_FROM_INT
整数型のオブジェクトが、よりサイズが小さい整数型に明示的にキャストされています。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 int i; 5 long l; 6 i = (int) l; 7 } ============ "t.c", 6 行目: 警告: 64 ビット整数から 32 ビット整数にキャストしています
メッセージ ID: E_CAST_INT_TO_SMALL_INT
整数定数式が、よりサイズが小さい整数型に明示的にキャストされています。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 char c; 5 c = (char) 1024; 6 } ============ "t.c" 5 行目: 警告: 32 ビット整数の定数式から 8 ビット整数にキャストしています
メッセージ ID: E_CAST_INT_CONST_TO_SMALL_INT
整数型のオブジェクトが、よりサイズが小さい別の整数型オブジェクトに代入されています。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 int i; 5 long l; 6 i = l; 7 } ============ "t.c", 6 行目: 警告: 64 ビット整数を 32 ビット整数に代入します
メッセージ ID: E_ASSIGN_INT_TO_SMALL_INT
整数定数式が、整数型のオブジェクトに代入されているまたは返されていますが、値は切り捨てられます。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 char c; 5 c = 1024; 6 } ============ "t.c" 5 行目: 警告: 代入によって 32 ビット定数が 8 ビットに切り捨てられました
メッセージ ID: E_ASSIGN_INT_FROM_BIG_CONST
関数呼び出しの整数型の引数が、関数定義の仮引数の型よりもサイズが大きいです。 このエラーメッセージは、-errchk=longptr64 オプションを付けると表示されます。 このメッセージを生成するコードの例を次に示します。
1 void 2 print_int(int i) 3 { 4 printf("int %d\n", i); 5 } 6 7 void 8 v(void) 9 { 10 long l = 5; 11 print_int(l); 12 } ============ "t.c", 11 行目: 警告: 64 ビット整数を渡していますが、予期しているのは 32 ビット整数です: print_int(引数 1)
メッセージ ID: E_PASS_INT_TO_SMALL_INT
関数呼び出しの引数が整数定数式で、その整数定数式の型は、関数定義中の仮引数の型よりもサイズが大きいです。 このエラーメッセージは、-errchk=longptr64 オプションを付けると表示されます。 このメッセージを生成するコードの例を次に示します。
1 void 2 print_int(int i) 3 { 4 printf("int %d\n", i); 5 } 6 7 void 8 v(void) 9 { 10 print_int(11111111024L); 11 } ============ "t.c", 10 行目: 警告: 64 ビット整数定数を渡していますが、予期しているのは 32 ビット整数で: printi(1 番目の引数)
メッセージ ID: E_PASS_INT_FROM_BIG_CONST
?:lock_lint は、エラーメッセージ中に示されたロックが関数呼び出しで使用されたとみなします。 このメッセージを生成するコードの例
int waitWriter; f() { mutex_t mutex1, mutex2; mutex_lock((waitWriter == 0) ? &mutex1 : &mutex2); }
メッセージ ID: E_CONDITIONAL_OP_LOCKCHOICE
#if または #elif 指令の中に 予期しない単項演算があります。 このメッセージを生成するコードの例を次に示します。
main() { #define x 0 #define y 1 #if x ! y == 0 printf("Hello\n"); #endif }
メッセージ ID: E_UNEXPECTED_UNARY
この警告は、-p オプションを付けると表示されます。コンパイラは、オブジェクトまたは関数へのポインタを、常に真として評価されるように最適化することがあります。 このメッセージを生成するコードの例を次に示します。
extern int foo; #pragma weak foo int main() { if (&foo) return foo; }
メッセージ ID: E_POINTER_TO_OBJECT
定数の初期設定子内のアドレスは、定数の算術式でなければなりません。拡張形として、ポインタのサイズより大きいまたは等しいサイズの整数型の定数初期設定子にアドレスを指定できます。ポインタよりサイズが小さい整数型の定数初期設定子にアドレスを指定することはできません。 このメッセージを生成するコードの例を次に示します。
int x; char c = &x;
メッセージ ID: E_ADDRESS_IN_CONST_INITIALIZER
整数型のオブジェクトを、他の (よりサイズの大きい) 整数型のオブジェクトと比較しています。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 int i; 5 long l; 6 i = i > l; 7 } ============ "t.c", 6 行目: 警告: 32 ビット整数と 64 ビット整数を比較中
メッセージ ID: E_COMP_INT_WITH_LARGE_INT
符号なし整数型のオブジェクトが、同じサイズの符号付き整数型のオブジェクトに代入されています。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 int i; 5 unsigned int ui; 6 i = ui; 7 } ============ "t.c", 6 行目: 警告: 32 ビット符号なし整数の 32 ビット符号付き整数への代入
メッセージ ID: E_ASSIGN_UINT_TO_SIGNED_INT
関数呼び出しに符号なし整数型の引数が指定されていますが、関数定義の仮引数の型は同じサイズの符号付き整数型です。 このエラーメッセージは -errchk=longptr64 または -errchk=sizematch オプションの指定がある場合に出力されます。 このメッセージを生成するコードの例を次に示します。
1 void 2 print_int(int i) 3 { 4 printf("int %d\n", i); 5 } 6 7 void 8 v(void) 9 { 10 unsigned int ui = 5; 11 print_int(ui); 12 } ============ "t.c", 11 行目: 警告: 32 ビット符号なし整数を、32 ビット符号付き整数が期待される引数へ渡してます: print_int(引数 1)
メッセージ ID: E_PASS_UINT_TO_SIGNED_INT
i符号なし整数型のオブジェクトが、同じサイズの符号付き整数型に明示的にキャスト (型変換) されています。 このメッセージを生成するコードの例を次に示します。
1 void 2 v(void) 3 { 4 int i; 5 unsigned int ui; 6 i = (int) ui; 7 } ============ "t.c", 6 行目: 警告: 32 ビット符号なし整数から 32 ビット符号付き整数へのキャスト
メッセージ ID: E_CAST_UINT_TO_SIGNED_INT
#pragma error_messages に正しくない構文が使用されています。 error_messages プラグマは次のように指定しなければなりません。
#pragma error_messages ({on|off|default}, errtag1 [,errtag2, ... ,errtag-n])このメッセージを生成するコードの例
#pragma error_messages {off: E_BAD_PTR_INT_COMBINATION, }
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA_EMSG
#pragma weak symbol1 = symbol2 は symbol1 を弱いシンボルとして定義し、これはシンボル symbol2 の別名となります。両方に同じシンボルを指定することはできません。 このメッセージを生成するコードの例を次に示します。
1 #pragma weak function_name = function_name 2 3 int 4 _function_name(void) { 5 return 1; 6 } ============ "test.c" 1 行目: 「#pragma weak symbol1 = symbol2」の 2 つのシンボルは同一にはな れません: function_name cc: test.c に対して、acomp が失敗しました。
メッセージ ID: E_SYMBOL_IN_PRAGMA_WEAK
外部 (extern)、静的 ( static)、または配列オブジェクトは、コンパイル時の定数でなければなりません。 自動構造体または共用体オブジェクトの初期設定子も、{} で囲まれている場合は、やはりコンパイル時の定数でなければなりません。整数定数式の中でキャスト演算子を使用できるのは、算術型を整数型に変換するときだけです。たとえば、ポインタ型を算術型に変換するキャストは定数式ではありません。また、初期化する変数の型がポインタより小さいとき、コンパイラはこのエラーメッセージを出力します。 このメッセージを生成するコードの例を次に示します。
extern int myf(); int (* fptr)() = (int (*)())((int)myf + 1);
メッセージ ID: E_NON_CONST_INIT_SCONV
ISO C は、定義済みシンボル __STDC_VERSION__ の定義を解除することを禁じています。プログラマは、ISO C と非 ISO C の両方の環境で動作するように作成した C コードをテストするためにこの機能を使用したい場合があります。 たとえば、 __STDC_VERSION__ をチェックした後、もしこれが定義されていれば関数プロト型宣言を行い、定義されていなければ古いスタイルの関数宣言または定義を行うという C コードを作成したとします。C コンパイラは __STDC_VERSION__ を事前に定義するので、通常の方法では、プログラマは古いスタイルのコードをテストすることができません。そこで、別の (ISO C ではない) コンパイラを通じてコードを実行する必要が生じます。__STDC_VERSION__ の定義を (通常はコマンド行で) 解除すると、C コンパイラを使用してチェックを実行できるようになります。この診断は、プログラマが ISO C の制約に違反していることを通知します。 このメッセージを生成するコードの例を次に示します。
#undef __STDC_VERSION__ /* 通常は -U__STDC_VERSION_ を*/ /* cc コマンド行に指定する */ #ifdef __STDC_VERSION__ int myfunc(const char *arg1, int arg2) #else /* non-ISO C case */ int myfunc(arg1,arg2) char *arg1, /* oops */ int arg2; #endif { }
メッセージ ID: E_UNDEFINING__STDC_VERSION__
通知されたプラグマ内に、使用前にプロト型宣言しなければならない関数名をコンパイラが検出しました。 このメッセージを生成するコードの例を次に示します。
/* abc 関数がどこにも定義または宣言されていない */ #pragma inline (abc)============ The function abc should be prototyped prior to the pragma:
int abc(); #pragma inline (abc)
メッセージ ID: E_PRAGMA_FUNC_UNDECLARED
通知されたプラグマで関数名が必要な場所に、関数名ではない識別子をコンパイラが検出しました。 このメッセージを生成するコードの例を次に示します。
int abc; #pragma inline (abc)
メッセージ ID: E_PRAGMA_FUNC_REQUIRED
通知された #pragma が正しくない構文で指定されています。正しい pragma の設定方法は次の通りです。
#pragma <pragma_name> (funcname [, funcname ...])このメッセージを生成するコードの例を次に示します。
#pragma no_side_effect {a b}
メッセージ ID: E_MALFORMED_PRAGMA_W_FUNC
異なる型のオペランド式の計算のため、コンパイラは符号なし整数型からより大きな整数型もしくはポインタサイズへの拡張を行います。 このメッセージを生成するコードの例を次に示します。
1 main() 2 { 3 unsigned int i = 1; 4 unsigned long long ll = 1; 5 char *p = "hello"; 6 char c; 7 8 c = *(p + (-i)); 9 return (ll + (-i)); 10 } ============ (8) 警告: 符号拡張が行われないため、符号なし整数型からより大きな整数型あるいはポインタサイズへの拡張は予期せぬ結果になるかもしれません。 (9) 警告: 符号拡張が行われないため、符号なし整数型からより大きな整数型あるいはポインタサイズへの拡張は予期せぬ結果になるかもしれません。
メッセージ ID: E_UNEXPECTED_UINT_PROMOTION
配列要素の評価でコンパイラは符号なし整数からポインタサイズへの拡張を行います。 このメッセージを生成するコードの例を次に示します。
1 void main() 2 { 3 unsigned int i = 1; 4 char *p = "hello"; 5 char c; 6 7 c = p[-i]; 8 } ============ (7) 警告: 符号拡張が行われないため、配列要素の評価で符号なし整数型からポインタサイズへの拡張は予期せぬ結果になるかもしれません。
メッセージ ID: E_UNEXPECTED_UINT_PROMOTION_SUB
コンパイラが符号付き整数型からより大きな整数型への拡張を行う場合、符号が拡張されます。 このメッセージを生成するコードの例を次に示します。
1 void main() 2 { 3 int i = -1; 4 unsigned long ul; 5 6 ul = (unsigned long)i; 7 } ============ (6) 警告: 32 ビット整数から 64 ビット整数への符号拡張
メッセージ ID: E_SIGN_EXTENSION_PSBL
コンパイラが #pragma opt 指定を読み込み、その値がコマンドライン -xmaxopt で 指定された値を越えています。#pragma opt で指定された関数の最適化レベルは、コンパイラの -xmaxopt オプションで指定された値まで下げられます。 このメッセージを生成するコードの例を次に示します。
int abc(); /* compiler invoked with -xO5 -xmaxopt=2 */ #pragma opt 4 (abc)
メッセージ ID: E_PRAGMA_OPT_REDUCED
#pragma opt の設定が構文上に間違っています。正しい pragma の設定方法は次の通りです。
#pragma opt level (funcname [, funcname ...])このメッセージを生成するコードの例を次に示します。
#pragma opt 3 {a b}
メッセージ ID: E_IGNORE_MALFORMED_PRAGMA_OPT
このメッセージは、不明確な宣言または定義を使用して識別子を再宣言すると出力されます。この場合、識別子の種類は出力できません。 このメッセージを生成するコードの例を次に示します。
1 #include <stdio.h> 2 void Function( struct IamNotDefined *b); 3 int counter = 0; 4 main() 5 { 6 } 7 8 void Function( struct IamNotDefined *b) ;
メッセージ ID: E_DUBIOUS_ID_REDECLARED
このメッセージは、不明確な定義を使用して識別子を再定義すると出力されます。この場合、識別子の種類は出力できません。 このメッセージを生成するコードの例を次に示します。
1 #include <stdio.h> 2 void Function( struct IamNotDefined *b) { } 3 4 int counter = 0; 5 main() 6 { 7 } 8 9 void Function( ) 10 { 11 }
メッセージ ID: E_DUBIOUS_ID_REDEFINED
コンパイラが、外部的に定義されたオブジェクトまたは関数の再定義を検出しました。本来の外部名は #pragma redefine_extname の使用によって変更され、コンパイラは新しい外部名の再定義を検出しました。 このメッセージを生成するコードの例を次に示します。
1 #pragma redefine_extname fold fnew 2 3 fold () 4 { 5 } 6 7 fnew () 8 { 9 } 10 11 main () 12 { 13 }-#
メッセージ ID: E_FUNC_REDEFINED_THROUGH_PRAGMA
構造体宣言が作成されましたが、宣言されたオブジェクトが対象となるマシンにとって大きすぎます。 このメッセージを生成するコードの例を次に示します。
typedef int Not_that_big_array[0x10000000]; struct { Not_that_big_array m1,m2,m3,m4,m5,m6,m7,m8; }
メッセージ ID: E_STRUCT_SIZE_TOO_BIG
キーワード struct もしくは union に続くタグが無いか、それらのタグが、この #pragma より前にあるはずの struct もしくは union 宣言を参照できません。このメッセージを生成するコードの例を次に示します。
/* struct bar はまだ定義されていません */ void foo() { #pragma alias_level strict (struct bar) return; }
メッセージ ID: E_ALIAS_NO_TAG
通知された識別子はこの pragma での使用前に struct として定義されている必要があります。 このメッセージを生成するコードの例を次に示します。
union bar { int field;}; void foo() { #pragma alias_level strict (struct bar) return;}
メッセージ ID: E_ALIAS_NOT_A_STRUCT
通知された識別子はこの pragma での使用前に union として定義されている必要があります。 このメッセージを生成するコードの例を次に示します。
struct bar { int field;}; void foo() { #pragma alias_level strict (union bar) return; }
メッセージ ID: E_ALIAS_NOT_A_UNION
通知された識別子はこの pragma での使用前に enum として定義されている必要があります。 このメッセージを生成するコードの例を次に示します。
/* enum bar はまだ定義されていません */ void foo() { #pragma alias_level strict (enum bar) return; }
メッセージ ID: E_ALIAS_NOT_AN_ENUM
通知された識別子はこの pragma での使用前にポインタとして定義されている必要があります。 このメッセージを生成するコードの例を次に示します。
int bar; void foo() { #pragma alias_level strict (bar) return; }
メッセージ ID: E_ALIAS_EXPECTING_POINTER
このメッセージで通知された識別子は pragma で使われる前に構造体として宣言されていません。 このメッセージを生成するコードの例を次に示します。
enum abc {one, two}; #pragma alias_level strict (struct abc)
メッセージ ID: E_ALIAS_STRUCT_LIE
このメッセージで通知された識別子は pragma で使われる前に共用体として宣言されていません。このメッセージを生成するコードの例を次に示します。
enum abc {one, two}; #pragma alias_level strict (union abc)
メッセージ ID: E_ALIAS_UNION_LIE
このメッセージで通知された識別子は pragma で使われる前に列挙型として宣言されていません。このメッセージを生成するコードの例を次に示します。
struct abc {int field;}; #pragma alias_level strict (enum abc)
メッセージ ID: E_ALIAS_ENUM_LIE
通知された pragma で型以外のものが渡されています。#pragma alias および alias_level は型を指定します。 このメッセージを生成するコードの例を次に示します。
int i; #pragma alias_level strict (i)
メッセージ ID: E_ALIAS_EXPECTING_TYPE
通知された識別子は、pragma で参照される前に変数として宣言されている必要があります。 このメッセージを生成するコードの例を次に示します。
int myfunc(); #pragma alias (myfunc)
メッセージ ID: E_ALIAS_EXPECTING_VARIABLE
alias_level pragma 次のような書式です:
#pragma alias_levelこのメッセージを生成するコードの例を次に示します。( [, ]... ) #pragma alias_level ( [, ]... )
#pragma alias_level std (
メッセージ ID: E_IGNORE_BAD_ALIAS_LEVEL_PRAGMA
alias pragma は次のような書式です:
#pragma alias (このメッセージを生成するコードの例を次に示します。[, ]... ) #pragma alias ( , [, ]... )
#pragma alias (
メッセージ ID: E_IGNORE_BAD_ALIAS_PRAGMA
alias pragma は次のような書式です:
#pragma noalias (このメッセージを生成するコードの例を次に示します。[, ]... ) #pragma noalias ( , [, ]... )
#pragma alias (
メッセージ ID: E_IGNORE_BAD_NOALIAS_PRAGMA
may_point_to pragma は次のような書式です:
pragma may_point_to (このメッセージを生成するコードの例を次に示します。, [, ]... )
#pragma may_point_to (
メッセージ ID: E_IGNORE_BAD_MAYPTTO_PRAGMA
may_not_point_to pragma は次のような書式です:
pragma may_not_point_to (このメッセージを生成するコードの例を次に示します。, [, ]... )
#pragma may_not_point_to (
メッセージ ID: E_IGNORE_BAD_MAYNOTPTTO_PRAGMA
may_not_point_to および may_point_to pragmas は次のような書式です:
pragma may_not_point_to (このメッセージを生成するコードの例を次に示します。, [, ]... ) pragma may_point_to ( , [, ]... )
int i, j; #pragma may_point_to ( i, j);
メッセージ ID: E_POINTTO_NOT_A_POINTER
文字列リテラルおよび文字定数では \ の後には特定の文字だけが続きます; \' \" \? \\ \a \b \f \n \r \t \v \<8 進数> \x<16 進数>。 ANSI C は \ を無視します。 このメッセージを生成するコードの例を次に示します。
int i = '\c';
メッセージ ID: E_DUBIOUS_ESCAPE_MBCHAR
エイリアシングプラグマはファイルスコープまたは関数スコープのみで使用できます。 このメッセージを生成するコードの例を次に示します。
struct s1 {...}; struct s2 {...}; main() { { #pragma alias (struct s1, struct s1) } }
メッセージ ID: E_IGNORE_BAD_SCOPE_FOR_PRAGMA
関数プロト型の不完全な配列型の代わりにパラメータとしてポインタを使用してください。 このメッセージを生成するコードの例を次に示します。
main() { extern somefunc(void array[]); }
メッセージ ID: E_ARRAY_OF_INCOMPLETE
関数プロト型の不完全な型の代わりにパラメータとしてポインタを使用してください。 このメッセージを生成するコードの例を次に示します。
struct xxx; extern lastfunc(struct xxx xs[]);
メッセージ ID: E_ARRAY_OF_INCOMPLETE_NONAME
自動変数宣言は、宣言されたオブジェクトがターゲットマシンのスタックに合わないように構築されます。 このメッセージを生成するコードの例を次に示します。
void foo(void) { int big_array[0x100000000LL]; }
メッセージ ID: E_AUTO_VARIABLE_TOO_BIG
-xalias_level で許可される最適化のエイリアス解析中に スカラーポインタを構造体ポインタへキャストすると、 定義されていない動作を起こすかもしれません。 このメッセージを生成するコードの例を次に示します。
struct foo { int a; }; struct foo *foop; int *p; void main() { foop = (struct foo *)p; }
メッセージ ID: E_CAST_SCALAR_TO_STRUCT
-xalias_level で許可される最適化のエイリアス解析中に、 void ポインタを構造体ポインタへキャストすると、 定義されていない動作を起こすかもしれません。 このメッセージを生成するコードの例を次に示します。
struct foo { int a; }; struct foo *foop; void *p; void main() { foop = (struct foo *)p; }
メッセージ ID: E_CAST_VOID_PTR_TO_STRUCT
-xalias_level で許可される最適化のエイリアス解析中に、 構造体フィールドを構造体ポインタへキャストすると、定義され ていない動作を起こすかもしれません。 このメッセージを生成するコードの例を次に示します。
struct foo { int a; }; struct foo *foop; int *p; void main() { p = (int *)&foop.a }
メッセージ ID: E_CAST_SCALAR_STRUCT_TO_SCALAR
-xalias_level=strict で許可される最適化のエイリアス解析中に、 ポインタを 2 つの別名解除された構造体にキャストすると、 定義されていない動作を起こすかもしれません。 このメッセージを生成するコードの例を次に示します。
struct fooa { int a; }; struct foob { int b; }; struct fooa *fooaa; struct foob *foobb; void main() { fooaa = (struct fooa *)foobb; }
メッセージ ID: E_CAST_STRUCT_TO_STRUCT
-xalias_level が weak およびそれ以上の場合に許可される 最適化のエイリアス解析中に、 スカラーポインタをスカラーへキャストすると、定義され ていない動作を起こすかもしれません。 このメッセージを生成するコードの例を次に示します。
int *ip; long *lp; void main() { ip = (int *)lp; }
メッセージ ID: E_CAST_SCALAR_TO_SCALAR
-xalias_level が weak およびそれ以上の場合に許可される 最適化のエイリアス解析中に、 非スカラーポインタをスカラーポインタへキャストすると、定義され ていない動作を起こすかもしれません。 このメッセージを生成するコードの例を次に示します。
int *ip; long a[10]; void main() { ip = (int *)a[3]; }
メッセージ ID: E_CAST_NONSCALAR_TO_SCALAR
threadprivate 指令はファイルスコープに、つまりすべての定義および 宣言の外になければなりません。 このメッセージを生成するコードの例を次に示します。
int i; void main() { #pragma omp threadprivate(i) }
メッセージ ID: E_OMP_NONFILE_THREADPRIV
threadprivate 指令リスト中の各変数は、ファイルスコープ宣言をもつ必要があります。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp threadprivate(i) }
メッセージ ID: E_OMP_AUTO_THREADPRIV
threadprivate 指令は、そのリスト内の変数へのすべての参照よりも (構文的に) 前に存在する必要があります。 このメッセージを生成するコードの例を次に示します。
int i; void foo() { i = 10; } #pragma omp threadprivate(i)
メッセージ ID: E_OMP_THREADPRIV_REF
threadprivate、firstprivate、lastprivate および非公開変数は、 不完全な型をもっていてはいけません。 このメッセージを生成するコードの例を次に示します。
struct S s; #pragma omp threadprivate(s) struct S { int i; } void foo() { #pragma omp parallel private(s) { } }
メッセージ ID: E_OMP_VAR_INCOMPLETE
threadprivate 変数は、非公開、firstprivate、lastprivate、および 共有または縮約された節では使用できません。しかしデフォルトの節の影響は 受けません。 このメッセージを生成するコードの例を次に示します。
int i; #pragma omp threadprivate(i) void main() { #pragma omp parallel private(i) i++; }
メッセージ ID: E_OMP_THREADPRIV_WRONG_CLAUSE
変数を 2 つ以上の節に指定することはできません。ただし、firstprivate 節と lastprivate 節の両方に指定することはできます。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel private(i) copyin(i) i++; }
メッセージ ID: E_OMP_DUP_CLAUSE
非公開 (または lastprivate) 節中で指定された変数は、定数指定の型を もっていてはいけません。 このメッセージを生成するコードの例を次に示します。
void main() { const int ci; #pragma omp parallel private(ci) ; }
メッセージ ID: E_OMP_CONST_PRIVATE
並列領域内で非公開 (firstprivate/lastprivate) である変数は、囲まれたワークシェアリング指令または並列指令での private (firstprivate/lastprivate) 節に指定することはできません。このため、ワークシェアリング指令または並列指令で非公開として指定されている変数は、囲まれた並列領域内で共有する必要があります。 このメッセージを生成するコードの例を次に示します。
void main() { int i,j; #pragma omp parallel private(j) { #pragma omp for lastprivate(j) for (i=0; i<10; i++) j++; } }=======
メッセージ ID: E_OMP_PRIVATE_PRIVATE
初期設定子は、括弧の間に何も入っていません。 このメッセージを生成するコードの例を次に示します。
struct {int i;} = {};
メッセージ ID: E_EMPTY_INITIALIZER
このメッセージは、2 つのポインタの差が ptrdiff_t によりオーバーフローする 可能性がある場合に表示されます。 次の例で、char ポインタの差に対して、上記のメッセージが生成されます。int ポインタの差に対しては生成されないことに注意してください。
#includevoid foo(void){ char *pc1, *pc2; int * pi1, *pi2; ptrdiff_t ptrdiff; ptrdiff = pc1 - pc2; ptrdiff += pi1 - pi2; }
メッセージ ID: E_PTRDIFF_OVERFLOW
このメッセージは、OpenMP プラグマで一般構文エラーが検出されると表示されます。 このメッセージを生成するコードの例を次に示します。
void main() { #pragma omp parallel private { } }
メッセージ ID: E_OMP_SYNTAX_ERROR
このメッセージを生成するコードの例を次に示します。
void inline main() { int i; i = 1; }
メッセージ ID: E_INLINE_MAIN
このメッセージを生成するコードの例を次に示します。
inline void foo(); extern foo(); void main() { foo(); } =======
メッセージ ID: E_EXTERN_INLINE_UNDEFINED
コードに空の struct メンバー宣言が含まれています。 このメッセージを生成するコードの例を次に示します。
struct { int i;; } s;
メッセージ ID: E_EMPTY_MBR_DECLARATION
このメッセージは、OpenMP for プラグマの schedule 節に指定された 繰り返し数の式の書式が正しくない場合に表示されます。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel for schedule(static,1.0) for (i=0;i<10;i++) { } }
メッセージ ID: E_OMP_BAD_CHUNKSIZE
繰り返し数の値は意味を持たず、OpenMP for プラグマの実行時スケジュールでは 許可されていません。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel for schedule(runtime,1) for (i=0;i<10;i++) { } }
メッセージ ID: E_OMP_RUNTIME_CHUNKSIZE
schedule 節の種別は、static、dynamic、guided、runtime のうちのいずれかでなければなりません。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel for schedule(normal,1) for (i=0;i<10;i++) { } }
メッセージ ID: E_OMP_BAD_SCHEDULE_KIND
このメッセージを生成するコードの例を次に示します。
void foo() { static int j = 1; i += j; }
メッセージ ID: E_DEF_STATIC_INLINE_EXTERN
ANSI C 標準では、ラベルの後には文がなければなりません。 GNU C 拡張では、このような構文を許可しますが、それでもこの警告が 表示されます。また、-Xs オプションを使用すると、エラーになります。 このメッセージを生成するコードの例を次に示します。
void main() { some_label: }
メッセージ ID: E_LABEL_NO_STMT
識別子とオブジェクトのようなマクロ定義の置換リストの間に空白が必要です。このメッセージを生成するコードの例を次に示します。
#define THIS$AND$THAT(a, b) ((a) + (b)) int c = THIS$AND$THAT(1, 7);
メッセージ ID: E_NO_WHITE_SPACE
OpenMP parallel の if 節に指定された式は、スカラー型をもっている必要があります。 このメッセージを生成するコードの例を次に示します。
void main() { struct { int val; } true = {1}; #pragma omp parallel if(true) printf("Hello,worlds!\n"); }
メッセージ ID: E_OMP_BAD_IF_TYPE
OpenMP の for ループの初期値式は以下のような標準の形式をもっていなければなりません。
メッセージ ID: E_OMP_FOR_BAD_INIT
void main() {
int i=0;
#pragma omp parallel for
for (; i<10; i++) {
}
}
OpenMP for ループのインデックス変数の値は符号付き整数型である必要があります。このメッセージを生成するコードの例を次に示します。
void main() { unsigned char c; #:pragma omp parallel for for (c=0; c<10; c++) { } }
メッセージ ID: E_OMP_FOR_BAD_INDEX_TYPE
OpenMP の for ループの制御式は、以下の標準の形式でなくてはなりません: メッセージ ID: E_OMP_FOR_BAD_CONTROL
void main() {
int i,j=0;
#pragma omp parallel for
for (i=0; j<10; i++) {
}
}
OpneMP の for ループの反復式は標準の形式をもっている必要があります。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel for for (i=0; i<10; foo(&i)) { } }
メッセージ ID: E_OMP_FOR_BAD_ITER
copyin 節に指定する変数は、threadprivate 変数でなければなりません。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel copyin(i) i++; }
メッセージ ID: E_OMP_COPYIN_NOT_THREADPRIVATE
C99 では、次の新しいキーワードが使用されます。 inline、 restrict、 _Bool、 _Complex、および _Imaginary。このメッセージを生成するコードの例を次に示します。
int _Bool;
メッセージ ID: E_KEYWORD_IN_C99
可変長配列はサイズ指定なしで ([*] として) 宣言できます。 このような宣言は、関数プロト型スコープ付きの宣言でのみ使用できます。 このメッセージを生成するコードの例を次に示します。
int foo (int a[*]) { typedef int A[*]; }
メッセージ ID: E_UNSPEC_VLA_SIZE
可変的に修正された型はファイルスコープで宣言できません。 このメッセージを生成するコードの例を次に示します。
int n; typedef int A[n]; int a[n];
メッセージ ID: E_CANT_DECL_FILESCOPE_VM
識別子を、静的記憶期間をもつオブジェクトとして宣言すると、可変長配列型をもつことはできません。 このメッセージを生成するコードの例を次に示します。
int foo(int n) { static int a[n]; }
メッセージ ID: E_STATIC_VLA
通常の識別子だけが可変的に修正された型をもつことができます。構造体メンバーおよび共用体メンバーは、そのような型をもつことができません。 このメッセージを生成するコードの例を次に示します。
void foo() { int n; struct s { int a[n];}; }
メッセージ ID: E_MEMBER_CANT_BE_VM
配列サイズを指定する式は、整数型をもっていなくてはなりません。 このメッセージを生成するコードの例を次に示します。
void foo() { int a[1.1]; float f; int b[f]; }
メッセージ ID: E_ARRAY_SIZE_NONINTEGER
配列サイズ式に指定できるのは、静的キーワードだけです。 このメッセージを生成するコードの例を次に示します。
int a[extern 3];
メッセージ ID: E_BAD_ARRSIZE_STORAGE_CLASS
配列サイズ式に指定できるのは、静的キーワードと型修飾子 (const、restrict、および volatile) のみです。 このメッセージを生成するコードの例を次に示します。
int a[int 3];
メッセージ ID: E_ARRSIZE_TYPE_SPECIFIER
オプションの型修飾子および静的キーワードは、配列型を持つ関数パラメータの 宣言、および最も外側の配列型の派生でのみ使用できます。 このメッセージを生成するコードの例を次に示します。
int a[static 3]; int bar(int[*][restrict]);
メッセージ ID: E_CANT_QUAL_NONPARAM_ARY
可変長配列はサイズ指定なしで ([*] として) 宣言できます。 このような宣言は、関数プロト型スコープ付きの宣言でのみ使用できます。 このメッセージを生成するコードの例を次に示します。
int foo () { int i = sizeof(int[*]); }
メッセージ ID: E_UNSPEC_VLA_SIZE_NONAME
OpenMP for 構文および OpenMP parallel 構文の後には、ループ文が必要です。 このメッセージを生成するコードの例を次に示します。
int foo() { #pragma omp parallel for while(1) { } }
メッセージ ID: E_OMP_FOR_WITHOUT_FOR
式中で使用される、void への型ポインタ、または関数へのポインタの引数があります。void または関数のサイズは、1 と想定されます。 このメッセージを生成するコードの例を次に示します。
void *mem = (void*)7, *retval; int sz = 4; retval = mem + sz;
メッセージ ID: E_PTR_TO_VOID_IN_ARITHMETIC
#warning 指令中のトークンは、有効な C トークンでなければ なりません。 ソースプログラムに無効なトークンが含まれています。 このメッセージを生成するコードの例を次に示します。
#warning 038 - this is an invalid token
メッセージ ID: E_BAD_TOKEN_IN_WARN_DIRECTIVE
#warning 指令がソースファイル中で見つかりました。指令中のほかのトークンが、メッセージの一部として 出力されます。 このメッセージを生成するコードの例を次に示します。
#define ONE 2 #if ONE != 1 #warning ONE != 1 #endif
メッセージ ID: E_WARNING_PRAGMA
goto 文は、可変的に修正された型をもつ識別子のスコープ外から、その識別子の スコープ内にジャンプできません。 このメッセージを生成するコードの例を次に示します。
void foo() { int n = 10; { int a[n]; vla_scope: a[n-1] = 0; } goto vla_scope; }
メッセージ ID: E_GOTO_INTO_VLA_SCOPE
OpenMP 指令フラッシュおよび barrier は文ではないので、ラベルをつけることはできません。 このメッセージを生成するコードの例を次に示します。
void foo() { int i; wrong_label: #pragma omp barrier i++; }
メッセージ ID: E_OMP_LABELED_DIRECTIVE
縮約節に指定される変数は、囲んでいるコンテキスト内で共有される必要があります。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel private(i) #pragma omp sections reduction(+:i) { i++; } }
メッセージ ID: E_OMP_REDUCTION_NOTSHARED
縮約節に指定される変数は定数指定の型をもつことはできません。 このメッセージを生成するコードの例を次に示します。
void main() { const int ci; #pragma omp parallel reduction(+:ci) ; }
メッセージ ID: E_OMP_CONST_REDUCTION
縮約節に指定される変数の型は、ポインタの型が使えない場合を除き、縮約演算子に対して有効でなければなりません。 このメッセージを生成するコードの例を次に示します。
void main() { float f; #pragma omp parallel reduction(^:f) ; }
メッセージ ID: E_OMP_REDUCTION_BADTYPE
このメッセージを生成するコードの例を次に示します。
extern int foo(int i) { i++; return i; } inline int foo(int i);
メッセージ ID: E_INLINE_DEFINED_EXTERN
このメッセージを生成するコードの例を次に示します。
inline int foo() { return 5; } extern foo(void);
メッセージ ID: E_INLINE_DEFINED_INLINE
このメッセージは、OpenMP プラグマで一般構文エラーが検出されると表示されます。 このメッセージを生成するコードの例を次に示します。
#pragma STDC L_FENV_ACCESS ON /* "on" ではなく、"ON" が使用されている */
メッセージ ID: E_STDC_SYNTAX_ERROR
restrict 修飾子は、ポインタ型にのみ有効です。ポインタ型以外の 型は、restrict で修飾することはできません。 このメッセージを生成するコードの例を次に示します。
restrict int a;
メッセージ ID: E_NON_PTR_CANT_RESTRICT_QUAL_2
順序づけられた OpenMP 指令は、順序づけられた節が指定されていない for 指令の動的範囲内にあってはなりません。 このメッセージを生成するコードの例を次に示します。
void main() { int i, a = 0; #pragma omp for for (i=0; i<10; i++) { #pragma omp ordered a+=i; } }
メッセージ ID: E_OMP_NONORDERED_FOR
順序づけられた OpenMP 指令は、順序づけられた節をもつ for 構文、または parallel-for 構文の動的範囲内になくてはなりません。 このメッセージを生成するコードの例を次に示します。
void main() { int i, a = 0; for (i=0; i<10; i++) { #pragma omp ordered a+=i; } }
メッセージ ID: E_OMP_ORDERED_NOFOR
OpenMP 指令セクションは、セクション指令の字句範囲内になくてはなりません。このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel { #pragma omp section i++; } }
メッセージ ID: E_OMP_SECTION_NO_SECTIONS
デフォルトの節に使用できる値は none または shared のみです。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel default(private) { i++; } }
メッセージ ID: E_OMP_BAD_DEFAULT
Pragma alias_level は、pragma を介して設定された別名レベルが翻訳単位の残りすべてに適用されるので、ファイルスコープでのみ意味を持ちます。 このメッセージを生成するコードの例を次に示します。
struct s1 {...}; struct s2 {...}; foo() { #pragma alias_level strict (struct s1, struct s2) }
メッセージ ID: E_FILE_SCOPE_ALIAS_LEVEL_PRAGMA
前処理演算子 _Pragma はマクロ定義を使用して定義し直すことができます。 ただし、このようにして再定義すると、_Pragma 演算子が完全に無効になります。 このメッセージを生成するコードの例を次に示します。
#define _Pragma printf("Pragma\n")
メッセージ ID: E_PP_PRAGMA_REDEFINED
前処理演算子 _Pragma は引数を 1 つとり、この引数は単一の文字列リテラル である必要があります。 このメッセージを生成するコードの例を次に示します。
_Pragma("omp", "parallel") _Pragma("omp" "parallel")
メッセージ ID: E_PP_PRAGMA_ARG_MISMATCH
同じ名前の critical 指令を互いに入れ子にすることはできません。 このメッセージを生成するコードの例を次に示します。
void main(void) { #pragma omp critical(foo) #pragma omp critical(foo) ; }
メッセージ ID: E_OMP_BAD_CRITICAL_NESTING
宣言の前に文を置くことはできません。 このメッセージを生成するコードの例を次に示します。
void main(void) { int i = 1; i++; int j = i; }
メッセージ ID: E_DECLARATION_IN_CODE
for 文の初期化部は、式の文でなければなりません。 このメッセージを生成するコードの例を次に示します。
void main(void) { for (int i = 1; i<10; i++); }
メッセージ ID: E_DECLARATION_IN_FOR
for 文の宣言部では、記憶クラス auto または register の変数しか宣言できません。 このメッセージを生成するコードの例を次に示します。
void main(void) { for (static int i = 1; i<10;) i++; }
メッセージ ID: E_BAD_STORAGE_IN_FOR_DECL
配列宣言子キーワード内の修飾子として static を使用する場合は、そのあとに 配列サイズの式を指定する必要があります。この式は省略できません。 このメッセージを生成するコードの例を次に示します。
void foo (int a[static]);
メッセージ ID: E_INVALID_STATIC_VLA_QUAL
#include 指令で指定されたファイルの読み取りアクセス権がありません。 このメッセージを生成するコードの例を次に示します。
#include "noperm.h"
メッセージ ID: E_CANT_ACCESS_INCLUDE_FILE
#include 指令で指定されたファイルは、すでに開かれているファイル数が多すぎて 開くことができません。 このメッセージを生成するコードの例を次に示します。
#include __FILE__
メッセージ ID: E_TOO_MANY_FILES
ライセンスを取得しようとしているときに、またはライセンスに関する情報を 取得しようとしているときに問題が発生しました。
メッセージ ID: E_LICENSE_ERROR
変数の宣言に明示的な型指定子が含まれていないため、暗黙の int が 指定されているものとみなされます。 このメッセージを生成するコードの例を次に示します。
static a;
メッセージ ID: E_NO_EXPLICIT_TYPE_GIVEN
パラメータの宣言に明示的な型指定子が含まれていないため、暗黙の int が指定されているものとみなされます。 このメッセージを生成するコードの例を次に示します。
void fux(a) { /* body */ }
メッセージ ID: E_NO_TYPE_FOR_OLDSTYLE_PARAM
暗黙的の関数宣言は許されなくなりました。 このメッセージを生成するコードの例を次に示します。
/* No #includehere */ void main(void) { printf("Hello world!\n"); }
メッセージ ID: E_NO_IMPLICIT_DECL_ALLOWED
構造体/共用体でない初期化子のコンテキストで構造体/共用体フィールド名が 使用されていました。 このメッセージを生成する初期化子の例を次に示します。
int a[10] = {.field=1}
メッセージ ID: E_DESIG_INIT_FIELD
配列初期化子の指定されたインデックスが、定数値ではありません。 このメッセージを生成する初期化子の例を次に示します。
int i; int a[10] = {[i]=1}
メッセージ ID: E_DESIG_INIT_INDEX_CONST
配列初期化子の指定インデックスを使用して、配列でない型の変数を初期化しました。 このメッセージを生成する初期化子の例を次に示します。
int a = {[5]=1}
メッセージ ID: E_DESIG_INIT_NON_ARRAY
識別子が宣言されましたが、同じ識別子について以前に行われた宣言と矛盾 しているか、同じスコープで 2 回宣言されています。 K&R C の以前のリリースでは、2 つの型が同じに「近い」ときは (たとえば、SPARC における int と long など)、 矛盾する再宣言が許されていました。 しかし、ANSI C ではこのような型は 異なるものと見なされます。
int x; static long x;
メッセージ ID: E_IDENTIFIER_REDECLARED_STATIC
オペランドに & が適用される場合、そのオペランドの型は void 以外のものである必要があります。 このメッセージを生成するコードの例を次に示します。
void *p; *p = &*p;
メッセージ ID: E_TAKING_ADDRESS_OF_VOID
関数パラメータを struct、 union、または enum で宣言しましたが、型が不完全です。 このメッセージを生成するコードの例を次に示します。
typedef struct foo { void (*function)(struct foo bar); } foobar;
メッセージ ID: E_INCOMPLETE_PARAMETER
__thread キーワードは extern または static 変数に適用できます。 しかし、自動変数に適用しても効果はありません。 このメッセージを生成するコードの例を次に示します。
int foo() { __thread int i; }
メッセージ ID: E_BAD_STORAGE_THREAD_IGNORED
式の文には、次の形式のうちのいずれかが存在する必要があります。 x binop= expr, x++, x--, ++x, --x. ここで、x はスカラー型の lvlalue 式です。 binop は、次のいずれかです。 +, *, -, /, &, ^, |, << or >>. expr はスカラー型の式であり、x で指示されたオブジェクトを参照しません。このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp atomic i = i+1; }
メッセージ ID: E_OMP_BAD_ATOMIC_EXPR
1999 ISO C 標準は、整定数の型宣言の規則を変更します。 コンパイラは、ANSI 標準の規則で別の型が設定されている整定数に 対してこのメッセージを生成します。 このメッセージを生成するコードの例を次に示します。
long long a = 2147483648;
メッセージ ID: E_C99_INTEGER_PROMOTION
コンパイラは、パラメータが多すぎる #pragma を検出しました。 余分のパラメータは無視されます。 このメッセージを生成するコードの例を次に示します。
#pragma MP taskloop maxcpus (2) savelast
メッセージ ID: E_IGNORE_EXTRA_PRAGMA_PARAMS
{float|double|long double} の配列を含む小さな構造が、v9 の関数から パラメータとして渡されるかまたは値として戻されるものとして検出されました。小さな構造は、関数からの 16 バイトの引数から 32 バイトの戻り値までを含んでいます。
typedef struct { double tf[4]; } t_st; t_st myfunc(t_st arg) { t_st rv; return rv; }
メッセージ ID: E_FLTARRSMLSTRUCT
演算子の左にあるオペランドが、左辺値を生成できない式になっています。通常、 構造体を返す関数の戻り値を変更しようとすると、このメッセージが出力されます。 このメッセージを生成するコードの例を次に示します。
struct s { int ia[10];}; struct s sf(void); f(void){ sf().ia[0] = 3; }
メッセージ ID: E_L_OPERAND_DOT_NOT_LVALUE_NOW
omp プラグマ構文に続く文が必要とされています。 このエラーの原因となるコードの例を次に示します。
{ #pragma omp master }
メッセージ ID: E_OMP_NO_STATEMENT
parallel for 内のループ制御で使用される変数は、暗黙的に非公開と宣言されます。このため、shared() 節はこのような変数には何の効果もありません。 このメッセージを生成するコードの例を次に示します。
void main() { int i,j; #pragma omp parallel for shared(i,j) for (i=0; i<10; i++) j = i; printf("i=%d\tj=%d\n",i,j); }
メッセージ ID: E_OMP_SHARED_CONTROL_VAR
このメッセージを生成するコードの例を次に示します。
main() { float f; f = 0x1.ffffffp0f; }
メッセージ ID: E_CNV_HEX_CONST_EVAL_FMT
OpenMP parallel の num_threads 節に指定された式は整数型をもっている必要があります。 このメッセージを生成するコードの例を次に示します。
void main() { struct { int val; } true = {1}; #pragma omp parallel num_threads(true) printf("Hello,worlds!\n"); }
メッセージ ID: E_OMP_BAD_NUM_THREADS_TYPE
このメッセージを生成するコードの例
void foo() { int i; #pragma STDC FP_CONTRACT OFF }
メッセージ ID: E_STDC_PRAGMA_WRONG
OpenMP parallel の num_threads 節に指定された式は、正の整数でなければなりません。 このメッセージを生成するコードの例
void main() { #pragma omp parallel num_threads(-1) printf("Hello,worlds!\n"); }
メッセージ ID: E_OMP_NEGATIVE_NUM_THREADS
並列領域内で非公開である変数は、並列構文にバインドされた、分業指令上の縮約された節内に指定することはできません。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel private(i) #pragma omp sections reduction(+:i) { i++; } }
メッセージ ID: E_OMP_CANT_BE_IN_PRIVATE
並列指令の縮約された節に現れる変数は、並列構文にバインドされた、分業指令上の縮約された節内に指定することはできません。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel reduction(+:i) #pragma omp sections reduction(+:i) { i++; } }
メッセージ ID: E_OMP_CANT_BE_IN_REDUCTION
OpenMP section 指令には一連の section 指令が含まれ、各指令のあとには文が 1 つ続きます。 しかし、最初の section 指令は省略される可能性があります。
void foo() { int i,j; #pragma omp parallel sections private(i, j) { i++; i = i + 1; j++; } }
メッセージ ID: E_OMP_BAD_SECTION_STATEMENT
ファイルスコープ変数の threadprivate 指令は、ファイルスコープに記述する必要があります。 ブロックスコープ変数の threadprivate 指令は、入れ子になったスコープではなくこの変数のスコープ内に記述する必要があります。 このメッセージを生成するコードの例を次に示します。
extern int x; void main() { #pragma omp threadprivate(x) static int i; { #pragma omp threadprivate(i) } }
メッセージ ID: E_OMP_THREADPRIV_WRONG_SCOPE
threadprivate 指令リスト内の各変数は、ファイルスコープ宣言または静的なブロックスコープ宣言をもたなければなりません。 このメッセージを生成するコードの例を次に示します。
void foo(int i) { #pragma omp threadprivate(i) int j; #pragma omp threadprivate(j) }
メッセージ ID: E_OMP_STATIC_THREADPRIV
不可分式の右辺は、左辺の実体を引用してはなりません。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp atomic i += i; }
メッセージ ID: E_OMP_ATOMIC_EXPR_REFERENCE
ファイルシステムのエラーのために、コンパイラは a.cpch ファイルを開くことができませんでした。 現在の作業ディレクトリに対する読み取り/書き込みの権限があるかを確認してください。
メッセージ ID: E_CANT_OPEN_PCH_FILE
コンパイル済みヘッダーを通して再使用できるコード部を識別する場合、初期共通ソースの最後は #pragma hdrstop または -xpchstop=filename でマークする必要があります (filename にはプログラムソース内で #include の 1 つに結合しているものと同じ名前を指定する)。
メッセージ ID: E_NO_PCH_STOP_POINT
#include 指令よりも前に #pragma hdrstop または -xpchstop を使用すると、コンパイル済みヘッダーの使用が無効になります。
メッセージ ID: E_HDRSTOP_BEFORE_INCLUDE
PCH ファイルの一部として使用される予定のヘッダーファイル内に関数を定義することはできません。 このエラーを生成するコードの例
int foo() { return 1; }
メッセージ ID: E_CANT_INIT_IN_PCH
指令の中にはプリコンパイル済みヘッダーを使用する場合に無効なものがあります。そのような指令が使用されると、エラーが生成されます。 このエラーの原因となるコードの例を次に示します。
#line 1 #error "error message" #file "file.h" #warning "warning message" #assert system (unix) #unassert system
メッセージ ID: E_PCH_INVALID_DIRECTIVE
プリコンパイル済みヘッダーを生成する場合、ヘッダーファイル内に定義済みマクロ __DATE__ と __TIME__ を使用することはできません。
メッセージ ID: E_PCH_INVALID_PREDEFINED
プリコンパイル済みヘッダーを収集または使用する場合、コンパイルされたヘッダーの接頭部内で定義済みマクロ __LINE__ と __FILE__ を使用することはできません。
メッセージ ID: E_PCH_PREFIX_PREDEFINED
マジックナンバーが認識されなかったため、この PCH ファイルは使用できません。
メッセージ ID: E_PCH_FILE_UNUSABLE_MAGIC
PCH バージョン番号が不正なため、この PCH ファイルは使用できません。 現在のコンパイラを使用して PCH ファイルを再生成する必要があります。
メッセージ ID: E_PCH_FILE_UNUSABLE_VERSION
PCH ファイルの作成時に使用されたものと -D または -U オプションが正確に一致しなかったため、このPCH ファイルは使用できません。
メッセージ ID: E_PCH_FILE_UNUSABLE_DEFS
PCH ファイルの作成時に使用されたものとこれらのコマンド行オプションが正確に一致しなかったため、このPCH ファイルは使用できません。
メッセージ ID: E_PCH_FILE_UNUSABLE_OPS
当初の前処理指令 (#include 指令など) が PCH ファイルの作成時に使用されたものと正確に一致 (コメントを除く) しなかったため、この PCH ファイルは現在のソースファイルで使用できません。
メッセージ ID: E_PCH_FILE_UNUSABLE_PREFIX
このメッセージを生成するコードの例を次に示します。
void foo() { int i; #pragma omp parallel { #pragma omp single copyprivate(i) ; } }
メッセージ ID: E_OMP_COPYPRIV_MUST_BE_PRIVATE
このメッセージを生成するコードの例を次に示します。
int main() { int i = 42; #pragma omp single nowait copyprivate(i) { i++; } }
メッセージ ID: E_OMP_COPYPRIV_WITH_NOWAIT
この inline キーワードが有効なのは、関数識別子に適用される場合だけです。 このエラーを生成するコードの例
inline int i; main() { inline float f[10]; }
メッセージ ID: E_INLINE_NEEDS_FUNC
関数の宣言が以前のインライン関数定義と矛盾しています。 このメッセージを生成するコードの例を次に示します。
inline int func(int i) { return ++i } static int func();
メッセージ ID: E_INLINE_FUNC_REDECL_STATIC
このメッセージを生成するコードの例を次に示します。
void main(void) { int a=1, b=0, c=0; (a ? b : c) = 5; }
メッセージ ID: E_ASSIGNMENT_TO_COND_EXPR
このメッセージを生成するコードの例を次に示します。
int *a = &(int[]){10, 20};
メッセージ ID: E_NONC99_COMPOUND_LITERAL
構造体型の関数の配列メンバーをポインタに代入しようとしていますが、 次の副作用完了点を過ぎてもこの代入の結果が定義されていません。 このメッセージを生成するコードの例を次に示します。
main() { int *i; i = foo().bar; printf("i is %d\n", *i); }
メッセージ ID: E_ASG_ARY_TO_PTR
inline キーワードの使用法が正しくありません。 このメッセージを生成するコードの例を次に示します。
int foo(inline int);
メッセージ ID: E_INLINE_INVALID_USE
++ および -- 演算子の演算対象は、整数型、実数型、またはポインタ型でなければなりません。 このメッセージを生成するコードの例を次に示します。
double _Complex dc = 1.0 + 2.0 * _Imaginary_I; dc++; // ここでエラーとなる double _Imaginary di = 2.0 * _Imaginary_I; --di; // ここでエラーとなる
メッセージ ID: E_OPERAND_MUST_BE_REAL_OR_PTR
このメッセージを生成するコードの例を次に示します。
static int bar(); inline int foo() { static int i; return i + bar(); } 変数 'i' と関数 'bar' に対する参照が両方とも無効です。
メッセージ ID: E_REF_STATIC_EXTERN_INLINE
型識別子 Complex/Imaginary が不完全です。 このメッセージを生成するコードの例
_Complex c = 1.1 + 2.2 * _Imaginary_I; _Imaginary i;
メッセージ ID: E_INCOMPLETE_COMPLEX_IMAGINARY
浮動小数点演算が無効です。
メッセージ ID: E_FP_INVALID
浮動小数点演算によってオーバーフローが発生します。
メッセージ ID: E_FP_OVERFLOW
浮動小数点演算によってアンダーフローが発生します。
メッセージ ID: E_FP_UNDERFLOW
0 による除算です。
メッセージ ID: E_FP_DIVISION_BY_ZERO
_Imaginary 型に変換された実数型は _Imaginary 型の 0.0 となります。 このメッセージを生成するコードの例を次に示します。
double d = 1.0; double _Imaginary di = d; // ここで警告が発生する: di gets 0
メッセージ ID: E_REAL_CONV_TO_ZERO
実数型に変換された _Imaginary 型は実数型の 0.0 となります。 このメッセージを生成するコードの例を次に示します。
double _Imaginary di = _Imaginary_I; double d = di; // ここで警告が発生する: d gets 0
メッセージ ID: E_IMAGINARY_CONV_TO_ZERO
OpenMP の反復式は、制御式と一貫性がなければなりません。 反復のための論理式が <= ならば、反復値は増加されなければなりません。(>= の場合は減少)。 このメッセージを生成するコードの例を次に示します。
void main() { int i; #pragma omp parallel for for (i=0; i<10; i--) { } }
メッセージ ID: E_OMP_FOR_INCONSIST_ITER
16 ビットの文字列リテラルはほかの 16 ビット文字列リテラルとしか連結できません。 このメッセージを生成するコードの例を次に示します。
unsigned short *s = U"abc" "def";
メッセージ ID: E_CANT_CONCAT_MIXED_UTF_STRINGS
この警告を生成するコードの例を次に示します。
unsigned short bar[] = U"é";
メッセージ ID: E_ASCII_UTF16_USHORT_CHAR_ERR
デバッガから修正継続機能を使用する場合は、-xcrossfile フラグは無視されます。
メッセージ ID: E_X_CROSSFILE_IGNORED
このエラーを生成するコードの例を次に示します。
static __symbolic int i;
メッセージ ID: E_LDSCOPE_FOR_EXTERN_ONLY
このエラーを生成するコードの例を次に示します。
__symbolic void rescopedcl(); __global void rescopedcl();
メッセージ ID: E_NEW_LDSCOPE_MUST_BE_HIGHER
このエラーを生成するコードの例を次に示します。
__symbolic void rescopedef() { } __hidden void rescopedef();
メッセージ ID: E_NO_LDSCOPE_AFTER_DEFN
このエラーを生成するコードの例を次に示します。
int i; #include "file.h" #pragma hdrstop main() { }
メッセージ ID: E_PCH_BAD_VIABLE_PREFIX
ビットフィールドの宣言で、負の数のビットが指定されています。 このメッセージを生成するコードの例を次に示します。
struct s { int x:-3 };
メッセージ ID: E_BIT_FLD_SIZE_LESS_ZERO
ビットフィールドの宣言で、サイズが 0 に指定されています。 このメッセージを生成するコードの例を次に示します。
struct s { int x:1; int y:0; };
メッセージ ID: E_BIT_FLD_SIZE_EQUAL_ZERO
OpenMP 並列構造とワークシェアリング構造の後には、構造体ブロックが続く必要があります。構造体ブロックは、1 つの入り口と 1 つの出口を持つ文です。構造体ブロックに入ったり、構造体ブロックから出たりする文を使用することはできません。 このメッセージを生成するコードの例を次に示します。
int foo() { goto label_1; #pragma omp parallel { label_1: ; } }
メッセージ ID: E_OMP_STRUCTBLK_BREAKING_IN
OpenMP 並列構造とワークシェアリング構造の後には、構造体ブロックが続く必要があります。構造体ブロックは、1 つの入り口と 1 つの出口を持つ文です。構造体ブロックに入ったり、構造体ブロックから出たりする文を使用することはできません。つまり、構造体ブロックには、制御をブロックから別の場所に移すような return、goto、break、continue などの文は使用できません。 このメッセージを生成するコードの例を次に示します。
int foo() { #pragma omp parallel { return; } }
メッセージ ID: E_OMP_STRUCTBLK_BREAKING_OUT
OpenMP データスコープ節で TLS 変数を使用することはできません。ただし、デフォルトの節の影響は受けません。 このメッセージを生成するコードの例を次に示します。
__thread int i; void main() { #pragma omp parallel private(i) i++; }
メッセージ ID: E_OMP_TLS_WRONG_CLAUSE
配列初期化子の指示に使われる添え字を使用して、配列ではない型の変数を初期化しました。 このメッセージを生成する初期化子の例を次に示します。
int a = {[5]=1};
メッセージ ID: E_DESIG_INIT_NONARRAY
配列初期化子の指示に使われている添え字が、定数値でも整数型でもありません。 このメッセージを生成する初期化子の例を次に示します。
int i; int a[10] = {[i]=1};
メッセージ ID: E_DESIG_INIT_INDEX_NONCONST
配列初期化子の指示に使われている添え字が配列の範囲外です。 このメッセージを生成する初期化子の例を次に示します。
int a[10] = {[20]=1};
メッセージ ID: E_DESIG_INIT_INDEX_BOUND
構造体/共用体ではない初期化子のコンテキストで構造体/共用体フィールド名が使用されていました。 このメッセージを生成する初期化子の例を次に示します。
int a[10] = {.field=1};
メッセージ ID: E_DESIG_INIT_NONSTRUCT
非 C99 モードで C99 ISO の指示付きの初期化子構文が使用されています。 このメッセージを生成する初期化子の例を次に示します。
int a[10] = {.field=1};
メッセージ ID: E_DESIG_INIT_DISABLED
ユーザー定義データ (入力またはコマンド行オプションから得られるデータなど) を printf 型の関数の書式引数として渡す場合は、書式文字列に意図しない %n 指定子がないようにします。%n の展開は、セキュリティ上の注意すべき点として、よく知られているものです。 このエラーを生成するコードの例を次に示します。
(void) fprintf(stderr, fmt, i1, i2, i3);
メッセージ ID: E_SEC_PRINTF_VAR_FMT
書式にサイズ制限のない %s 指定子があると、書式化された引数がバッファよりも大きい場合に、バッファオーバーフローになる可能性があります。 このエラーを生成するコードの例を次に示します。
(void) sprintf(buf, "%s", string);
メッセージ ID: E_SEC_SPRINTF_UNBOUNDED_COPY
ユーザー定義データ (入力またはコマンド行オプションから得られるデータなど) を scanf 型の関数の書式引数として渡す場合は、書式文字列に意図しない %n 指定子がないようにします。%n の展開が安全面で問題になることはありません。 このエラーを生成するコードの例を次に示します。
(void) fscanf(stdin, fmt, &i1, &i2, &i3);
メッセージ ID: E_SEC_SCANF_VAR_FMT
書式に非結合 %s 指定子があると、書式化された引数がバッファよりも大きい場合に、バッファオーバーフローになる可能性があります。 このエラーを生成するコードの例を次に示します。
(void) scanf("%s", string);
メッセージ ID: E_SEC_SCANF_UNBOUNDED_COPY
strcpy() を使用して文字列をコピーすると、バッファが小さすぎて、コピー元のバッファの内容を保持できない場合に、コピー先のバッファがオーバーフローすることがあります。コピー先に十分な大きさのバッファを確保するか、strlcpy() を使用してください。 このエラーを生成するコードの例を次に示します。
(void) strcpy(dst, src);
メッセージ ID: E_SEC_STRCPY_WARN
ライブラリ関数 strncpy() は、十分な空き領域がない場合にコピー先の文字列を NUL で終了しないため、使用するのが難しい関数です。strlcpy() にはこの制限がないため、通常は、こちらの方が適しています。 例外が 1 つあります。それは、ディスク上にある構造体を更新する場合で、この場合は、strncpy() がコピー先バッファの未使用の領域を NUL で埋めるという事実が前提になります。 このエラーを生成するコードの例を次に示します。
(void) strncpy(dst, src, size);
メッセージ ID: E_SEC_STRNCPY_WARN
strncat() では、呼び出す前に残りの領域を計算する必要があるため、使用を推奨しません。 strlcat() の方がより簡単で、安全に使用できます。 このエラーを生成するコードの例を次に示します。
(void) strncat(dst, src, size);
メッセージ ID: E_SEC_STRNCAT_WARN
gets() を安全に使用できる状況はありません。提供されるバッファのサイズに関する情報がないため、常にバッファオーバーフローの危険性があります。fgets() を使用してください。 このエラーを生成するコードの例を次に示します。
(void) gets(buf);
メッセージ ID: E_SEC_FORBIDDEN_WARN_GETS
cftime() は、結果を保持するのに十分な大きさのバッファがあることを前提にしています。この関数は環境 (CFTIME) から情報をインポートするため、提供したバッファに結果が格納できるかどうかは確実ではありません。代わりに strftime() を使用してください。 このエラーを生成するコードの例を次に示します。
(void) cftime(buf, fmt, clock);
メッセージ ID: E_SEC_FORBIDDEN_WARN_CFTIME
ascftime() は、結果を保持するのに十分な大きさのバッファがあることを前提にしています。この関数は環境 (CFTIME) から情報をインポートするため、提供したバッファに結果が格納できるかどうかは確実ではありません。代わりに strftime() を使用してください。 このエラーを生成するコードの例を次に示します。
(void) ascftime(buf, fmt, time);
メッセージ ID: E_SEC_FORBIDDEN_WARN_ASCFTIME
creat() はシンボリックリンクの攻撃に弱い関数です。すなわち、作成するファイル名がシンボリックリンクとしてすでに存在している場合、creat() はそのシンボリックリンクをたどり、それが示す場所にファイルを作成します。このため、ファイルを安全に作成することができません。 このエラーを生成するコードの例を次に示します。
fd = creat(fname, mode);
メッセージ ID: E_SEC_FORBIDDEN_WARN_CREAT
bcopy() または memcpy() を使用した文字列のコピーでは、正しいサイズを計算しておく必要があるため、エラーが起きやすくなります。このため、代わりに strlcpy() の使用を推奨します。 このエラーを生成するコードの例を次に示します。
char *src, dst; ... (void) bcopy(dst, src, len);
メッセージ ID: E_SEC_BCOPY_WARN
rand() 系の関数は、比較的脆弱な乱数ジェネレータを実装しています。より強固な乱数が望ましい場合は、/dev/random または /dev/urandom インタフェースを利用してください。 このエラーを生成するコードの例を次に示します。
i = rand();
メッセージ ID: E_SEC_RAND_WARN
同じオブジェクト (ディレクトリ) を扱う別の関数とこの関数を組み合わせて使用すると、パス名の競合状態になる可能性があります。代わりに fchdir() を使用してください。 このエラーを生成するコードの例を次に示します。
(void) chdir(dirname);
メッセージ ID: E_SEC_CHDIR_WARN
ライブラリやプログラムから、ユーザー提供のパス名でこの関数を呼び出さないでください。ユーザー提供のメッセージカタログを利用して、権限が必要なコードを簡単に破ることができます。 このエラーを生成するコードの例を次に示します。
(void) catopen(fname, flag);
メッセージ ID: E_SEC_CATOPEN_WARN
この関数のパラメータは、後で実行時リンカーのパスを使用して検出されるパス名か、ユーザー入力 (argv[0] を含む) から絶対に得られることのない完全なパス名だけにしてください。 dlopen() 関数が復帰する前に _init() 関数が実行されるため、ユーザー提供の共有オブジェクトを安全に開く方法がないことに注意してください。 このエラーを生成するコードの例を次に示します。
dlopen(fname, dlopen_mode);
メッセージ ID: E_SEC_DLOPEN_WARN
この関数は複数のファイルを開きます。安全であることが分かっているパス名のみ使用してください。
メッセージ ID: E_SEC_PATH_WARN
chroot() された環境は、ほとんどの場合で保護を提供されません。 chroot された環境で権限が必要なプログラムを実行していないことを確認し、必ず、chroot() の後で新しいルートの下のポイントに chdir() してください。
メッセージ ID: E_SEC_CHROOT_WARN
getenv() によって返される値は慎重に扱ってください。完全にユーザーの制御下にあり、大量の (最大 NCARGS ( メッセージ ID: E_SEC_GETENV_WARN
getlogin() の使用は避けてください。その出力は信頼できません。マルチスレッドに対して安全ではありません。代わりに getlogin_r() を使用してください。どちらの場合も、返されたログインは信頼できません。uid を使用するか、代わりのユーザー認証方法を用意してください。
メッセージ ID: E_SEC_GETLOGIN_WARN
mkdir() に使用されるパスをユーザー入力から得る場合は、そのパスが安全であることを確認してください。
メッセージ ID: E_SEC_MKDIR_WARN
パス名の生成とその open() での使用との間に競合状態があるため、生成されたパス名が安全である保証はありません。代わりに「fd = mkstemp(template);」を使用してください。
メッセージ ID: E_SEC_MKTEMP_WARN
この関数は、そのジョブを実行をするためにシェル (/bin/sh) を呼び出す子プロセスを作成します。シェルの子プロセスの生成には、$PATH、$IFS などの環境変数が必要であり、安全に使用することは困難です。また、シェルは引数に存在する特殊文字を解釈することを忘れないでください。
メッセージ ID: E_SEC_SHELL_WARN
ユーザー指定の \"namelist\" 引数を受け付ける場合は、その引数を使用する前に必ず権限を無効にしてください。
メッセージ ID: E_SEC_KVM_WARN
必ず、シンボリックリンクの内容が提供バッファに対して大きすぎる場合の対処をしてください。
メッセージ ID: E_SEC_READLINK_WARN
セキュリティ保護するアプリケーションでは getpass() の使用を避けてください。 最大 256 文字の長さのパスワードを返すことができるため、getpassphrase() の方を推奨します。
メッセージ ID: E_SEC_GETPASS_WARN
パス名の生成とその open() での使用との間に競合状態があるため、生成されたパス名が安全である保証はありません。代わりに mkstemp() を使用してください。
メッセージ ID: E_SEC_TEMPNAM_WARN
この関数は、マルチスレッドアプリケーションで危険な umask() を呼び出します。
メッセージ ID: E_SEC_TMPFILE_WARN
ファイルの名前空間内のオブジェクトを操作するため、この関数はパス名競合状態になりがちです。この関数に提供されるオブジェクトは、以前または以降の呼び出しで提供されるオブジェクトと異なることがあります。これは、それらの呼び出しの間でファイルシステムが変化していることによります。
メッセージ ID: E_SEC_TRUNCATE_WARN
ユーザー定義の umask を変更するため、umask() の使用は避けてください。open 系の関数でファイル作成モードを使用することを検討してください。
メッセージ ID: E_SEC_UMASK_WARN
セキュリティ保護するアプリケーションでの utmpname() の使用は避けてください。代わりにデフォルトの utmp ファイル名を使用してください。
メッセージ ID: E_SEC_UTMP_WARN
API が難しいため、select() を使用したプログラミングは間違いやすく、セキュリティ面においていくつか問題が発生することが判明しています。 poll() のインタフェースの方がより使用しやすく、制約も少なくて高速です。
メッセージ ID: E_SEC_SELECT_WARN
この関数を使用して文字列をコピーすると、バッファが小さすぎて、コピー元のバッファの内容を保持できない場合に、コピー先のバッファがオーバーフローすることがあります。必ずコピー先に十分な大きさのバッファを確保してください。
メッセージ ID: E_SEC_EXPAND_WARN
プロセスが現在の real-uid を受け付け、必要がある場合は、ファイルを開く前にその real-uid に切り替えるようにしてください。ファイルシステムのオブジェクトの属性を変更する必要がある場合は、でれきば、fchown()/fchmod() と一緒に open () を使用してください。
メッセージ ID: E_SEC_CHMOD_WARN
execvp() および execlp() は $PATH によって、実行する適切なバイナリを検出し、$PATH はしばしばユーザーの制御下にあります。代わりに execl() か execv()、execve() を使用してください。
メッセージ ID: E_SEC_EXEC_PATH
別のアプリケーション を exec() する前に、必ず環境から不要なものを削除し、重要なすべてのファイル記述子を閉じておいてください。
メッセージ ID: E_SEC_EXEC_WARN
これは安全面で重要です。ループ内でバッファに入力を付加するときは境界を確認してください。境界の計算が間違っていたり、なかったりすると、バッファオーバーランになることがあります。決して、ユーザー入力が固定長であると考えないでください。境界や符号の有無などを確認してください。
メッセージ ID: E_SEC_LOOP_WARN
この関数が返す情報は、実際に操作できる頃までには古くなっています。このため、安全に使用することはできません。access() の後に open() を使用すると、解消できない競合状態になります。 代わりに、 意図するユーザーのアクセス権付きで open() を使用してください。
メッセージ ID: E_SEC_ACCESS_WARN
O_EXCL なしで、 O_CREAT だけ付けて open() を呼び出した場合、open() はパス名の最後の要素としてシンボリックリンクを辿ります。このため、意図していなかった場所にユーザーがファイルを作成できる可能性があります。
メッセージ ID: E_SEC_CREAT_WITHOUT_EXCL
必ずファイル作成モードを指定してください。できる限りアクセス権を限定し (通常は、現在のユーザーのみ)、必要に応じて後で拡張するようにしてください。さもないと、作成したファイルに望ましくないユーザーアクセスが行われる可能性があります。
メッセージ ID: E_SEC_CREAT_WITHOUT_MODE
この関数では、新しいファイルに対してアクセス権を指定できません。パス名がすでに存在すること、あるいはディレクトリが一般書き込み可能でないことを確認してください。代わりに open()/fdopen() シーケンスを使用してください。
メッセージ ID: E_SEC_FOPEN_MODE
stat 系の呼び出しが完了した後、不正なユーザーによってファイルシステムオブジェクトが変更され、競合状態が発生する可能性があります。代わりに fstat() を使用してください。
メッセージ ID: E_SEC_USE_AFTER_STAT
ユーザー定義データ (入力またはコマンド行オプションから得られるデータなど) を glob() の引数として渡す場合は、入力の妥当性を検査して、文字列の書式に誤りがないこと、セキュリティ面の脅威にならないことを確認してください。拡張記号の「..」「/」「-」や空白、その他の特殊文字がないかどうかを確認してください。
メッセージ ID: E_SEC_GLOB_WARN
複合リテラルで使用する型名は、オブジェクト型か不明なサイズの配列のいずれかにします。 このメッセージを生成するコードの例
int i = (struct UNKNOWN) { 1 };
メッセージ ID: E_INCOMPLETE_COMPOUND_LITERAL
1999 ISO C では、\u および \U のエスケープシーケンスは汎用文字名を示します。 このメッセージを生成するコードの例を次に示します。
char *cp = "This is a ucn: \u0020";
メッセージ ID: E_ESC_U_IS_C99_UCN
1999 ISO C の仕様では、\u の後に 4 桁の 16 進数、\U の後に 8 桁の 8 進数が必要です。 このメッセージを生成するコードの例を次に示します。
char *cp = "&\u00fz";
メッセージ ID: E_BAD_NUM_OF_DIGITS_IN_UCN
識別子のこの汎用文字名は、1999 ISO C で規定されている制限に違反しており、有効ではありません。 このメッセージを生成するコードの例を次に示します。
int i\uFFFF;
メッセージ ID: E_INVALID_UCN_FOR_ID
この汎用文字名は有効ではありません。 このメッセージを生成するコードの例を次に示します。
int i\u0033;
メッセージ ID: E_INVALID_UCN_VALUE
1990 ISO C では、配列のサイズ式に整定数以外の式を使用することはできません。 1999 ISO C では、これは可変長の配列になることに注意してください。 このメッセージを生成するコードの例を次に示します。
void foo() { int a[(int)(5.0+1.0)]; }
メッセージ ID: E_C90_NON_INTEGRAL_ARRAY_SIZE
PCH ファイルを作成または使用する場合、ソースファイルの活性文字列は、必ず条件付きコンパイルコードの外部で終了する必要があります。 たとえば、cc -xpch=collect:FOO -DFOO は、このメッセージを生成するコードです。
#ifdef FOO #include "foo.h" #pragma hdrstop #else #include "bar.h" #pragma hdrstop #endif main() {}
メッセージ ID: E_PCH_CONDITIONAL_PREFIX
この PCH ファイルは使用できません。PCH ファイルの生成に使われたコンパイラと、現在のコンパイラが異なります。
メッセージ ID: E_PCH_FILE_UNUSABLE_COMP_VERS
この PCH ファイルは使用できません。現在のソースパスと、PCH ファイルを作成したときに有効なソースパスが異なります。相対パスが使用されているなどであり、その場合、異なるヘッダーファイルが取り込まれる可能性があります。このことは、このコンパイルで PCH ファイルの内容が有効でなくなることを意味します。
メッセージ ID: E_PCH_FILE_UNUSABLE_SRC_PATH
この PCH ファイルは使用できません。現在の作業用ディレクトリと、PCH ファイルを作成したときに有効なディレクトリが異なります。この結果、異なるヘッダーファイルが取り込まれる可能性があり、このことは、このコンパイルで PCH ファイルの内容が有効でなくなることを意味します。
メッセージ ID: E_PCH_FILE_UNUSABLE_CWD
この警告は、-xcrossfile または -xipo オプションを使用してコンパイラを起動したときに 表示されます。extern 変数として宣言済みの変数は、static として 再宣言できません。 このメッセージを生成するコードの例を次に示します。
extern int local_i; void main(int argc, char *argv[]) { return local_i; } static int local_i=10;
メッセージ ID: E_CANT_XCROSSFILE_GLOBSTATIC
thread 変数の最初の宣言には、__thread 指定子を含める必要があります。 このメッセージを生成するコードの例を次に示します。
int i; __thread int i;
メッセージ ID: E_NONTHREAD_THREAD_REDECL
#line 指令に指定する行番号は、C99 モードの場合 2147483647 以下、C90 モードの場合 32767 以下である必要があります。 このメッセージを生成するコードの例を次に示します。
#line 2147483647 "string" #line 2147483648
メッセージ ID: E_OUT_OF_RANGE_POUND_NUMBER
すでに使用された名前を redefine_extname プラグマを再定義しようとしています。
void main(){ foo6(1,1); } #pragma redefine_extname foo6 foo6_1
メッセージ ID: E_REDEF_EXTNAME_INCORRECT
外部リンケージを指定して宣言された変数を、値によって変わり得る型にすることはできません。 このメッセージを生成するコードの例を次に示します。
void foo() { int n; extern int (*a)[n]; }
メッセージ ID: E_EXTERN_VM
実浮動小数点型 (float、double、long double など) である必要がオペランドを使用する演算子が使用されているにもかかわらず、たとえば int 型が使われようとしています。 このメッセージを生成するコードの例を次に示します。
#includeint foo() { double _Complex c; return fpclassify(c); }
メッセージ ID: E_OPERAND_MUST_BE_REAL_FLOAT
構造体は、個数が定義されていない配列をメンバーとして持つことができます。しかし、そうした構造体、および、そうした構造体をメンバーとして (場合によっては再帰的に) 含む共用体を、別の構造体のメンバーにすることはできません。 このメッセージを生成するコードの例
struct A {int xa; int ya[];}; struct B {int xb; struct A yb;};
メッセージ ID: E_STRUCT_DERIVED_FROM_FLEX_MBR
構造体は、個数が定義されていない配列をメンバーとして持つことができます。しかし、そうした構造体、および、そうした構造体をメンバーとして (場合によっては再帰的に) 含む共用体を、配列として宣言することはできません。 このメッセージを生成するコードの例
struct A {int xa; int ya[];}; struct A n[10];
メッセージ ID: E_ARY_DERIVED_FROM_FLEX_MBR
-I ファイルパスオプションで指定されたディレクトリに対するアクセス権がありません。
メッセージ ID: E_CANT_ACCESS_INCLUDE_DIR
可変長アレイの初期化は許可されていません。 このメッセージを生成するコードの例を次に示します。
void foo() { int n; int x[n] = { 1 }; }
メッセージ ID: E_CANT_INIT_VLA2
<、 >、<=、>= などの演算子は、複素数や虚数に使用できません。 このメッセージを生成するコードの例:
int foo(float _Complex parm1, float _Complex parm2) { return (parm1 > parm2); } int foo(float _Imaginary parm1, float _Imaginary parm2) { return (parm1 < parm2); }
メッセージ ID: E_OPERANDS_INVALID_TO_BIN_RELOP
nowait 句を含む OpenMP 縮約ループの使用には注意してください。同期が行われるまで、縮約変数値が不定になります。 このメッセージを生成するコードの例:
#pragma omp for reduction(+:s) private(i) nowait for (i=0; i<*p;i++) s += a[i];
メッセージ ID: E_NOWAIT_REDUCTION_USE
整数に浮動小数点を代入すると、暗黙で小さい型に変換されるか、精度が失われる可能性があります。 このメッセージを生成するコードの例を次に示します。
int i; double d; d = 2.78; i = d; // ここで警告
メッセージ ID: E_ASSIGMENT_CAUSE_LOSS_PREC
var args 組み込み関数が、不正な個数の引数を付けて明示的に参照されています。
メッセージ ID: E_VAR_ARG_PARAM_NUM
var args 組み込み関数が、不正な型の引数を付けて明示的に参照されています。
メッセージ ID: E_VAR_ARG_PARAM_TYPE
c99 プラグマの書式が不正です。#pragma c99 である必要があります (\"key_to_switch\")。 このメッセージを生成するコード例
#pragma c99 (bubble)
メッセージ ID :E_PRAGMA_C99_BAD_FORMAT
検出された関数呼び出しに、パラメータ型の情報がありません。 このメッセージを生成するコード例
#pragma warn_missing_parameter_info int foo(); foo(3.1416); // ここで警告
メッセージ ID: E_NO_MISSED_PARAMS_ALLOWED
ポインタ演算式の結果が、ptrdiff_t 型のオブジェクトで表現可能な値をオーバーフローすると判定可能な場合、コンパイラはこの警告を発行します。 このメッセージを生成するコード例
int foo (int *a) { return a[536870912]; } int foo2 (int a) { int *ptr = &a; ptr = ptr + 536870912; return *ptr; }
メッセージ ID: E_ADDR_EXPR_OVERFLOW
U 文字リテラルには、1 文字しか含められません。 このメッセージを生成するコード例
int i = U'AB';
メッセージ ID: E_UTF16_CHAR_LIT_TOO_BIG
SunIR ファイルにプロシージャまたはその他情報を書き込もうとしたときにエラーが発生しました。
メッセージ ID: E_IR_FILE_WRITE_ERR
SunIR ファイルに出力する SunIR の作成中にエラーが発生しました。
メッセージ ID: E_IR_PREP_FOR_OUTPUT
SunIR プロシージャの最小化に失敗しました。
メッセージ ID: E_IR_MINIMIZE_ERR
SunIR ファイルに出力するデバッグ情報の作成中にエラーが発生しました。
メッセージ ID: E_IR_DBG_PREP_ERR
プラグマ struct_align で使用されている名前が、ユーザー定義型名として事前に定義されていなかったことを意味します。 このメッセージを生成するコード例
int foo() { #pragma struct_align 16 (unknown) /* ここで警告 */ struct tagUNKNOWN { int x; int y; } unknown; unknown.x = 12345; unknown.y = 56789; return 0; }
メッセージ ID: E_PRAGMA_STRUCT_ALIGN_UNDECL
プラグマ struct_align で使用されている名前が構造体/共用体あるいは typedef 構造体/共用体のどれでもないことを意味します。 このメッセージを生成するコード例
int foo() { long double err; #pragma struct_align 16 (err); /* ここで警告 */ typedef unsigned long myulong; #pragma struct_align 16 (myulong); /* ここにもう 1 つ */ .... .... return 0; }
メッセージ ID: E_PRAGMA_STRUCT_ALIGN_BAD_TYPE
#pragma align/struct_align の値は、128 より大きくない正の 2 の累乗値である必要があります。 align プラグマの構文は次のとおりです。 #pragma align integer (id [, id...]) struct_align プラグマの構文は次のとおりです。 #pragma struct_align integer (struct/union tag) このメッセージを生成するコード例
#define ANO 129 #pragma align ANO (astruct)
struct q; #pragma struct_align 123 (q)正しい例:
#define MAX 128 #pragma align MAX (astruct, aint, aptr)
メッセージ ID: E_BAD_PRAGMA_ALIGNMENT_VALUE
-xmodel=medium が指定されていて、large セクション内への配置に関して、TLS オブジェクトが非 TLS オブジェクトと同じ条件を満たしていると、その TLS オブジェクトに関してエラーメッセージが生成されます。 このメッセージを生成するコード例
__thread int large_tls_array[16384] = { ...} // ここでエラー __thread int large_tls_array[16384]; // ここでエラー
メッセージ ID: E_TLS_USED_WITH_MODEL_MEDIUM
openmp データ節内の名前が変数ではありません。 このメッセージを生成するコード例
typedef struct{ int x; int y; }st1; #pragma omp parallel private(st1) // ここでエラー { .... }
メッセージ ID: E_OMP_DATA_CLAUSE_INVALID_NAME
threadprivate 指令内でループ制御変数を使用することはできません。 このメッセージを生成するコード例
static int i = 0; #pragma omp threadprivate (i) #pragma omp parallel for for (i = 0; i < 4; i++) { // ここでエラー .... }
メッセージ ID: E_OMP_THREADPRIV_CONTROL_VAR
pragma redefine_extname によって再定義された名前が静的と宣言されています。 このメッセージを生成するコードの例を次に示します。
1 #pragma redefine_extname fold fnew 2 3 static int fold() 4 { 5 return 1; 6 } 7 8 main () 9 { 10 }
メッセージ ID:E_PRAGMA_REDEFINE_STATIC
asm 文には volatile 修飾子のみ許容されます。 このメッセージを生成するコードの例を次に示します。
__asm__ unsigned (...) /* ここで致命的エラー */
メッセージ ID:E_ASM_INVALID_QUALIFIER
出力パラメータは左辺値でなければなりません。 このメッセージを生成するコードの例を次に示します。
__asm__ ("..." : "w" (10) : ...)
メッセージ ID:E_ASM_OUTPUT_PARAM_MUST_BE_LVAL
アセンブラ文に未定義の名前付きパラメータがあります。 このメッセージを生成するコードの例を次に示します。
asm ("addl %2, %[out]" : [out1] "=a" (b) : "0" (b), "Z" (3));
メッセージ ID:E_ASM_UNDEF_NAMED_PARAM
名前付きパラメータリストで \"]\" が抜けています。 このメッセージを生成するコードの例を次に示します。
asm ("addl %2, %[out" : [out1] "=a" (b) : "0" (b), "Z" (3));
メッセージ ID:E_ASM_NAMED_PARAM_LOST_BRACKET
void 型の文の式の結果は参照できません。void 型に明示的にキャストする必要があります。 このメッセージを生成するコードの例を次に示します。
int f(int i) { int j; j = ({ int t = -1; if (i > 10) { t = 1; } else { t = 0; } }); printf("文の式の結果は %d\n", j); }
メッセージ ID:E_VOID_STMT_EXPR_NOT_IGNORED
同一のシンボルについてリンカースコープが複数回指定されています。最後のスコープが有効になります。 このメッセージを生成するコードの例を次に示します。
void __symbolic foo() __attribute__((visibility("global"))); /* ここで警告: 実際のスコープは "global" になる */
メッセージ ID:E_MULTIPLE_LDSCOPE_SPECIFIED
属性に不正なパラメータがあります。 このメッセージを生成するコードの例を次に示します。
void __attribute__((visibility(__hidden__))) foo(); /* 属性の "visibility" パラメータは string である必要がある */ void __attribute__((visibility("blablabla"))) foo(); /* 属性の "visibility" パラメータは、hidden、internal、protected、default のいずれかである必要がある */
メッセージ ID:E_ATTRIBUTE_BAD_PARAM
属性が不明なため、無視されます。 このメッセージを生成するコードの例を次に示します。
int c __attribute__((visibi("hidden"))); // ここで警告
メッセージ ID:E_ATTRIBUTE_UNKNOWN
この属性を関数に適用することはできません。 このメッセージを生成するコードの例を次に示します。
int __attribute__((aligned(8))) f(); // ここで警告
メッセージ ID:E_ATTRIBUTE_NOT_FUNC
この属性を型に適用することはできません。 このメッセージを生成するコードの例を次に示します。
struct s { int i; } __attribute__((visibility("hidden"))); // ここで警告
メッセージ ID:E_ATTRIBUTE_NOT_TYPE
この属性を変数に適用することはできません。 このメッセージを生成するコードの例を次に示します。
int (*f)() __attribute__((noreturn)); // ここで警告: ポインタは変数
メッセージ ID:E_ATTRIBUTE_NOT_VAR
属性パラメータが未定義の識別子です。 このメッセージを生成するコードの例を次に示します。
int ddd __attribute__((cleanup(f))); // ここで警告: f は事前に定義されている必要がある
メッセージ ID:E_ATTRIBUTE_PARAM_UNDEFINED
typeof 演算子がビットフィールドに適用されています。 このメッセージを生成するコードの例を次に示します。
struct foo { int i:4; int j:4; }; int main() { typeof(bar.i) j = 1; }
メッセージ ID:E_TYPEOF_ON_BITFIELD
文の式が関数の外で使用されました。 このメッセージを生成するコードの例を次に示します。
int i = ({1;});
メッセージ ID:E_STMT_EXPR_OUTSIDE_FUNC
'typeof' 演算子のオペランドが未定義です。 このメッセージを生成するコードの例を次に示します。
int a __attribute__((aligned(sizeof(__typeof(a)))));
メッセージ ID:E_TYPEOF_OPERAND_UNDEF
ファイルスコープに局所的なラベル宣言があります。 このメッセージを生成するコードの例を次に示します。
__label__ l; main() {}
メッセージ ID:E_LOC_LAB_FILE_SCOPE
出力制約に + と = の両方の制約修飾子を含めることはできません。 このメッセージを生成するコードの例を次に示します。
int var1; __asm__ ("nop" : "+=r" (var1));
メッセージ ID:E_ASM_PLUS_EQUAL_MODIFIERS_BOTH
複合リテラルは、定数ではなく、静的な初期化の直接の値として使用することはできません。複合リテラルは静的な初期化設定子リストのように扱われます。 このメッセージを生成するコードの例を次に示します。
static int i[] = (int[]) { 10, 20 };
メッセージ ID:E_STATIC_INIT_WITH_CMPLIT
aligned 属性値は 2 の累乗でなければなりません。 このメッセージを生成するコードの例を次に示します。
char * __attribute__((aligned(5))); // ここでエラー
メッセージ ID:E_BAD_ATTR_ALIGNED_VALUE
属性の "aligned" パラメータは整数定数でなければなりません。 このメッセージを生成するコードの例を次に示します。
int __attribute__((aligned(foo()));
メッセージ ID:E_ALIGNMENT_NOT_ICON
-Xc オプションを使用すると、ANSI C に厳密に準拠するプログラムでは使用できない特定のキーワードが使用されていた場合にメッセージが表示されます。 このメッセージを生成するコードの例を次に示します。
int f(int a) { __typeof(a) b; __asm(" nop "); }
メッセージ ID:E_KW_IS_AN_EXTENSION_OF_ANSI
__alignof__ 演算子を関数型に適用することはできません。 このメッセージを生成するコードの例を次に示します。
int i = __alignof__(int ());
メッセージ ID:E_CANT_TAKE_ALIGNOF_FUNC
__alignof__ 演算子を関数に適用することはできません。 このメッセージを生成するコードの例を次に示します。
int f(void); int i = __alignof__(f);
メッセージ ID:E_CANT_TAKE_ALIGNOF_FUNC_N
__alignof__ 演算子を void 型に適用することはできません。 このメッセージを生成するコードの例を次に示します。
void v(void); int i = __alignof__(v());
メッセージ ID:E_CANT_TAKE_ALIGNOF_VOID
__alignof__ 演算子をビットフィールドに適用することはできません。 このメッセージを生成するコードの例を次に示します。
struct s { int x:3; } st; int i = __alignof__(st.x);
メッセージ ID:E_CANT_TAKE_ALIGNOF_BIT_FIELD
"+" または "=" 修飾子を入力パラメータ制約で使用することはできません。 このメッセージを生成するコードの例を次に示します。
asm("nop" : "+r" (param1) : "+r" (param2));
メッセージ ID:E_ASM_WRONG_INPUT_CONSTR_MOD
定数変数を asm 出力パラメータとして使用することはできません。 このメッセージを生成するコードの例を次に示します。
void foo(void) { const int a = 5; asm("nop" : "=r"(a)); }
メッセージ ID:E_ASM_OUTPUT_PARAM_MUST_BE_MVAL
現在のシンボルは別のシンボルの別名として定義されています。 このメッセージを生成するコードの例を次に示します。
int f() __attribute__((alias("g"))); int f() { // ここでエラー return 0; }
メッセージ ID:E_ALIAS_REDEFINED
現在の宣言が実際には定義である場合、関数を別名として宣言することはできません。 このメッセージを生成するコードの例を次に示します。
int __attribute__((alias("g"))) f() { // ここで警告 return 0; }
メッセージ ID:E_DEF_ALIAS_IGNORED
入れ子になった文の式の内部に switch 文の case ラベルを配置することはできません。 このメッセージを生成するコードの例を次に示します。
int main() { int i=3; switch(i) { case 1: i++; i = ({ int j = i; j++; case 2: j+=({ int k=j; k+=(j+i); } ); } ); default: break; } }
メッセージ ID:E_MISSING_SWITCH_IN_STMT_EXPR
#if 指令または #elif 指令中の defined 演算子の直後には、識別子または括弧 () で囲んだ識別子を続ける必要があります。定義されているトークンがマクロ置換処理の結果として生成される場合、動作は未定義です。 このメッセージを生成するコードの例を次に示します。
#define CHECK defined #if CHECK FOO int i = 1; #endif
メッセージ ID:E_NONPORTABLE_USE_OF_DEFINE
ポインタに整数を加算する場合、またはポインタから整数を減算する場合、ポインタと計算結果はどちらも同じ配列オブジェクトの要素または同じ配列オブジェクトの最後の要素を 1 つ過ぎたところを指している必要があります。 このメッセージを生成するコードの例を次に示します。
void foo(int p) { (&p)[1] = 0; }
メッセージ ID:E_BAD_VAR_ADDRESS_ARITH
制約が m、o、v、p のいずれかのオペランドは、左辺値式でなければなりません。 このメッセージを生成するコードの例を次に示します。
int b; asm ("nop" : "m" (1, b));
メッセージ ID:E_CANNOT_TAKE_ADDRESS_ASM_PARAM
インライン asm 文の入力または出力パラメータが使用されていません。 このメッセージを生成するコードの例を次に示します。
asm ("nop" : m(output));
メッセージ ID:E_ASM_UNUSED_PARAM
同一の宣言内で複数の境界整列値が指定されている場合は、最大値が使用されます。 このメッセージを生成するコードの例を次に示します。
int __attribute__((aligned(128))) s __attribute__((aligned(64))); // ここで警告
メッセージ ID:E_CONFLICT_ALIGN_MODIFICATION
シンボルの境界整列に、その型の境界整列より小さい値を指定することはできません。 このメッセージを生成するコードの例を次に示します。
struct S { ... } __attribute__((aligned(128))); struct S s1 __attribute__((aligned(64))); // ここで警告
メッセージ ID:E_OBJECT_ALIGN_LESS_THAN_TYPE
宣言の境界整列に、その型の境界整列より小さい値を指定することはできません。 このメッセージを生成するコードの例を次に示します。
typedef int __attribute__((aligned(64))) ai64; int align = __alignof__(ai64 __attribute__((aligned(32)))); // ここで警告
メッセージ ID:E_CUR_ALIGN_LESS_THAN_BASE
ポインタの前の明示的な境界整列は無視されます。 このメッセージを生成するコードの例を次に示します。
int __attribute__((aligned(64))) * p; // ここで警告
メッセージ ID:E_USELESS_PTR_TO_ALIGNED
再宣言によって境界整列を変更することはできません。 このメッセージを生成するコードの例を次に示します。
int __attribute__((aligned(64))) a; int __attribute__((aligned(32))) a; // ここで警告
メッセージ ID:E_CONFLICT_ALIGN_REDECL_CURR
再宣言によって境界整列を変更することはできません。 このメッセージを生成するコードの例を次に示します。
static int __attribute__((aligned(64))) a; int __attribute__((aligned(32))) a; // ここで警告
メッセージ ID:E_CONFLICT_ALIGN_REDECL_PREV
パラメータにデフォルト以外の境界整列を設定することはできません。 このメッセージを生成するコードの例を次に示します。
typedef int __attribute__((aligned(128))) i128; void foo(i128 i1); // ここで警告
メッセージ ID:E_CANT_SET_NONDEF_ALIGN_PARAM
関数の戻り値型にデフォルト以外の境界整列を設定することはできません。 このメッセージを生成するコードの例を次に示します。
typedef int __attribute__((aligned(128))) i128; i128 foo(); // ここで警告 int __attribute__((aligned(64))) foo(); // ここで警告
メッセージ ID:E_CANT_SET_NONDEF_ALIGN_FUNC
自動変数にデフォルト以外の境界整列を設定することはできません。 このメッセージを生成するコードの例を次に示します。
typedef int __attribute__((aligned(128))) i128; void boo() { i128 i2; // ここで警告 ..... }
メッセージ ID:E_CANT_SET_NONDEF_ALIGN_AUTO