标签: unsafe

是否有与/ unsafe标志对应的"预处理器"符号?

我正在处理一个WriteableBitmapC#.我目前正在使用不安全的代码块来直接访问像素WriteableBitmap.BackBuffer./unsafe但是,我宁愿不依赖于选项,所以我正在考虑使用WriteableBitmap.WritePixels.

是否有某种方式在"不安全"版本中有条件地编译,以便在使用/ unsafe编译选项时可以使用它,而无需手动集成到我的项目文件中?

总之,我正在寻找以下内容:

#if UNSAFE
   //my unsafe version
#else
   //the supposedly safe version goes here
#endif
Run Code Online (Sandbox Code Playgroud)

在运行时检测也很好; 但这意味着我总是需要编译使用 /unsafe,这意味着该库的代码需要的项目文件更新,这是不太方便的.

基本上,我想保留快速版本的重要性,但有一个合理的版本,无论如何都能正常工作.

c# wpf unsafe c-preprocessor

6
推荐指数
1
解决办法
1446
查看次数

使用不安全标记编译的.NET代码可以在Mono中运行吗?

我有一些代码使用LockBits方法进行位图操作,并使用指针直接访问位图数据.当然,这段代码必须包装在一个不安全的块中,我想知道这是否意味着代码在Mono中不起作用.

我假设Bitmap类在Mono中可用,但也许这是另一个交易破坏者.

.net mono unsafe bitmap

6
推荐指数
2
解决办法
2040
查看次数

为什么不能在迭代器上下文中使用unsafe关键字?

在看这个问题时,Jon在回答问题方面做得很好......" 如何用迭代器反向读取文本文件 ".并且有一个类似的问题,我回答使用指针hocus pocus ..'.net有一种方法从它自己关闭之前从下到上读取文本文件 ....

现在我开始尝试使用指针来解决这个问题,好吧,它看起来很粗糙和边缘粗糙......

public class ReadChar : IEnumerable<char>
{
    private Stream _strm = null;
    private string _str = string.Empty;
    public ReadChar(string s)
    {
        this._str = s;
    }
    public ReadChar(Stream strm)
    {
        this._strm = strm;
    }
    public IEnumerator<char> GetEnumerator()
    {
        if (this._strm != null && this._strm.CanRead && this._strm.CanSeek)
        {
            return ReverseReadStream();
        }
        if (this._str.Length > 0)
        {
            return ReverseRead();
        }
        return null;
    }

    private IEnumerator<char> ReverseReadStream()
    {
        long lIndex = this._strm.Length;
        while (lIndex != …

c# iterator unsafe

6
推荐指数
2
解决办法
3068
查看次数

在C#中不能将指针数组放在不安全的结构中的根本原因是什么?

如果可以将一个指向数组的指针放在C#中的不安全结构中的子结构中,就像在C中一样,构建复杂的数据结构而不会产生每个节点有一个对象的开销,这样会更容易,而且时间更少,以及语法更清晰,更易读.

是否有一个深层的架构原因,为什么不安全的结构中的固定数组只允许由"值类型"而不是指针组成?

我假设只有在结构中明确命名指针必须是故意削弱语言的决定,但我找不到任何关于为什么会这样的文档,或者不允许指针数组在结构中的原因,因为我会假设垃圾收藏家不应该关心被标记为不安全的结构.

数字火星'D优雅地处理结构和指针,我发现我无法快速开发简洁的数据结构; 通过在C#中引用抽象,很多功能似乎已从语言中删除,即使指针至少仍然存在于营销意义上.

也许我错误地期望语言随着时间的推移有效地表示复杂的数据结构.

c# struct pointers unsafe d

6
推荐指数
1
解决办法
271
查看次数

Sonar标志"糟糕的做法":如果扩展类,在XYZ中使用GetResource可能是不安全的

Sonar在我们的Java项目中指出了这个错误.欢迎任何安全编程的建议!

URL url = getClass().getResource("/myWonderfulResource.txt");
if (url == null) {
  throw new IllegalStateException("File not found: /myWonderfulResource.txt");
}
Run Code Online (Sandbox Code Playgroud)

java url unsafe getresource sonarqube

6
推荐指数
1
解决办法
2472
查看次数

如果C#指针被认为是"不安全的",这是否意味着C++指针也"不安全"?

我正在用C#做一个项目,它可以从线性代数包中受益.我看过那里的那些,但我真的不想付钱,或者我发现它们不是很好.所以我决定写自己的.

我读到C++数组比C#数组快得多,但是在C#中使用指针数组可以获得类似的性能,尽管它们被认为是"不安全的".我很想知道C++指针是如何不同的,如果"不安全"也适用于C++,或者它们是两个根本不同的东西.

c# c++ arrays pointers unsafe

6
推荐指数
2
解决办法
1380
查看次数

如何使用不安全的代码Unity

我想在c#中使用c ++代码来使用CLR进行统一.

该程序在统一之外正常工作,但在引擎内部它给我一个错误:
"cs0227:不安全的代码需要指定'unsafe'命令行选项"

我真的很困惑,因为该项目在visual studio中成功构建(没有任何错误或警告).我已激活" 允许 不安全 "按钮.

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


public class newspawn_real : MonoBehaviour {

void Start () {

    unsafe
        {

            fixed (int * p = &bam[0, 0, 0])
            {
                CppWrapper.CppWrapperClass controlCpp = new CppWrapper.CppWrapperClass();

                controlCpp.allocate_both();
                controlCpp.fill_both();
                controlCpp.fill_wrapper();
}
Run Code Online (Sandbox Code Playgroud)

c# c++ clr unsafe unity-game-engine

6
推荐指数
2
解决办法
1万
查看次数

允许Jetbrains骑手使用不安全的代码?

我需要unsafe用C#编写一个方法,显然“在安全上下文中不能使用不安全的构造”。我去了项目属性,并看到了一个允许在Debug和Release版本中使用不安全代码的开关。

但是,它不可单击。

在此处输入图片说明

如何为我的项目允许使用不安全的代码?

编辑:添加<AllowUnsafeBlocks>true</AllowUnsafeBlocks>PropertyGroup标签中的csproj文件不解决这个问题,但我不知道是否有一种方法在IDE本身要做到这一点,因为我期望的IDE能够做到这些类的东西。

c# unsafe rider

6
推荐指数
1
解决办法
1122
查看次数

如何从golang中的数组unsafe.Pointer创建数组或切片?

一个指向数组的指针,让我们说:

p := uintptr(unsafe.Pointer(&array))
size := 5
Run Code Online (Sandbox Code Playgroud)

我无法访问变量array,上面的代码用于使其更清晰.

另外,我知道数组的大小,但size它不是常量,它会根据运行时间而变化.

现在,我想用已知的指针,大小以及数据类型初始化切片或数组.

我想出了以下代码:

data := make([]byte, size)
stepSize := unsafe.Sizeof(data[0])
for i := 0; i < size; i++ {
    data[i] = *(*byte)(unsafe.Pointer(p))
    p += stepSize
}
fmt.println(data)
Run Code Online (Sandbox Code Playgroud)

但是这个方法会进行内存复制,这可能是效率低下的,无论如何都没有复制?

PS我也试过以下两种方法,

// method 1
data := *(*[]byte)(unsafe.Pointer(p))
// method 2
data := *(*[size]byte)(unsafe.Pointer(p))
Run Code Online (Sandbox Code Playgroud)

但它会在运行时失败,我现在知道它的原因.

arrays pointers unsafe go slice

6
推荐指数
2
解决办法
1540
查看次数

使用"部分"时为什么类级"不安全"修饰符不一致?

我已经注意到unsafe在类级别上对部分类使用修饰符时的某种行为,我希望得到一些澄清.

我一直在研究一个相当大的包装器,为了理智,我使用partial修饰符分割多个文件.包装器大量使用unsafe指针,因此我选择在类级别上简单地声明它以覆盖其中的所有内容.

public static unsafe partial class Ruby
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static VALUE CLASS_OF(VALUE obj) => ((RBasic*) obj)->klass;
}
Run Code Online (Sandbox Code Playgroud)

在另一个文件中:

public static unsafe partial class Ruby
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public static void* DATA_PTR(VALUE obj) => ((RData*) obj)->data;
}
Run Code Online (Sandbox Code Playgroud)

unsafe修改需要每个部分的声明,以使不安全的代码被"允许"和编译,这是可以理解的,我希望,对于部分类的类声明将需要完全匹配.

但是使用那个逻辑,我也被允许有另一个不是的文件unsafe:

[SuppressUnmanagedCodeSecurity]
public static partial class Ruby
{
    [DllImport(RUBY_LIBRARY, CallingConvention = CallingConvention.Cdecl)]
    public static extern VALUE rb_ivar_get(VALUE obj, ID name);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我不使用unsafe修饰符,它是完全可以接受的(显然在这个文件中没有不安全的代码).

我是什么希望得到澄清为什么这允许.每个分类的类声明不应该完全匹配吗?改变/不包括任何其他类改性剂是不允许的,例如private,public,abstract等等,所以这是为什么好吗用unsafe …

c# unsafe

6
推荐指数
1
解决办法
127
查看次数

标签 统计

unsafe ×10

c# ×7

pointers ×3

arrays ×2

c++ ×2

.net ×1

bitmap ×1

c-preprocessor ×1

clr ×1

d ×1

getresource ×1

go ×1

iterator ×1

java ×1

mono ×1

rider ×1

slice ×1

sonarqube ×1

struct ×1

unity-game-engine ×1

url ×1

wpf ×1