我希望根据文件是否已经存在而写入文件,只有在文件尚不存在时才写入(实际上,我希望继续尝试文件,直到找到不存在的文件).
以下代码显示了潜在攻击者可以插入符号链接的方式,如本文所述,在文件测试和正在写入的文件之间.如果代码以足够高的权限运行,则可能会覆盖任意文件.
有什么方法可以解决这个问题吗?
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) 在考虑设计时,在哪些情况下使用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) numpy.float128在内部映射到什么精度?是__float128还是长双?(或完全不同的东西!?)
如果有人知道,可能会有一个问题:在C中将__float128强制转换为(16字节)长的双精度是否安全?(这是为了与长双打的C lib接口).
编辑:响应评论,该平台是'Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric'.现在,如果numpy.float128具有依赖于平台的不同精度,那对我来说也是有用的知识!
需要明确的是,这是我感兴趣的精度,而不是元素的大小.
在某些情况下,人们在编译时知道特定的算法数据是什么样的,因此可能希望将此信息传达给编译器.这个问题是关于如何最好地实现这一点.
举例来说,考虑以下稀疏矩阵乘法的例子,其中矩阵是常数并且在编译时是已知的:
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) 我想,以下代码描述了我想要做的事情.具体来说,我希望将函数指针强制转换为泛型函数类型,唯一的区别在于签名是不同的指针类型.
现在,我知道要求函数指针兼容,如本问题所述,但我不确定是否有不同指针类型的参数满足兼容性要求.
代码编译并运行,但是,正如预期的那样,从不兼容的指针类型给出有关赋值的警告.有没有办法满足编译器并实现我的目标?
#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) 我需要将文本文件或文本文件的内容传递给过程宏,以便过程宏在编译时根据该文本文件的内容进行操作。也就是说,文本文件配置宏的输出。其用例是定义宏构建到库中的寄存器映射的文件。
第二个要求是文本文件由 正确处理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)
此时我有两个问题:
Span,但似乎一般不会(也许我错过了一些东西?)。Cargo如何使文件 make触发更改后的重新编译并不明显。我必须强制执行的一个想法是在宏的输出中添加 an include_str!("myfile"),这有望导致编译器意识到“myfile”,但这有点麻烦。有什么方法可以做我想做的事情吗?也许通过某种方式获取外部创建的宏内的字符串内容,或者可靠地获取调用 rust 文件的路径(然后Cargo正确进行处理更改)。
顺便说一句,我读过很多地方告诉我无法访问宏内变量的内容,但在我看来,这正是宏quote正在做的事情#variables。这是如何运作的?
我正在创建一个程序宏,它从某些配置文件自动生成一个库(它是一个寄存器布局,但这对于问题来说并不重要)。
我希望该库自动生成自动库随附的文档,并包含应与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,但这违反了卫生规则。
我的理解是,如果我使用标志设置一个cl_mem对象,那么该内存块现在就在设备的控制之下.clCreateBufferCL_MEM_USE_HOST_PTR
如果我希望以某种方式改变主机上的内存,我应该首先使用内存映射clEnqueueMapBuffer,它返回一个指针.
在这种情况下保证返回的指针是否与用于创建缓冲区的指针相同(即我clCreateBuffer最初传递给它),尽管类型是void *?
通过扩展,如果我现在希望将内存控制权返回给设备,我是否可以调用clEnqueueUnmapMemObject并使用用于为mapped_pointer参数创建缓冲区的原始指针?
编辑:进一步的调查表明,如果在调用时使用非零偏移量,指针显然不会相同clEnqueueMapBuffer.因此,上述问题中,都在的情况下我也设置了零偏移.
我有一个nvidia GTX 750 Ti卡,它被宣传为具有640个CUDA核心.实际上,nvidia设置应用程序也报告了这一点.
我正在尝试使用此卡在Linux上进行OpenCL开发.现在,我已经从OpenCL环境(通过PyOpenCL,如果它有所作为)报告计算单元的数量是5.我的理解是nvidia设备上的一个计算单元映射到一个多处理器,我理解为32 SIMD单位(我假设是CUDA核心).
显然,5*32不是640(相当于预期的四分之一).
我是否遗漏了有关nvidia工作单位含义的内容?该卡还驱动图形输出,它将使用一些计算能力 - 是为图形使用保留的处理能力的一部分?(如果是的话,我可以改变吗?).
我们的测试方法将测试文档作为文档输出中的第一类对象。具体来说,它定义了每个行为测试所测试的规范。
在具有适当记录的测试的项目上运行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模块的文档输出。我意识到一个额外的复杂性是测试是私有的,理想情况下我能够记录私有测试而无需记录其他私有对象。
当前_mm_i32gather_epi32()的英特尔内在函数指南将每个子字的计算地址描述为:
addr := base_addr + SignExtend64(vindex[m+31:m]) * ZeroExtend64(scale) * 8
Run Code Online (Sandbox Code Playgroud)
最后8个让我困惑。假设addr和base_addr以字节为单位,并且scale取值为 1、2、4 或 8,那么您只能从基地址索引 8 个字节的步长。这是文档中的错误,还是我遗漏了什么?我检查过的所有收集指令的描述方式都是相同的。
上一个问题引用的文档没有 8,这表明某些内容已经发生了变化。
在编译时知道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 ×5
rust ×4
opencl ×3
python ×3
rust-macros ×3
optimization ×2
avx ×1
avx2 ×1
bdd ×1
c++ ×1
doctest ×1
gpgpu ×1
intrinsics ×1
linux ×1
numpy ×1
nvidia ×1
pyopencl ×1
rust-cargo ×1
simd ×1
testing ×1
unit-testing ×1