我看到一些发布的代码有超出范围的错误,这让我感到好奇。我希望编译器为此代码生成警告(至少在最高级别)
#pragma warning(push,4)
int main(){
int x[2];
x[2]=0;
return 0;
}
#pragma warning(pop)
但事实并非如此。
EDG 编译器很好地说明了:
"sourceFile.cpp", line 3: warning:
subscript out of range
x[2]=0;
^
其实EDG说的还多一点(都是意料之中的)
"sourceFile.cpp", line 1: warning:
unrecognized #pragma
#pragma warning(push,4)
^
"sourceFile.cpp", line 4: warning:
subscript out of range
x[2]=0;
^
"sourceFile.cpp", line 3: warning:
variable "x" was set but never used
int x[2];
^
"sourceFile.cpp", line 7: warning:
unrecognized #pragma
#pragma warning(pop)
但这不是我的问题。
我认为这个失败警告了 VC9 中的严重遗漏错误(自从使用自动变量以来更是如此!!!)。谁能给我一个改变主意的严肃理由?
许多编译器都有选项来错误地处理此类事情。
但对于 C 编译器来说,默认放弃这一点是非常传统的,甚至是正确的。造成这种情况的原因有很多。
请记住x[i]
and i[x]
在 C 中是同样的事情。你甚至可以这样做"string"[2]
或者你可以这样做2["string"]
并得到相同的结果。尝试一下。这是因为x[i]
定义为*(x + i)
一旦 C 只进行指针算术,然后取消引用表达式的结果,编译器就无法决定它是否有效。
-
鉴于指针算术是合法的,许多当时相当不错的设计模式实际上依赖于技术下标违规
struct s {
...bunch of stuff...
int points[1]; // not really [1]
};
...
struct s *p = malloc(sizeof (struct s) + someNumber * sizeof(int));
今天到处都在运行这样的代码......Update: 呵呵,这是实际的stackoverflow 上的 struct hack 示例 https://stackoverflow.com/questions/1395395/arrays-inside-structs-in-c.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)