问题标签 [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.
c - 缓冲区溢出在 gdb 中有效,但不是没有它
我在 CentOS 6.4 32 位上并试图在程序中导致缓冲区溢出。在 GDB 中它可以工作。这是输出:
但是,当我单独运行程序堆栈时,它会出现段错误。为什么会这样?
d - 在 D 中构建字符串的首选方式
关于函数属性以及父函数的编译@safe
时和运行时性能,构造字符串的首选方法是什么?pure
nothrow
例如,我们是否应该使用
或者
我认为该format
版本在视觉上更容易,但在其他方面更好吗?
由于格式字符串及其参数必须是 CTFEed,因此编译时间可能会对性能产生轻微影响,对吗?
d - 使用调试语句逃避安全
我知道
在pure
函数中,但是我仔细标记为@safe
的函数@trusted
呢?DMD 目前不允许debug writeln
's 在那些,因为writeln
目前和类似的是@system
。恕我直言,这非常令人沮丧。有没有一种巧妙的方法来逃避安全,还是我必须暂时注释掉我所有的@safe
和@trusted
标签?
c - 使用 sysctl(3) 编写安全、可移植的代码:好主意吗?
当用纯 C 编写安全代码时,我厌倦了用任意数字来表示限制——特别是为单行文本分配的最大内存量。我知道我总是可以说类似的话
然后将该宏传递给诸如 snprintf() 之类的函数。
我在 NetBSD 中工作和编码,它有一个名为“user.line_max”的 sysctl(3) 变量,专门为此目的而设计。所以我不需要想出像上面的 MAX_LINE_LENGTH 这样的任意数字。我刚刚阅读了“user.line_max” sysctl 变量,顺便说一下,它可以由用户设置。
我的问题是,就安全性和便携性而言,这是否是正确的选择。也许不同的操作系统对此 sysctl 有不同的名称,但我更感兴趣的是我是否应该使用这种技术。
并且为了记录,在这种情况下,“可移植性”不包括 Microsoft Windows。
delphi - 关于来自 TClientDataSet 的数据
我制作了一个将数据从 A TClientDataSet 复制到 B 的函数。
在生产环境中,代码会动态填充一个 TClientDataSet,如下所示:
那说:
- 这样做安全吗?(我的意思是安全的,我应该期待什么样的异常以及如何处理它们?)
- 如何释放“.Data”的内存?
haskell - 在 Haskell(GHC) 中快速检查一个讨厌的外部函数
我想用 Haskell 的 quickcheck 库测试一些 C 代码。最简单的方法似乎是 foreign import
在生成的 haskell 函数之上执行并编写一个属性。这样做的问题是,如果 C 代码导致段错误或设法破坏内存,我的测试要么崩溃而没有输出,要么做一些完全不可预测的事情。
第二种选择是在 C 位上制作简单的可执行包装器,并在测试过程之外通过System.Process
. 不用说,这样做需要大量的脚手架和序列化值,但另一方面,它可以处理段错误。
有什么方法可以使foreign import
策略像运行外部进程一样安全?
rust - Rust 中返回值的范围是什么?
当变量返回给调用者时,变量引用的数据会发生什么?当数据被破坏并且可能 Drop trait 被执行时?
pointers - Rust 如何实现仅编译时指针安全?
我在某处读到,在具有指针的语言中,由于各种原因,编译器不可能在编译时完全确定所有指针是否正确使用和/或是否有效(引用活动对象),因为那会本质上构成解决停机问题。直观地说,这并不奇怪,因为在这种情况下,我们将能够在编译时推断程序的运行时行为,类似于这个相关问题中所述的内容。
然而,据我所知,Rust 语言要求指针检查完全在编译时完成(没有与指针相关的未定义行为,至少是“安全”指针,并且没有“无效指针”或“空指针”运行时例外)。
假设 Rust 编译器没有解决停机问题,那么谬误在哪里?
- 是不是指针检查没有完全在编译时完成,并且与 C 中的原始指针相比,Rust 的智能指针仍然引入了一些运行时开销?
- 或者 Rust 编译器是否可能无法做出完全正确的决定,并且它有时需要 Just Trust The Programmer™,可能使用生命周期注释之一(具有
<'lifetime_ident>
语法的注释)?在这种情况下,这是否意味着指针/内存安全保证不是 100%,仍然依赖于程序员编写正确的代码? - 另一种可能性是,Rust 指针是非“通用的”或在某种意义上受到限制,因此编译器可以在编译时完全推断它们的属性,但它们不如 C 中的原始指针或 C++ 中的智能指针有用。
- 或者也许它是完全不同的东西,我误解了一个或多个
{ "pointer", "safety", "guaranteed", "compile-time" }
.
security - curretUser 的对象 - 是否安全
我正在编写一个“atm/internetbank”作为学校作业,我想知道创建一个保存 currentUser 的对象的“安全性”。“atm”应该能够在笔记本电脑上运行。对于这个“atm”分配,有一个相关的数据库。当您使用匹配的用户名和密码登录时,它会将带有余额的信息作为 currentUser 保存到 User 对象中。我的问题是,密码的安全性如何,尤其是余额。是否可以使用程序外部的信息进行操作。考虑在需要时直接从数据库中获取余额,并在发生新情况时直接更新余额。提前致谢。
c++ - 使用智能指针作为“非拥有引用”的优缺点是什么?
当一个对象需要引用另一个对象而不“拥有它”(即,不对其生命周期负责)时,一种方法是简单地为此使用原始指针或原始引用,如下例所示:
(请节省时间来评论是否存在更有效的图形数据结构,这是我的专业领域,而不是问题的重点。)
Graph
负责节点和边的生命周期,并负责保证其中的指针Node
不Edge
悬空。但是如果程序员没有这样做,那么就有未定义行为的风险。
但是由于引用计数的开销成本,人们可以强烈地强制使用智能指针不会发生未定义的行为。相反,它会优雅地崩溃。它保证这发生在尽可能早的时间(避免损坏更多数据)并且不会被忽视。这是一种可能的实现:
(编辑:固定实现,Yakk回答中的更多细节。非常感谢!)
我的问题是:除了明显的性能与安全性权衡之外,每种方法的优缺点是什么?
我不是在问哪个是最好的,肯定没有最好的,这取决于用例。我在询问您可能知道而我不知道的每种方法的事实利弊,这将有助于做出设计决策(也许,在可读性方面?可维护性?可移植性?与第三方库玩得很好?防止 use-after-free 漏洞利用?)。