安全关键项目不建议任何动态分配或释放分配的内存.仅在程序执行的精化/初始化阶段,才允许.
我知道你们中的大多数人都会争论实施SW,它应该只进行所有静态分配,或者在代码中做一些理由,动态分配不会损害整个程序等等,但是,这个问题还有其他选择吗?有什么方法或任何例子可以在程序初始化/详细说明期间分配一些(堆)内存并从那里分配/释放内存?如果我们真的想在(安全关键)项目中进行动态分配,还是解决这个问题的任何解决方案/替代方案?
是否可以从内存中手动清除对象的内容?
特别是我正在处理NSData。我尝试使用data.length = 0和data.setData(NSData)。
我知道ARC它超出了它所属的范围后会进入并进行清理,但是我可以在需要时手动强制执行此过程吗?
是否可以将-Wp,-D_FORTIFY_SOURCE=2选项(或=1)与-Og优化级别一起使用?引入的补丁FORTIFY_SOURCE包含一个注释/* Object size checking is only intended for -O[s123]. */。
是2004年。而且我不知道何时-Og引入密钥(可能稍后)。
哪些优化(优化标志)FORTIFY_SOURCE需要?
尝试使用编程语言Rust,我发现编译器能够非常准确地跟踪堆栈中某些结构的字段的移动(它确切地知道哪个字段已移动).但是,当我将结构的一部分放入a Box(即将其放入堆中)时,编译器不再能够确定在取消引用该框之后发生的所有事件的字段级移动.它将假设"盒子内部"的整个结构已经移动.让我们首先看一下一切都在堆栈上的例子:
struct OuterContainer {
inner: InnerContainer
}
struct InnerContainer {
val_a: ValContainer,
val_b: ValContainer
}
struct ValContainer {
i: i32
}
fn main() {
// Note that the whole structure lives on the stack.
let structure = OuterContainer {
inner: InnerContainer {
val_a: ValContainer { i: 42 },
val_b: ValContainer { i: 100 }
}
};
// Move just one field (val_a) of the inner container.
let move_me …Run Code Online (Sandbox Code Playgroud) 我知道
debug writeln("Some good debug message")
Run Code Online (Sandbox Code Playgroud)
在pure功能,但我已经仔细标记为@safe或的功能@trusted呢?DMD目前不允许使用debug writeln,因为writeln目前和类似@system.这是恕我直言,非常令人沮丧.有一个聪明的方式来逃避安全还是我暂时注释掉我所有的@safe和@trusted标签?
参考官方教程,swift中存在内存冲突,但是,根据我的javascript知识,不存在内存冲突,下面的代码总是正确的。
func balance(_ x: inout Int, _ y: inout Int) {
let sum = x + y
x = sum / 2
y = sum - x
}
var playerOneScore = 42
var playerTwoScore = 30
balance(&playerOneScore, &playerTwoScore) // OK
balance(&playerOneScore, &playerOneScore) // Error: conflicting accesses to playerOneScore
Run Code Online (Sandbox Code Playgroud) 在我的函数中,内存指针及其大小作为参数传递:
int myFun(uintptr_t* mem_ptr, int mem_size) {
// Code here
}
Run Code Online (Sandbox Code Playgroud)
有没有办法判断这块内存是否真的有效?
(操作系统是 CentOS Linux 版本 7.9.2009。)
当一个对象需要在没有"拥有它"的情况下引用另一个对象(即,不对其生命周期负责)时,一种方法就是使用原始指针或原始引用,就像在这个例子中一样:
class Node
{
std::vector<Edge*> incidentEdges;
};
class Edge
{
Node* startNode;
Node* endNode;
};
class Graph
{
std::vector<std::unique_ptr<Node*>> nodes;
std::vector<std::unique_ptr<Edge*>> edges;
};
Run Code Online (Sandbox Code Playgroud)
(请节省时间评论图表是否存在更有效的数据结构,这是我的专业领域,而不是问题的重点.)
Graph负责节点和边的生命周期,并负责保证指针在Node和Edge不悬空.但是如果程序员没有这样做,那么存在未定义行为的风险.
但是,由于引用计数的开销成本,人们可以强烈强制使用智能指针不会发生未定义的行为.相反,它会优雅地崩溃.它保证这可以在尽可能早的时间发生(避免破坏更多数据)并且不会被忽视.这是一个可能的实现:
(编辑:修复实施,更多细节在Yakk回答.非常感谢!)
template <class T>
using owning_ptr = std::shared_ptr<T>;
template <class T>
class nonowning_ptr
{
std::weak_ptr p_;
public:
nonowning_ptr() : p_() {}
nonowning_ptr(const nonowning_ptr & p) : p_(p.p_) {}
nonowning_ptr(const owning_ptr<T> & p) : p_(p) {}
// checked dereferencing
owning_ptr<T> get() const
{
if (auto sp = p_.lock()) …Run Code Online (Sandbox Code Playgroud) 在 CI 中可以使用尚未初始化的结构体。我在 Rust 中尝试过这段代码:
struct User {
username: String,
email: String,
sign_in_count: u64,
active: bool,
}
fn main(){
let mut user1: User;
user1.active = false;
}
Run Code Online (Sandbox Code Playgroud)
但它产生了一个编译错误:
error[E0381]: assign to part of possibly-uninitialized variable: `user1`
--> src/main.rs:10:5
|
10 | user1.active = false;
| ^^^^^^^^^^^^^^^^^^^^ use of possibly-uninitialized `user1`
Run Code Online (Sandbox Code Playgroud)
为什么这在 C 中是允许的,但在 Rust 中是错误的?