问题标签 [stackalloc]

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 投票
1 回答
2059 浏览

c# - Buffer overflow protection for stackalloc in .Net

From C# reference for stackalloc:

the use of stackalloc automatically enables buffer overrun detection features in the common language runtime (CLR). If a buffer overrun is detected, the process is terminated as quickly as possible to minimize the chance that malicious code is executed.

Specifically, what kind of protection mechanism is implemented for .NET?
And will it also detect buffer underruns? Against which known attacks is the protection weaker?


For a context, for example for MS C++ compiler the information is available here:
Windows ISV Software Security Defenses:

The Stack Buffer Overrun Detection capability was introduced to the C/C++ compiler in Visual Studio .NET 2002 and has been updated in subsequent versions. /GS is a compiler switch that instructs the compiler to add startup code, and function epilog and prolog code, to generate and check a random number that is placed in a function's stack.

Note that Visual C++ 2005 (and later) also reorders data on the stack to make it harder to predictably corrupt that data. Examples include:
• Moving buffers to higher memory than non-buffers. This step can help protect function pointers that reside on the stack.
• Moving pointer and buffer arguments to lower memory at run time to mitigate various buffer overrun attacks.

0 投票
2 回答
590 浏览

c# - Stackalloc 和值类型

我从较早的 StackOverflow 帖子中阅读了一个关于何时使用 stackalloc 的示例。现在这个例子让我有点困惑:

现在,如果我错了,请随时纠正我,因为我还是 C# 和一般编程的新手。但是字节不是值类型吗?值类型不是存储在声明它们的地方吗?这是否意味着在此示例中,managed也存储在堆栈中,并且通过扩展,当此堆栈帧完成并转到调用地址时,内存会自动清理,因此应该以与此managed相同的方式删除unmanaged例子?

0 投票
1 回答
912 浏览

c# - 为什么 stackalloc 必须用作变量初始化器?

我正在用 C# 编写一些不安全的代码(跟进这个问题),我想知道,为什么stackalloc关键字必须用作变量初始化器?例如,这将产生一个语法错误:

但是从本地临时重新分配结果不会:

为什么第一个版本不允许,如果我尝试第二个版本会发生什么邪恶的事情?

0 投票
4 回答
3503 浏览

c# - 为什么 stackalloc 不能与引用类型一起使用?

Ifstackalloc与以下引用类型一起使用

有错误

无法获取托管类型(“字符串”)的地址、大小或声明指向托管类型的指针

为什么会这样?为什么CLR不能声明指向托管类型的指针?

0 投票
1 回答
591 浏览

c# - 指向包含 System.Numerics.Vector 的结构的指针在 C# 中

由于 SIMD,我正在尝试使用 System.Numerics 库制作带有 4 个双打的向量。所以我做了这个结构:

在这个阶段,我将其编码为 128 位 SIMD 寄存器。它工作正常,但是当我想要这样的东西时:

我明白了:

无法获取托管类型 ('Vector4D') 的地址、大小或声明指向托管类型的指针

知道如何将 stackalloc 与 System.Numerics.Vector 一起使用吗?使用 System.Numerics.Vector4 (浮点精度),指针没有问题,但我需要双精度。

0 投票
1 回答
396 浏览

c# - 为什么 stackalloc 接受可变长度?

知道为什么“stackalloc”关键字接受可变长度吗?

如果这条指令返回一个指向在堆栈帧中分配的缓冲区的指针,编译器如何管理它?每次调用它来组织堆栈帧时,它都会在运行时重新编译该函数?

谢谢。

0 投票
2 回答
1872 浏览

c# - C#返回在函数内使用stackalloc创建的指针

我有与 C++ 代码交互的 C# 代码,它使用字符串执行操作。

我在静态助手类中有这段代码:

如您所见,它返回一个指向使用stackalloc关键字创建的字节的指针。
但是从 C# Specifications 18.8 开始:

在函数成员执行期间创建的所有堆栈分配内存块都会在该函数成员返回时自动丢弃。

这是否意味着一旦方法返回,指针实际上就无效了?

该方法的当前用法:

代码是否应该更改为

fixed在返回的数组上再次使用,将指针传递给DirectFunction方法?

我试图尽量减少使用次数fixed(包括fixed其他重载 ofGetByteCount()GetBytes()of中的语句Encoding)。

tl;博士

  1. 方法返回后指针是否无效?它在传递给时是否无效DirectFunction()

  2. 如果是这样,使用最少的fixed语句来完成任务的最佳方法是什么?

0 投票
1 回答
738 浏览

c# - C# stackalloc 比常规变量慢?

我有 2 个函数以 2 种不同的方式实现 uint128 乘法:一种是使用变量,另一种是使用 stackalloc“数组”。

可变版本

Stackalloc 版本

为了清楚起见[0 + 1][1 + 1]留下 , 等。无论如何,它们都会被 C# 编译器优化为常量。

出于某种原因,使用在 .NET 4.6.1 上运行的 C# 7.2 编译器,在 x86 和 x64(经过优化)上,“变量”版本似乎比“stackalloc”版本快约 20%。尚未检查较新/较旧框架的性能,但怀疑它会相似,所以我的问题不仅仅针对 4.6.1,因为通常情况下stackalloc 速度较慢。

考虑到两个版本分配完全相同的内存量(12 * sizeof(ulong))并以相同的顺序执行完全相同的操作,是否有任何理由使 stackalloc 版本变慢?我真的更喜欢通过 stackalloc 而不是变量来处理数组。

0 投票
0 回答
132 浏览

c# - C#- 检查堆栈是否有足够的可用内存

而不是堆分配和固定我需要的指针表作为本地方法,我希望stackalloc尽可能地使用它。这是关键代码,事实上它可以说是我系统中最关键的部分,所以我不想简单地捕获溢出然后在堆上重新分配它并将指针交回。我想在决定是否调用之前stackalloc检查是否有足够的可用堆栈内存,或者如果没有足够的可用空间,则手动分配一些非托管内存。

Tl;博士; 如何检查当前线程的堆栈上有多少可用内存?或者,是否有其他方法可以(有效地)stackalloc处理没有足够可用内存来完成的情况?

0 投票
1 回答
1409 浏览

c++ - stackalloc 是如何工作的?

您好,我想弄清楚它是如何工作的stackalloc。所以C/C++根据我的知识(有限),您不能像这里那样动态地在堆栈上分配内存:

C/C++例子:

然后C#开始发挥作用,你可以这样做stackalloc

分配的全部意义不stack在于知道compile-timeprecompile-timemacros等)数组的大小吗?C#如何管理这个"magic"?堆栈帧将如何创建?