2016-01-30 4 views
11

は、私がスキャンセットの右角括弧]を閉じるのを忘れたとします。その後何が起こるでしょうか?それは未定義の振る舞いを呼び出しますか?スキャンセットを閉じるのを忘れるとどうなりますか?

例:コンパイルしたとき、私はGCCから警告を受ける

char str[] = "Hello! One Two Three"; 
char s1[50] = {0}, s2[50] = {0}; 
sscanf(str, "%s %[^h", s1, s2); /* UB? */ 
printf("s1='%s' s2='%s'\n", s1, s2); 

source_file.c: In function ‘main’: 
source_file.c:11:5: warning: no closing ‘]’ for ‘%[’ format [-Wformat=] 
    sscanf(str, "%s %[^h", s1, s2); /* UB? */ 

と私も気づいた

s1='Hello!' s2='' 

として出力そのsscanfリターン1しかし、ここでは何が起こっているのですか?

私はC11標準をチェックしますが、これに関連した情報を発見したしました。

答えて

5

素晴らしいです! C11の不具合報告を提出する必要があります!ここ

は、変換指定が最大と対応する右ブラケット(])を含む、書式文字列内のすべての後続の文字を含むC11 7.21.6.2

... に関連する部分です。左括弧の後の文字がスキャンセットがハットと右括弧の間にスキャンリストに表示されていないすべての文字が含まれている場合にはアクセント記号(^)、でない限り括弧(スキャンリスト)の間の文字は、スキャンセットを構成します。

ブラケット間文字の厳密な解釈が閉じ括弧の非存在下でこのような文字が存在しないことであるが、[後の最初の文字として^の存在下で、それが矛盾することになります。 gccは、ソースコードの間違いを指摘するほど親切です。実際の動作はCライブラリ実装によって決定されますが、C標準では指定されていないようです。それは、IMHOが実際に規格で文書化されるべきである、未定義の振る舞いの一形態です。

+0

ありがとうございます!どこに行くのか、どうやってやるのかわからないので、あなたは欠陥報告を提出することをお勧めします。 –

+1

私は、Cワーキンググループの秘書、Daniel Plakoshに電子メールを送りました。 – chqrlie

関連する問題