gpt4 book ai didi

c++ - LabWindows CVI 如何检测 C 语言中的缓冲区溢出

转载 作者:行者123 更新时间:2023-11-30 18:14:11 24 4
gpt4 key购买 nike

昨天,我发现当我用C运行一些简单的代码时,CVI可以检测到缓冲区溢出,这让我很困惑。

void main(void)
{
int a[10];
int buf[10];
int test[10];
int *p = &buf[10];
*p = 1;
while(1);
}

当我可以运行这个程序时,发生了错误。消息是“取消引用超出数组末尾的越界指针1字节(1个元素)”(抱歉,没有权限发布图像)

我很困惑如何实现,因为我知道 C/C++ 没有内置的数组边界。我也在其他一些平台如VC++6.0和Linux上尝试过,没有人能够检测到溢出。谢谢你。

最佳答案

我没有使用过 LabWindows/CVI,但从您对它的简短讨论来看,我猜测它是在运行时而不是在编译时检测到这种越界取消引用的。静态代码分析(可以在编译时执行而不运行软件的正确性检查)在它们可以捕获的错误类型方面受到限制。在您的简单示例中,编译器可以想象捕获此错误,但在一般情况下它无法捕获此类错误,因为即使对于最强大的程序,跟踪可能进入大型程序的所有输入组合的数据流也将是一个棘手的问题 super 计算机,即使要花上亿万年的时间来解决这个问题。

在一般情况下捕获此类问题的唯一方法是通过动态程序分析:通过运行时边界检查自动检测代码本身,和/或通过跟踪所有内存边界的模拟器执行代码分配并根据这些边界验证所有访问。前一种策略的实现示例是 Ada 编程语言,其中任务关键型安全性被认为比性能重要得多。但就 Ada 而言,该语言旨在允许此类检查。 C 或 C++ 语言的实现可能可以做类似的事情,但是语言中原始指针的存在会使这变得更加困难,并且运行时的成本可能会高得令人望而却步。

在 C 和 C++ 中,如果您想要这种运行时边界检查(仅用于测试),您可以查看 Valgrind。据我所知,没有其他工具能够更彻底地捕获越界访问。但要做好你的程序运行速度非常慢的准备。也许 LabWindows/CVI 与 Valgrind 类似?

无论如何,您需要注意,无论您使用什么验证工具,通过运行时边界检查捕获错误代码的唯一方法是向程序提供引发越界行为的输入。任何验证工具都没有出现边界检查失败并不能明确表明您的程序不存在此类错误。

关于c++ - LabWindows CVI 如何检测 C 语言中的缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18414397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com