2016-10-04 16 views
2

なぜ最後の2行がstrlen()を使用して警告を引き起こすのか理解できません。コンパイラはこれらを無視してはいけませんか?strlenが符号なし文字配列と符号付き文字配列で使用されるときの警告

size_t len; 
char cstr[] = "char string"; 
signed char scstr[] = "signed char string"; 
unsigned char ucstr[] = "unsigned char string"; 

len = strlen(cstr); 
len = strlen(scstr); /* warns when char is unsigned */ 
len = strlen(ucstr); /* warns when char is signed */ 
+0

コンパイラがこれらを無視するのはなぜですか? 'char *'、 'signed char *'と 'unsigned char *'は互換性のない型です。正式には、これは「エラー」であり、「警告」ではありません。 – AnT

答えて

2

プロトタイプであるので:

size_tのSTRLEN(CONSTするchar * STR);

refに記載されている。

これらの行で暗黙の変換が行われているため、警告が表示されます。ここで続きを読む:How can I avoid gcc warning for plain "char" to : "unsigned char" OR "signed char" conversion?


ピート・ベッカーが述べたように:unsigned char

charは暗黙の型変換を伴うunsigned char*char*に、問題のコードのように、有効ではない、との診断が必要です。 "

+3

'char'を' unsigned char'に変換するには暗黙の変換が必要です。 'unsigned char *'と 'char *'は、質問のコードのように有効ではなく、診断が必要です。診断(この場合は警告)を出したら、コンパイラは実装固有の意味でコードをコンパイルし続けます。 –

+0

@PeteBecker。これがセキュリティ上の脆弱性を引き起こしますか – user2979872

+0

@PeteBeckerありがとう、私は答えにそれを注入した、あなたが気にしないなら、もちろん! :) – gsamaras

関連する問題