2016-01-30 11 views
11

Angenommen, ich habe vergessen, die rechte eckige Klammer ] eines Scansets zu schließen. Was wird dann passieren? Ruft es nicht definiertes Verhalten auf?Was passiert, wenn ich vergesse, einen Scanset zu schließen?

Beispiel:

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); 

ich eine Warnung von GCC erhalten beim Kompilieren:

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

und der Ausgang als

s1='Hello!' s2='' 

ich auch, dass die sscanf Rückkehr bemerkt habe 1 Aber was genau geht hier vor?

Ich habe den C11-Standard überprüft, aber keine Informationen dazu gefunden.

Antwort

5

Ausgezeichnet! Sie sollten einen Fehlerbericht für C11 einreichen!

Hier ist der relevante Teil in C11 7.21.6.2

... Der Konvertierungsspezifizierer umfasst alle nachfolgenden Zeichen in dem Format Zeichenfolge von bis zu und einschließlich der passende rechte Klammer (]). Die Zeichen zwischen den Klammern (die Scanliste) bilden den Scanset, es sei denn, das Zeichen nach der linken Klammer ist ein Zirkumflex (^). In diesem Fall enthält der Scanset alle Zeichen, die nicht in der Scanliste zwischen der Zirkumflex und der rechten Klammer stehen.

Eine strenge Auslegung von Die Zeichen zwischen den Klammern ist, dass in Gegenwart von ^ als erstes Zeichen nach [ wäre es inkonsequent in Ermangelung einer schließenden Klammer gibt es keine solchen Zeichen, aber sein . gcc ist freundlich genug, um den wahrscheinlichen Fehler im Quellcode anzuzeigen. Das tatsächliche Verhalten wird durch die Implementierung der C-Bibliothek bestimmt, scheint jedoch nicht im C-Standard angegeben zu sein. Als solches ist es eine Form von undefiniertem Verhalten, dass IMHO wirklich als solches im Standard dokumentiert werden sollte.

+0

Danke! Ich schlage vor, dass Sie einen Fehlerbericht einreichen, da ich nicht weiß, wo ich hingehen soll und wie ich es machen soll. –

+1

Ich habe eine E-Mail an Daniel Plakosh, den Sekretär der C-Arbeitsgruppe, geschickt. Ich werde Sie auf dem Laufenden halten. – chqrlie