【发布时间】:2017-09-06 07:10:15
【问题描述】:
由于未定义的行为(尝试修改字符串文字),以下程序会引发系统分段错误:
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;
}
此外,这将有助于在 C 编程中强制执行一些 const-culture。
为什么故意忽略这种情况?该标准是否积极禁止在这种情况下发出诊断信息,还是主要是为了向后兼容(现在尝试强制执行它们会产生太多警告)?
【问题讨论】:
-
默认情况下它没有打开,因为遗憾的是仍然有大量以非常量正确方式编写的遗留代码。有些甚至早于将
const添加到 C 中。 -
默认启用此类警告会导致警报疲劳。让编译器对此发出警告会很好,但是有太多旧代码会绊倒它,同时仍然是正确的代码。
标签: c string language-lawyer compiler-warnings string-literals