Следующая программа вызывает системную ошибку сегментации из-за поведения undefined (пытается изменить строковый литерал):
int main() {
char *s = "immutable";
s[0] = 'a';
return 0;
}
Тем не менее, похоже, абсолютно невозможно сказать, что GCC/Clang излучает даже малейшее предупреждение об этом (-Wall -Wextra -pedantic -std=c11
ничего не делать).
Специально для новичков такая ситуация была бы полезной для информирования. Даже для не-новичков, в некоторых немного менее очевидных ситуациях это может быть полезно:
void f(char *s) {
s[0] = '0';
}
int main() {
char *s = "immutable";
f("literal"); // oops
f(s); // oops
return 0;
}
Кроме того, это поможет принудительно выполнить некоторые const
-культуры в программировании на языке C.
Почему такие случаи сознательно игнорируются? Является ли стандарт активно запрещать диагностику из-за испускания в таких случаях или, в основном, для обратной совместимости (при попытке принудительного применения они теперь генерируют слишком много предупреждений)?