问题标签 [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 投票
7 回答
49348 浏览

c - 缓冲区溢出在 gdb 中有效,但不是没有它

我在 CentOS 6.4 32 位上并试图在程序中导致缓冲区溢出。在 GDB 中它可以工作。这是输出:

但是,当我单独运行程序堆栈时,它会出现段错误。为什么会这样?

0 投票
2 回答
131 浏览

d - 在 D 中构建字符串的首选方式

关于函数属性以及父函数的编译@safe时和运行时性能,构造字符串的首选方法是什么?purenothrow

例如,我们是否应该使用

或者

我认为该format版本在视觉上更容易,但在其他方面更好吗?

由于格式字符串及其参数必须是 CTFEed,因此编译时间可能会对性能产生轻微影响,对吗?

0 投票
2 回答
142 浏览

d - 使用调试语句逃避安全

我知道

pure函数中,但是我仔细标记为@safe的函数@trusted呢?DMD 目前不允许debug writeln's 在那些,因为writeln目前和类似的是@system。恕我直言,这非常令人沮丧。有没有一种巧妙的方法来逃避安全,还是我必须暂时注释掉我所有的@safe@trusted标签?

0 投票
4 回答
239 浏览

c - 使用 sysctl(3) 编写安全、可移植的代码:好主意吗?

当用纯 C 编写安全代码时,我厌倦了用任意数字来表示限制——特别是为单行文本分配的最大内存量。我知道我总是可以说类似的话

然后将该宏传递给诸如 snprintf() 之类的函数。

我在 NetBSD 中工作和编码,它有一个名为“user.line_max”的 sysctl(3) 变量,专门为此目的而设计。所以我不需要想出像上面的 MAX_LINE_LENGTH 这样的任意数字。我刚刚阅读了“user.line_max” sysctl 变量,顺便说一下,它可以由用户设置。

我的问题是,就安全性和便携性而言,这是否是正确的选择。也许不同的操作系统对此 sysctl 有不同的名称,但我更感兴趣的是我是否应该使用这种技术。

并且为了记录,在这种情况下,“可移植性”不包括 Microsoft Windows。

0 投票
2 回答
803 浏览

delphi - 关于来自 TClientDataSet 的数据

我制作了一个将数据从 A TClientDataSet 复制到 B 的函数。

在生产环境中,代码会动态填充一个 TClientDataSet,如下所示:

那说:

  • 这样做安全吗?(我的意思是安全的,我应该期待什么样的异常以及如何处理它们?)
  • 如何释放“.Data”的内存?
0 投票
1 回答
230 浏览

haskell - 在 Haskell(GHC) 中快速检查一个讨厌的外部函数

我想用 Haskell 的 quickcheck 库测试一些 C 代码。最简单的方法似乎是 foreign import在生成的 haskell 函数之上执行并编写一个属性。这样做的问题是,如果 C 代码导致段错误或设法破坏内存,我的测试要么崩溃而没有输出,要么做一些完全不可预测的事情。

第二种选择是在 C 位上制作简单的可执行包装器,并在测试过程之外通过System.Process. 不用说,这样做需要大量的脚手架和序列化值,但另一方面,它可以处理段错误。

有什么方法可以使foreign import策略像运行外部进程一样安全?

0 投票
2 回答
418 浏览

rust - Rust 中返回值的范围是什么?

当变量返回给调用者时,变量引用的数据会发生什么?当数据被破坏并且可能 Drop trait 被执行时?

0 投票
3 回答
3835 浏览

pointers - Rust 如何实现仅编译时指针安全?

我在某处读到,在具有指针的语言中,由于各种原因,编译器不可能在编译时完全确定所有指针是否正确使用和/或是否有效(引用活动对象),因为那会本质上构成解决停机问题。直观地说,这并不奇怪,因为在这种情况下,我们将能够在编译时推断程序的运行时行为,类似于这个相关问题中所述的内容。

然而,据我所知,Rust 语言要求指针检查完全在编译时完成(没有与指针相关的未定义行为,至少是“安全”指针,并且没有“无效指针”或“空指针”运行时例外)。

假设 Rust 编译器没有解决停机问题,那么谬误在哪里?

  • 是不是指针检查没有完全在编译时完成,并且与 C 中的原始指针相比,Rust 的智能指针仍然引入了一些运行时开销?
  • 或者 Rust 编译器是否可能无法做出完全正确的决定,并且它有时需要 Just Trust The Programmer™,可能使用生命周期注释之一(具有<'lifetime_ident>语法的注释)?在这种情况下,这是否意味着指针/内存安全保证不是 100%,仍然依赖于程序员编写正确的代码?
  • 另一种可能性是,Rust 指针是非“通用的”或在某种意义上受到限制,因此编译器可以在编译时完全推断它们的属性,但它们不如 C 中的原始指针或 C++ 中的智能指针有用。
  • 或者也许它是完全不同的东西,我误解了一个或多个
    { "pointer", "safety", "guaranteed", "compile-time" }.
0 投票
1 回答
31 浏览

security - curretUser 的对象 - 是否安全

我正在编写一个“atm/internetbank”作为学校作业,我想知道创建一个保存 currentUser 的对象的“安全性”。“atm”应该能够在笔记本电脑上运行。对于这个“atm”分配,有一个相关的数据库。当您使用匹配的用户名和密码登录时,它会将带有余额的信息作为 currentUser 保存到 User 对象中。我的问题是,密码的安全性如何,尤其是余额。是否可以使用程序外部的信息进行操作。考虑在需要时直接从数据库中获取余额,并在发生新情况时直接更新余额。提前致谢。

0 投票
2 回答
889 浏览

c++ - 使用智能指针作为“非拥有引用”的优缺点是什么?

当一个对象需要引用另一个对象而不“拥有它”(即,不对其生命周期负责)时,一种方法是简单地为此使用原始指针或原始引用,如下例所示:

(请节省时间来评论是否存在更有效的图形数据结构,这是我的专业领域,而不是问题的重点。)

Graph负责节点和边的生命周期,并负责保证其中的指针NodeEdge悬空。但是如果程序员没有这样做,那么就有未定义行为的风险。

但是由于引用计数的开销成本,人们可以强烈地强制使用智能指针不会发生未定义的行为。相反,它会优雅地崩溃。它保证这发生在尽可能早的时间(避免损坏更多数据)并且不会被忽视。这是一种可能的实现:

(编辑:固定实现,Yakk回答中的更多细节。非常感谢!)

我的问题是:除了明显的性能与安全性权衡之外,每种方法的优缺点是什么?

我不是在问哪个是最好的,肯定没有最好的,这取决于用例。我在询问您可能知道而我不知道的每种方法的事实利弊,这将有助于做出设计决策(也许,在可读性方面?可维护性?可移植性?与第三方库玩得很好?防止 use-after-free 漏洞利用?)。