不可能做一个C++;申请书;“防撞”吗;? 我们假设在C++中有一个SDK,它接受一些二进制数据(像图片)并做一些事情。不可能使此SDK“防崩溃”吗?崩溃主要是指由于用户传递的无效输入(如异常短的垃圾数据),操作系统在内存访问冲突时强制终止 我没有C++的经验,但是当我搜索Google时,我发现有几种方法听起来像是一个解决方案(使用向量代替数组,配置编译器,执行自动边界检查等)。p>

不可能做一个C++;申请书;“防撞”吗;? 我们假设在C++中有一个SDK,它接受一些二进制数据(像图片)并做一些事情。不可能使此SDK“防崩溃”吗?崩溃主要是指由于用户传递的无效输入(如异常短的垃圾数据),操作系统在内存访问冲突时强制终止 我没有C++的经验,但是当我搜索Google时,我发现有几种方法听起来像是一个解决方案(使用向量代替数组,配置编译器,执行自动边界检查等)。p>,c++,crash,fault-tolerance,C++,Crash,Fault Tolerance,当我把这个提交给开发者时,他说这仍然是不可能的。。并不是说我不相信他,但如果是这样,像Java这样的语言是如何处理这个问题的?我认为JVM每次都执行边界检查。如果是这样,为什么不能在C++中手动地做同样的事情? 更新 我所说的“防崩溃”并不意味着应用程序不会终止。我的意思是它不应该突然终止没有发生什么信息(我的意思是它会转储核心等),但它不可能显示一个消息,如“参数x无效”等?< /P> < P>你可以检查一个数组的边界在C++中,这样做自动。 这不会让你的应用程序崩溃,你仍然可以故意在脚上开枪

当我把这个提交给开发者时,他说这仍然是不可能的。。并不是说我不相信他,但如果是这样,像Java这样的语言是如何处理这个问题的?我认为JVM每次都执行边界检查。如果是这样,为什么不能在C++中手动地做同样的事情? 更新

我所说的“防崩溃”并不意味着应用程序不会终止。我的意思是它不应该突然终止没有发生什么信息(我的意思是它会转储核心等),但它不可能显示一个消息,如“参数x无效”等?< /P> < P>你可以检查一个数组的边界在C++中,这样做自动。
<>这不会让你的应用程序崩溃,你仍然可以故意在脚上开枪,但是C++中没有任何东西强迫你触发。首先,我看过许多自动提交的崩溃报告,我可以向您保证,硬件的质量远远低于大多数开发人员的期望。比特翻转在商品机器上太常见了,会导致随机AV。而且,即使您准备好处理访问冲突,也存在某些例外情况,即操作系统别无选择,只能终止进程,例如提交失败

崩溃主要是指由于用户传递的无效输入(如异常短的垃圾数据),操作系统在内存访问冲突时强制终止

这是经常发生的事情。如果您访问一些无效内存,操作系统通常会中止您的程序

然而问题是什么是无效内存。。。您可以自由地用垃圾填充堆和堆栈中的所有内存,这从操作系统的角度来看是有效的,但从您创建垃圾的角度来看是无效的

基本上-您需要仔细检查输入数据并在此基础上进行中继。没有操作系统会为您这样做


如果仔细检查输入数据,您可能会管理好数据。

实际上,使用边界检查会使应用程序更容易崩溃

这是一个很好的设计,因为这意味着如果你的程序正在工作,那么它很可能正在工作/正确/而不是不正确地工作


也就是说,严格来说,在停止问题得到解决之前,给定的应用程序无法“防碰撞”。祝你好运

>我认为这是C++代码不是托管代码的例子。 Java、C#代码由解释器管理,即它们由解释器有效执行,解释器能够执行绑定检查并检测崩溃情况

使用C++的情况下,需要执行绑定和其他检查。但是,您可以使用异常处理,这将在您无法控制的事件期间防止崩溃


<> P> >底部,C++代码本身不是防撞的,但是一个好的设计和开发可以使它们成为这样。

一般来说,你不能做一个C++ API崩溃证明,但是有一些技术可以使它更健壮。在我的脑海中(并非详尽无遗)举个例子:

  • 尽可能检查输入数据的完整性
  • 数据处理代码中的缓冲区限制检查
  • 边角测试
  • 模糊测试
  • 将问题输入放入单元测试以避免回归
我主要是指强制终止 通过操作系统访问内存 由于传递的输入无效而导致冲突 由用户

不确定“用户”是谁

您可以编写不会因最终用户输入无效而崩溃的程序。在某些系统上,可能会因为使用太多内存(或其他程序使用太多内存)而强制终止。正如Remus所说,没有任何语言能够完全保护您免受硬件故障的影响。但这些都取决于用户提供的数据字节以外的因素

<>你在C++中不容易做的就是证明你的程序不会因为输入无效而崩溃,或者更糟的是出错,造成严重的安全缺陷。所以有时候[*]您认为您的代码对任何输入都是安全的,但事实证明并非如此。你的开发者可能是这个意思

如果您的代码是一个函数,它使用指向图像数据的指针作为示例,那么就没有什么可以阻止调用者向您传递一些无效的指针值:

char *image_data = malloc(1);
free(image_data);
image_processing_function(image_data);
因此,函数本身不能“防崩溃”,它要求程序的其余部分不做任何事情使其崩溃。您的开发人员也可能是这个意思,所以您也许应该让他澄清一下

Java通过不可能创建一个无效引用来处理这个特定的问题——您无法在Java中手动释放内存,因此特别是在这样做之后,您无法保留对它的引用。它以其他方式处理许多其他特定问题,因此,在C++中“未定义行为”的情况,并且可能导致崩溃,在java中可能会发生不同的事情(可能抛出异常)。 [*]让我们面对现实:在实践中,在大型软件项目中,“经常”

如果“防崩溃”仅意味着您希望确保在崩溃发生后有足够的信息来调查崩溃,那么解决方案可能很简单。大多数情况下,调试信息在崩溃期间由于损坏而丢失