【发布时间】:2018-02-16 08:53:35
【问题描述】:
我很惊讶这个编译没有任何警告:
int main()
{
*"abc" = '\0';
}
gcc main.c -Wall -Wextra 和 clang main.c -Weverything。
为什么没有警告?有什么办法不会引发分段错误?
【问题讨论】:
-
一个更好的问题是:为什么
"abc"[0] = '\0';会发出警告?这里的 gcc 似乎有些不一致。 -
为什么要这样?
char *不是const合格的。如果您发现任何语言的编译器都会在代码错误时生成诊断,请申请诺贝尔奖以解决停止问题。并请提供对标准的参考,为什么必须存在段错误或任何其他特定行为。 -
@Olaf 也许我可以反其道而行之,正如 Lundin 所说:如果
char *不是const合格,为什么会有警告assignment of read-only location和"abc"[0] = '\0';? -
你可能会想出几十个这样的例子,gcc“不会警告”。问题是是否需要。答案是它不是。因为您的代码调用具有未定义的行为。虽然如果 gcc 能识别出这些东西(未定义或未定义)会很好,但对于 所有 此类情况,它通常无法做到。
-
@Bilow:
const并不意味着“只读位置”。字符串文字不是 C 中的const char []。而且您仍然缺乏证据证明代码需要警告。请注意,我并没有说它是正确的代码,但是没有 C 编译器会警告该语言的所有错误用法。
标签: c gcc segmentation-fault clang gcc-warning