不可能做一个C++;申请书;“防撞”吗;? 我们假设在C++中有一个SDK,它接受一些二进制数据(像图片)并做一些事情。不可能使此SDK“防崩溃”吗?崩溃主要是指由于用户传递的无效输入(如异常短的垃圾数据),操作系统在内存访问冲突时强制终止 我没有C++的经验,但是当我搜索Google时,我发现有几种方法听起来像是一个解决方案(使用向量代替数组,配置编译器,执行自动边界检查等)。p>
当我把这个提交给开发者时,他说这仍然是不可能的。。并不是说我不相信他,但如果是这样,像Java这样的语言是如何处理这个问题的?我认为JVM每次都执行边界检查。如果是这样,为什么不能在C++中手动地做同样的事情? 更新不可能做一个C++;申请书;“防撞”吗;? 我们假设在C++中有一个SDK,它接受一些二进制数据(像图片)并做一些事情。不可能使此SDK“防崩溃”吗?崩溃主要是指由于用户传递的无效输入(如异常短的垃圾数据),操作系统在内存访问冲突时强制终止 我没有C++的经验,但是当我搜索Google时,我发现有几种方法听起来像是一个解决方案(使用向量代替数组,配置编译器,执行自动边界检查等)。p>,c++,crash,fault-tolerance,C++,Crash,Fault Tolerance,当我把这个提交给开发者时,他说这仍然是不可能的。。并不是说我不相信他,但如果是这样,像Java这样的语言是如何处理这个问题的?我认为JVM每次都执行边界检查。如果是这样,为什么不能在C++中手动地做同样的事情? 更新 我所说的“防崩溃”并不意味着应用程序不会终止。我的意思是它不应该突然终止没有发生什么信息(我的意思是它会转储核心等),但它不可能显示一个消息,如“参数x无效”等?< /P> < P>你可以检查一个数组的边界在C++中,这样做自动。 这不会让你的应用程序崩溃,你仍然可以故意在脚上开枪
我所说的“防崩溃”并不意味着应用程序不会终止。我的意思是它不应该突然终止没有发生什么信息(我的意思是它会转储核心等),但它不可能显示一个消息,如“参数x无效”等?< /P> < P>你可以检查一个数组的边界在C++中,这样做自动。
<>这不会让你的应用程序崩溃,你仍然可以故意在脚上开枪,但是C++中没有任何东西强迫你触发。首先,我看过许多自动提交的崩溃报告,我可以向您保证,硬件的质量远远低于大多数开发人员的期望。比特翻转在商品机器上太常见了,会导致随机AV。而且,即使您准备好处理访问冲突,也存在某些例外情况,即操作系统别无选择,只能终止进程,例如提交失败 崩溃主要是指由于用户传递的无效输入(如异常短的垃圾数据),操作系统在内存访问冲突时强制终止 这是经常发生的事情。如果您访问一些无效内存,操作系统通常会中止您的程序 然而问题是什么是无效内存。。。您可以自由地用垃圾填充堆和堆栈中的所有内存,这从操作系统的角度来看是有效的,但从您创建垃圾的角度来看是无效的 基本上-您需要仔细检查输入数据并在此基础上进行中继。没有操作系统会为您这样做
如果仔细检查输入数据,您可能会管理好数据。实际上,使用边界检查会使应用程序更容易崩溃 这是一个很好的设计,因为这意味着如果你的程序正在工作,那么它很可能正在工作/正确/而不是不正确地工作
也就是说,严格来说,在停止问题得到解决之前,给定的应用程序无法“防碰撞”。祝你好运 >我认为这是C++代码不是托管代码的例子。 Java、C#代码由解释器管理,即它们由解释器有效执行,解释器能够执行绑定检查并检测崩溃情况
使用C++的情况下,需要执行绑定和其他检查。但是,您可以使用异常处理,这将在您无法控制的事件期间防止崩溃
<> P> >底部,C++代码本身不是防撞的,但是一个好的设计和开发可以使它们成为这样。
一般来说,你不能做一个C++ API崩溃证明,但是有一些技术可以使它更健壮。在我的脑海中(并非详尽无遗)举个例子:
- 尽可能检查输入数据的完整性
- 数据处理代码中的缓冲区限制检查
- 边角测试
- 模糊测试
- 将问题输入放入单元测试以避免回归
char *image_data = malloc(1);
free(image_data);
image_processing_function(image_data);
因此,函数本身不能“防崩溃”,它要求程序的其余部分不做任何事情使其崩溃。您的开发人员也可能是这个意思,所以您也许应该让他澄清一下
Java通过不可能创建一个无效引用来处理这个特定的问题——您无法在Java中手动释放内存,因此特别是在这样做之后,您无法保留对它的引用。它以其他方式处理许多其他特定问题,因此,在C++中“未定义行为”的情况,并且可能导致崩溃,在java中可能会发生不同的事情(可能抛出异常)。
[*]让我们面对现实:在实践中,在大型软件项目中,“经常”如果“防崩溃”仅意味着您希望确保在崩溃发生后有足够的信息来调查崩溃,那么解决方案可能很简单。大多数情况下,调试信息在崩溃期间由于损坏而丢失