2016-05-03 6 views
0

Ich habe dieses C Programm.Kein Kompilierfehler, wenn die Funktion eine Variable vom falschen Typ zurückgibt

#include <stdio.h> 

unsigned char foo() 
{ 
    int x = 1000; 
    return x; 
} 

int main(int argc, char *argv[]) 
{ 
    printf("foo returns %d\n", foo()); 
} 

Ich verwende die folgenden es zu kompilieren:

gcc -c -g -o ../tgt/Linux/main.c.o -Wall -fpic main.c 
gcc ../tgt/Linux/main.c.o -g -o ../tgt/Linux/t -Wall 

Es erzeugt die folgende Ausgabe:

$ t 
foo returns 232 

Das sind die unteren 8 Bits von x in foo() ist. Also macht es Sinn. Aber meine Frage ist: Warum hat dies keine Warnung erzeugt und gibt es eine Möglichkeit für mich, Warnungen für diese Art von Fehlern zu generieren?

+6

Kompilieren Sie mit '-Wconversion' und Sie werden eine Warnung bemerken –

+2

@ AlterMann Danke Mann. Ich frage mich, warum nicht ausgelöst wird, wenn beide "pedantische" -Wall "-Wextra" verwenden. – jdarthenay

+0

Ein Zeichen ist eine kleine Ganzzahl in C. Sie erhalten keinen Fehler, wenn Sie das -Wconversion-Flag nicht wie @AlterMann sagt verwenden. –

Antwort

2

Im Kommentar Sie erwähnt:

Ich frage mich, warum in nicht ausgelöst, wenn beide -pedantic -Wall -Wextra verwenden.

-Wall lässt sich nicht auf die -Wconversion Flagge [1].

Weder -Wpedantic noch -pedantic würde fangen

return x; // This is valid as per strict ISO C 

In der Tat -pedantic überprüfen würde nur für alle GNU C-Erweiterungen [2].

Wenn Sie zum Beispiel unter Sachen kompilieren:

warning: ISO C90 forbids variable length array ‘b’ [-Wvla] 

die einzige Option ist also -Wconversion explizit zu verwenden, beim Kompilieren:

int a=10; 
int b[a]; // This is invalid as per strict ISO C 

mit -pedantic, gcc Sie geben sollten.

gcc -Wconversion main.c -o main