问题标签 [memory-safety]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1121 浏览

c - 如何防止缓冲区溢出/数组溢出?

我最近正在为自定义串行通信协议编写代码。我所做的是,我使用了接收数据的一部分(8/16 位)来表示帧大小有多大。基于这些数据,我预计没有数据可以遵循。我使用 Crc 来接受或拒绝一个框架。但是我不能在 Crc 中包含帧长度数据,因为在接收端我应该知道在处理帧之前需要多少数据。

我面临的问题是,有时这个帧长度数据会被破坏,它会欺骗接收器接收那么多字节,而接收数组的大小要小得多。这会破坏连续内存位置中存在的许多关键系统变量。

如何防止发生缓冲区溢出?我对此的想法 1)如果帧长度数据超过某个值,则拒绝它。2)使用限制最大数量的数据类型。就像使用 short 将数组索引的范围限制为 256 个内存位置,并创建一个 280 字节的缓冲区。3)在单独的位置分配内存,这样它就不会影响关键的系统变量。

我用来防止卡在接收循环中的一件事是使用超时。但我忽略了这个问题。如果有时间确认和重现该问题,我会觉得很多,因为代码是更大系统代码的一部分,我不是这里的专家。

一般如何安全地处理这类问题?

另外:使用数组时要遵循的一般注意事项或标准做法是什么,以防止它溢出?

0 投票
1 回答
1665 浏览

dynamic-allocation - Alternatives to dynamic allocations in safety critical projects (C)

Safety critical projects do not recommend any dynamic allocations or freeing allocated memory. Only during elaboration/initialization phase of the program execution, it is allowed.

I know most of you will argue to implement SW in terms where it should do all static allocations only or do some justification in the code that dynamic allocations will not harm the overall program,etc but still, Is there any alternative to this problem? Is there any way or any example to kind of allocate some (heap) memory during program initialization/elaboration and allocate/deallocate memory from over there? Or any solutions/alternatives to this problem if we really want dynamic allocations in the (safety critical) project?

0 投票
2 回答
1101 浏览

android - 反黑客安卓项目

我需要有关如何使我的项目不被黑客入侵的更多信息。第一:是的,我知道你需要一个有根设备才能破解手机上的游戏和应用程序。第二:是的,我知道这更多的是记忆阅读和作弊引擎等调整。

我需要知道甚至一些关于如何做到这一点的信息。如果您熟悉日本制作的游戏“Battle Cats”,您也会知道尝试进行内存扫描会导致游戏立即进入浏览器更改,然后尝试连接到报告用户的某个 API。

我想知道它是如何实现的,以及如何制作这样的东西,因为这是为了更好的安全细节,我知道日本人已经做过,我需要这样的东西来加强我的项目的安全性。

如果你知道什么,请给我一些信息。

另外,是的,我曾尝试在 Google 中执行此操作,但我得到的只是针对 Android / 移动设备的防病毒软件,这至少可以说有点令人沮丧。

0 投票
1 回答
679 浏览

swift - 如何手动清零内存?

是否可以从内存中手动清除对象的内容?

特别是,我正在处理NSData. 我试过使用data.length = 0and data.setData(NSData)

我知道ARC它会在超出它所属的范围后进入并清理,但是是否可以在我需要时手动强制执行此过程?

0 投票
1 回答
297 浏览

security - 在 clang/llvm 中实现 CFI 的入口点?

我想在 Clang/llvm 中实现控制流完整性。(我知道已经实施了 Forward-Edge CFI)

我的问题是,我从来没有为编译器实现任何东西(我是基于编译器的方法的新手),因此不知道从哪里开始。对于我的实现,我首先需要获取所有调用的列表(内部 => 没有库调用),然后更改函数的结束方式(例如:pop + jmp而不是ret)。

有谁知道从哪里开始,或者是否可以使用插件系统(LibClang、Clang Plugins、LibTooling)?

提前致谢

0 投票
1 回答
1727 浏览

c++ - FORTIFY_SOURCE 和 Og 优化级别

是否可以将-Wp,-D_FORTIFY_SOURCE=2选项(或=1)与-Og优化级别一起使用?介绍的补丁FORTIFY_SOURCE包含评论/* Object size checking is only intended for -O[s123]. */

这是2004年。而且我不知道何时-Og引入密钥(可能稍后)。

即需要哪些优化(优化标志)FORTIFY_SOURCE

0 投票
2 回答
188 浏览

memory-management - 操作系统如何防止来自汇编级代码的恶意内存访问?

我知道操作系统提供的用于保护程序不访问其他程序内存的系统调用。但这只有在我使用了 OS 提供的系统调用库时才有帮助。如果我自己编写一个汇编代码,为内核模式设置 CPU 位并执行特权指令(假设修改操作系统在内存中的程序段)怎么办。操作系统可以防止这种情况吗?PS出于好奇的问题。如果可以提供任何好的博客或书籍参考,那将很有帮助,因为我想尽可能详细地研究操作系统。

0 投票
2 回答
8742 浏览

c++ - 编写内存安全的 C++ 应用程序需要什么?

是否可以创建一个编码标准或使用可以证明可以消除 C++ 中的任何内存管理错误的库?

我正在考虑类似 Java 的东西,例如,在 Java 应用程序中不可能有悬空指针。

0 投票
3 回答
150 浏览

rust - 阐明将两个引用绑定到不同范​​围的引用对象到函数签名中的相同生命周期的含义

我一直试图了解 Rust 的借贷和所有权模型。

假设我们有以下代码:

min()只返回对两个引用字符串中较短者的引用。main()传入两个字符串引用,其引用对象在不同的​​范围内定义。我已经使用过String::from(),因此引用没有静态生命周期。程序正确打印short这是 Rust Playground 中的示例

如果我们参考Rustonomicon(我很欣赏这是一个正在进行中的文档),我们会被告知函数签名的含义如下:

表示功能:

对 a 的引用u32具有一定的生命周期,并承诺它可以产生对 a 的引用,该引用的生命周期str也一样长。

现在让我们转向min()我的示例中的签名:

这更受欢迎,因为:

  • 我们有两个输入引用。
  • 它们的所指对象在不同的​​范围内定义,这意味着它们在不同的生命周期a内有效(有效期更长)。

使用与上面引用的语句类似的措辞,函数签名的min()含义是什么?

  1. 该函数接受两个引用,并承诺产生一个对 a 的引用,该引用可以与str的所指对象一样长。a b不知何故感觉不对,好像我们将引用返回到bfrom ,那么显然该引用在 inmin()的生命周期内无效。amain()

  2. 该函数接受两个引用并承诺产生一个对 a 的引用,该引用可以与str的两个引用中较短的一个一样长。a b这可能会奏效,因为ab在 的内部范围内都保持有效main()

  3. 完全不同的东西?

总而言之,我不明白min()当它们的引用在调用者的不同范围内定义时,将两个输入引用的生命周期绑定到同一生命周期意味着什么。

0 投票
2 回答
1721 浏览

swift - Swift 中的弱与无主。内部差异是什么?

我了解Swift之间的用法weak和表面上的区别:unowned

我见过的最简单的例子是,如果存在 aDog和 a Bone,则 theBone可能对 the 有弱引用Dog(反之亦然),因为它们可以相互独立地存在。

另一方面,在 aHuman和 a的情况下Heart, theHeart可能有unowned对人类的引用,因为一旦Human变得......“取消引用”,Heart就不能再合理地访问。那和带有 和 的经典Customer例子CreditCard

所以这不是重复的问题。


我的问题是,拥有两个如此相似的概念有什么意义?有什么内部差异需要使用两个关键字来表示本质上 99% 相同的东西?问题是为什么存在差异,而不是差异是什么。

鉴于我们可以像这样设置一个变量:weak var customer: Customer!unowned变量是非可选的优点是有争议的。

我可以看到使用vs 隐式解包变量 via的唯一实际优势是我们可以通过.unownedweak!unownedlet

...也许编译器可以因此进行更有效的优化。

这是真的吗,还是幕后发生的其他事情为保留这两个关键字提供了一个令人信服的论据(尽管细微的区别——基于 Stack Overflow 的流量——显然让新手和经验丰富的开发人员都感到困惑)。

我很想听听那些在 Swift 编译器(或其他编译器)上工作过的人的意见。