Literales de cadena vs const char * en C

¿Por qué los comstackdores de ANSI C no marcan el uso de un argumento literal de cadena en una llamada de función en la que el parámetro correspondiente no tiene un calificador const? Por ejemplo, el siguiente código podría generar una excepción al intentar escribir para leer solo la memoria.

void somefunc(char buffer[10]); void somefunc(char buffer[10]) { int i; for (i = 0; i < 10; i++) buffer[i] = 0; } int main(int argc, char **argv) { somefunc("Literal"); return 0; } 

Esta situación podría identificarse en el momento de la comstackción, pero VS2010 y gcc no parecen hacerlo. Llamar a alguien con un argumento const char * generará una advertencia del comstackdor.

gcc: usa la bandera -Wwrite-strings

PD. El manual de gcc explica por qué esto no es parte de -Wall. De todos modos, como siempre, debe encontrar una combinación de banderas -W que se adapte a sus necesidades particulares y estilo de encoding. Por ejemplo, en un proyecto reciente he usado algo como esto: -Werror -Wall -Wextra -Wformat=2 -Winit-self -Wswitch-enum -Wstrict-aliasing=2 -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -Wdisabled-optimization -Wunused-macros -Wno-unused

Es un legado de K&R. Arreglarlo rompería un millón de progtwigs.

Lo que dijo Hans Passant. const se agregó como parte del estándar ANSI en 1989, por lo que cualquier cosa anterior no tenía const.

los literales de cadena no son const en C; en C ++ son.

Edición: para aclarar cualquier confusión sobre mi comentario, me refiero al tipo, no a la capacidad de cambiarlos realmente.

El comstackdor GNU (y también el comstackdor Intel C, iirc) emitirá una advertencia, si se usa -Wwrite-string :

 $ gcc -Wall -Wwrite-strings -o foo /tmp/foo.c /tmp/foo.c: In function 'main': /tmp/foo.c:12: warning: passing argument 1 of 'somefunc' discards qualifiers from pointer target type /tmp/foo.c:3: note: expected 'char *' but argument is of type 'const char *' 

En cuanto a VS2010, no puedo ayudarte.