作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] 宣告变数的位置
时间Wed Mar 11 18:44:16 2009
※ 引述《gppo (香蕉是什麽?)》之铭言:
: 自问自答....
: 原因在於result[50][10]
: result最多只有到[49][9]
: 但是我却做了给result[50][..]值的动作
: 所以因此就覆盖到spec的内容(所以其实被覆盖到的可能不只spec这个变数)
: 或许是Dev-C++不严谨或其他原因
: compile时他并没有告诉我out of boundary之类的错误提示
compile time 不可能帮你做这种检查。
一个简单的例子,若你这样写:
int array[100];
int i;
cin >> i;
array[i] = 0;
compiler 再怎麽神通广大,也不可能在 compile time 的时候
去侦测到 i 的值是多少。又如你使用回圈的例子:
for(i = 0; i < 100; i++){
...
array[i] = ...;
}
这种 code 基本上也很难在 compile time 侦测 out of boundary,
因为它不知道你在回圈中做了哪些事,以及这些事是否影响到 i 的值。
run time 去侦测是否 out of boundary 是可行的,但程式效能通常会
大幅降低。
: 不过印象中这类的错误如果是用工作站跑的话
: 应该会出现 "Segmentation fault"的错误讯息
因为你的变数是区域变数,空间配置在 stack 中,而 x86 架构下
stack 是由高位址往低位址成长,所以当你存取了超过范围的元素,
资料会盖掉 stack 底层的资料,这些资料可能是其它的区域变数,
对 OS 来说这些变数也是该 process 的合法记忆体空间,所以并不
会产生 segmentation fault。
但如果你超出的范围更大,那就会盖掉 stack 中一项更重要的资讯,
那就是函式的 return address。当这项资讯被改写成另一个不相关
的值,函式结束时会跳到一个非法的记忆体空间,这时候就会发生
segmentation fault 了。更悲惨的是,如果你写入的资料是来自使
用者的输入,那使用者可能藉这个漏洞执行恶意程式码。这种漏洞
称为 buffer overflow,可以说是最常见的安全漏洞了。
: 虽然这应该是自己要注意的地方 不过不晓得板上有没有Dev-C++的使用者
: 知道如何提升syntax或是memory运用上的警告 错误提示?
: 至於为什麽改变宣告顺序就会正常
: 我想也只是运气问题 他可能盖到别的地方去了
许多语言为了避免使用回圈存取阵列元素时不小心超出边界,因此
会设计 foreach 的语法,让 programmer 不需要知道阵列大小即可
走访所有阵列元素。C/C++ 没有 foreach,不过 C++ 的 STL 提供
map 和 transform,把阵列的走访行为抽出以免使用者耍笨。另外
STL 的 vector 提供 at() 这个 member function,会在 run time
进行 boundry check,debug 时可以用它来协助你找到超出范围存
取的地方。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.115.146.9
1F:推 VictorTom:推说明:) 03/11 19:48
2F:推 gppo:感谢^^ 03/11 23:24