小编Hen*_*all的帖子

当且仅当python不存在时才安全地创建文件

我希望根据文件是否已经存在而写入文件,只有在文件尚不存在时才写入(实际上,我希望继续尝试文件,直到找到不存在的文件).

以下代码显示了潜在攻击者可以插入符号链接的方式,如本文所述,在文件测试和正在写入的文件之间.如果代码以足够高的权限运行,则可能会覆盖任意文件.

有什么方法可以解决这个问题吗?

import os
import errno

file_to_be_attacked = 'important_file'

with open(file_to_be_attacked, 'w') as f:
    f.write('Some important content!\n')

test_file = 'testfile'

try:
    with open(test_file) as f: pass
except IOError, e:

    # symlink created here
    os.symlink(file_to_be_attacked, test_file)

    if e.errno != errno.ENOENT:
        raise
    else:
        with open(test_file, 'w') as f:
            f.write('Hello, kthxbye!\n')
Run Code Online (Sandbox Code Playgroud)

python

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

什么时候在python中使用class与dict?

在考虑设计时,在哪些情况下使用class与dict是否有意义?优点和缺点也很有用.

例如,

class AlbumState:
    """ AlbumState class, tracks photos shown, etc"""

    def __init__ (self, album):
        """ album for this object will track state"""
        self.album = album

        self.photos_shown = []
        self.photos_notshown = range(album.size())
Run Code Online (Sandbox Code Playgroud)

albumstate['album'] = album
albumstate['photos_shown'] = []
albumstate['photos_notshown'] = range(album.size())
Run Code Online (Sandbox Code Playgroud)

python

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

numpy.float128的内部精度是多少?

numpy.float128在内部映射到什么精度?是__float128还是长双?(或完全不同的东西!?)

如果有人知道,可能会有一个问题:在C中将__float128强制转换为(16字节)长的双精度是否安全?(这是为了与长双打的C lib接口).

编辑:响应评论,该平台是'Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric'.现在,如果numpy.float128具有依赖于平台的不同精度,那对我来说也是有用的知识!

需要明确的是,这是我感兴趣的精度,而不是元素的大小.

c python numpy

25
推荐指数
3
解决办法
2万
查看次数

编译时间数据特定的优化

在某些情况下,人们在编译时知道特定的算法数据是什么样的,因此可能希望将此信息传达给编译器.这个问题是关于如何最好地实现这一点.

举例来说,考虑以下稀疏矩阵乘法的例子,其中矩阵是常数并且在编译时是已知的:

matrix = [  0, 210,   0, 248, 137]
         [  0,   0,   0,   0, 239]
         [  0,   0,   0,   0,   0]
         [116, 112,   0,   0,   7]
         [  0,   0,   0,   0, 165]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,可以编写完全无分支的实现来实现任意输入向量的矩阵向量乘法:

#include <stdio.h>

#define ARRAY_SIZE 8
static const int matrix[ARRAY_SIZE] = {210, 248, 137, 239, 116, 112, 7, 165};
static const int input_indices[ARRAY_SIZE] = {1, 3, 4, 4, 0, 1, 4, 4};
static const int output_indices[ARRAY_SIZE] = {0, 0, 0, 1, 3, 3, 3, 4};

static void …
Run Code Online (Sandbox Code Playgroud)

c optimization

8
推荐指数
1
解决办法
163
查看次数

使用不同指针类型作为参数来转换函数指针

我想,以下代码描述了我想要做的事情.具体来说,我希望将函数指针强制转换为泛型函数类型,唯一的区别在于签名是不同的指针类型.

现在,我知道要求函数指针兼容,本问题所述,但我不确定是否有不同指针类型的参数满足兼容性要求.

代码编译并运行,但是,正如预期的那样,从不兼容的指针类型给出有关赋值的警告.有没有办法满足编译器并实现我的目标?

#include <stdio.h>

int float_function(float *array, int length)
{
    int i;
    for(i=0; i<length; i++){
        printf("%f\n", array[i]);
    }
}

int double_function(double *array, int length)
{
    int i;
    for(i=0; i<length; i++){
        printf("%f\n", array[i]);
    }
}


int main() 
{
    float a[5] = {0.0, 1.0, 2.0, 3.0, 4.0};    
    double b[5] = {0.0, 1.0, 2.0, 3.0, 4.0};

    int (*generic_function)(void*, int) = NULL;

    generic_function = &float_function;
    generic_function(a, 5);

    generic_function = &double_function;
    generic_function(b, 5);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c function-pointers

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

处理传递给过程宏的编译时相关文本文件的正确方法

我需要将文本文件或文本文件的内容传递给过程宏,以便过程宏在编译时根据该文本文件的内容进行操作。也就是说,文本文件配置宏的输出。其用例是定义宏构建到库中的寄存器映射的文件。

第二个要求是文本文件由 正确处理Cargo,以便对文本文件的更改触发重新编译,就像对源文件的更改触发重新编译一样。

我最初的想法是使用宏创建一个static字符串include_str!。这解决了第二个要求,但我不知道如何将传递给宏 - 此时我只有要传入的字符串的标识符:

use my_macro_lib::my_macro;
static MYSTRING: &'static str = include_str!("myfile");
my_macro!(MYSTRING); // Not the string itself!
Run Code Online (Sandbox Code Playgroud)

我可以将一个字符串传递给宏,其中包含字符串文字中的文件名,然后在宏内打开该文件:

my_macro!("myfile");
Run Code Online (Sandbox Code Playgroud)

此时我有两个问题:

  1. 如何获取调用函数的路径以获取文件的路径并不明显。我最初认为这会通过 token 暴露Span,但似乎一般不会(也许我错过了一些东西?)。
  2. Cargo如何使文件 make触发更改后的重新编译并不明显。我必须强制执行的一个想法是在宏的输出中添加 an include_str!("myfile"),这有望导致编译器意识到“myfile”,但这有点麻烦。

有什么方法可以做我想做的事情吗?也许通过某种方式获取外部创建的宏内的字符串内容,或者可靠地获取调用 rust 文件的路径(然后Cargo正确进行处理更改)。

顺便说一句,我读过很多地方告诉我无法访问宏内变量的内容,但在我看来,这正是宏quote正在做的事情#variables。这是如何运作的?

rust rust-macros

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

推断调用包的名称以填充程序宏中的文档测试

我正在创建一个程序宏,它从某些配置文件自动生成一个库(它是一个寄存器布局,但这对于问题来说并不重要)。

我希望该库自动生成自动库随附的文档,并包含应与cargo test. 现在,我已经实现了其中大部分内容,但有一个问题我找不到解决方案。

假设我们有一个名为的库my_lib,我们在其中调用宏来填充它:

use my_macro_lib::hello;

hello!();
Run Code Online (Sandbox Code Playgroud)

它扩展到类似:

/// `foo` will always return `true`
/// ```
/// use my_lib;
/// assert!(my_lib::foo());
/// ```
pub fn foo() -> bool {
    true
}
Run Code Online (Sandbox Code Playgroud)

这将按预期运行 -cargo doc将做正确的事情并将cargo test按预期运行文档测试。

问题是,在这个例子中,use my_lib被硬编码到这my_macro_lib显然是不可取的。

如何创建一个宏来推断正在进行调用的板条箱的名称?

我尝试使用macro_rules!程序宏内部来扩展$crate,但这违反了卫生规则。

doctest rust rust-macros rust-proc-macros

4
推荐指数
1
解决办法
1654
查看次数

与CL_MEM_USE_HOST_PTR缓冲区一起使用的clEnqueueMapBuffer是否返回相同的主机指针?

我的理解是,如果我使用标志设置一个cl_mem对象,那么该内存块现在就在设备的控制之下.clCreateBufferCL_MEM_USE_HOST_PTR

如果我希望以某种方式改变主机上的内存,我应该首先使用内存映射clEnqueueMapBuffer,它返回一个指针.

在这种情况下保证返回的指针是否与用于创建缓冲区的指针相同(即我clCreateBuffer最初传递给它),尽管类型是void *

通过扩展,如果我现在希望将内存控制权返回给设备,我是否可以调用clEnqueueUnmapMemObject并使用用于为mapped_pointer参数创建缓冲区的原始指针?

编辑:进一步的调查表明,如果在调用时使用非零偏移量,指针显然不会相同clEnqueueMapBuffer.因此,上述问题中,都在的情况下我设置了零偏移.

c opencl

3
推荐指数
1
解决办法
709
查看次数

对nvidia GPU上的计算单元和预期核心的混淆

我有一个nvidia GTX 750 Ti卡,它被宣传为具有640个CUDA核心.实际上,nvidia设置应用程序也报告了这一点.

我正在尝试使用此卡在Linux上进行OpenCL开发.现在,我已经从OpenCL环境(通过PyOpenCL,如果它有所作为)报告计算单元的数量是5.我的理解是nvidia设备上的一个计算单元映射到一个多处理器,我理解为32 SIMD单位(我假设是CUDA核心).

显然,5*32不是640(相当于预期的四分之一).

我是否遗漏了有关nvidia工作单位含义的内容?该卡还驱动图形输出,它将使用一些计算能力 - 是为图形使用保留的处理能力的一部分?(如果是的话,我可以改变吗?).

linux gpgpu nvidia opencl pyopencl

3
推荐指数
1
解决办法
1301
查看次数

有没有某种方法可以构建包含测试文档字符串的 Rust 文档?

我们的测试方法将测试文档作为文档输出中的第一类对象。具体来说,它定义了每个行为测试所测试的规范。

在具有适当记录的测试的项目上运行cargo doc不会产生太多从测试文档字符串派生的文档,而且我看不到任何明显的方法使其在输出中包含测试文档字符串。

示例模块如下:

/// This function does some important stuff
pub fn working_fn() -> bool {
    true
}

#[cfg(test)]
mod tests {
    //! This is some important set of tests
    //!

    use super::*;

    /// The function should work
    #[test]
    fn it_works() {
        assert!(working_fn());
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了 public 的文档输出working_fn,但没有得到tests模块的文档输出。我意识到一个额外的复杂性是测试是私有的,理想情况下我能够记录私有测试而无需记录其他私有对象。

testing bdd unit-testing rust rust-cargo

3
推荐指数
1
解决办法
833
查看次数

在程序宏中,如何检查字符串是否是有效的变量名而不是关键字?

在过程宏中,我希望能够检查字符串是否是有效的变量名而不是关键字。

proc_macro2::Ident如果尝试使用无效的变量名将使用户感到恐慌,但是它将允许我不想使用的关键字。在惊慌之前用一个很好的和有用的错误消息来处理错误也将更好。

是否有一些宏或函数(位于板条箱中或其他方式)将检查字符串是否遵守有关变量名规则?我可能可以使用正则表达式来做到这一点,但是龙却生活在正则表达式中。

这种情况的用例是处理用户输入字符串,其中可能包括垃圾字符串。

rust rust-macros rust-proc-macros

3
推荐指数
1
解决办法
54
查看次数

AVX(2) 收集指令如何实际计算获取地址?

当前_mm_i32gather_epi32()的英特尔内在函数指南将每个子字的计算地址描述为:

addr := base_addr + SignExtend64(vindex[m+31:m]) * ZeroExtend64(scale) * 8
Run Code Online (Sandbox Code Playgroud)

最后8个让我困惑。假设addrbase_addr以字节为单位,并且scale取值为 1、2、4 或 8,那么您只能从基地址索引 8 个字节的步长。这是文档中的错误,还是我遗漏了什么?我检查过的所有收集指令的描述方式都是相同的。

上一个问题引用的文档没有 8,这表明某些内容已经发生了变化。

c++ simd intrinsics avx avx2

3
推荐指数
1
解决办法
423
查看次数

在编译时知道for循环的迭代次数是否有优势?

在编译时知道for循环应该进行多少次迭代是否有一些优势?

例如,在某些情况下,编译器可以生成一个可执行程序,运行速度更快,因为:

#define ITERATIONS 10
int foo()
{
    for (int i=0; i < ITERATIONS; i++){
        do_something();
    }
}
Run Code Online (Sandbox Code Playgroud)

比这个:

int foo(int iterations)
{
    for (int i=0; i < iterations; i++){
        do_something();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果情况不是普遍的话,那些情况是什么?

我关注的是OpenCL的具体情况,所以我也有兴趣知道这是否与C不同.

c optimization opencl

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