We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
rust-lang/rust#66136 检查 指针转换,检查是不是可能自动替换,或者构建一个工具来自动替换。
The text was updated successfully, but these errors were encountered:
我阅读了相关的文档。 https://blog.slanterns.net/Subtyping-Variance-Cell-UnsafeCell/ 这个我觉得还是比较详细的一个指引 一、模式和原因 然后试图总结这种情况可能会引起问题的模式和原因,总结如下: 1、UnsafeCell是唯一允许在获得一个不可变引用的情况下修改其内容的方法,因为这里面有编译器开窗,所以他会有特定的判定 2、是一个不可变引用&T,强制转为*const T并再试图转为&mut T。 3、发生错误的原因是,因为生命周期的问题,在一个短生命周期中试图给这个不可变引用修改值。然而编译器本身不能识别这个事情(只有unsafecell可以识别出来),所以错误的把一个栈上面的数据写入了。从而在短生命周期结束后,自动的释放掉了。
二、对于识别。 第一,必须是满足第二条的一个模式,在rel4中,直接满足的情况,很少,非常少,我试图直接修改了他(并且运行一切正常)具体修改在 rel4team/mi-dev-integral-rel4#1 第二,关于变量的生命周期,其实,在rel4中,有些变量是static的全局变量,他并不会被分配到栈上面,虽然我确实在上面的修改的部分直接修改了他。所以,一定是在函数内的生命周期(或者其他短生命周期的情况下)
三、疑问 对于rel4中,很多很多很多地方。确切的说,绝大部分的用到了*mut T的地方,都是将这个裸指针*mut T转为一个usize或者将一个usize转为一个*mut T这种模式。然后,在作为返回值或者返回值结构体的一部分,并且显然这些都是unsafe的。以上是代码的模式,他并不符合上面的第二条模式。
然而,我无法确定在绝大多数情况下,这些usize实际上的指针,指向的到底是否是一个栈上的,还是一个堆上的地址,换而言之,这种情况下,使用*mut T转为usize并作为返回值(或其一部分)的时候,这个指针可能会因此泄漏出去,然后再在另一个地方通过将usize转为*mut T的方式再度使用,从而造成严重的问题。 我不确定的点在于,这种模式是否会被编译器识别出来并加以管理(我估计是不太能的) 因此,是否需要针对这些转为usize的情况,也进行修改? 我在上面的提交中,针对这种情况,我能判别的部分,同样进行了判断和修改。
四、关于这个修改未使用unsafecell的问题 我没有试图使用unsafecell,因为看上去,我们涉及到的代码应该不需要这个东西——这个unsafecell的重点按照我的理解是,我获得了一个不可变的引用,但是试图把它当成可变引用并修改它里面的内容,才不得不使用这个东西,然而,我更改的地方,让他全都获得可变引用即可。
Sorry, something went wrong.
No branches or pull requests
rust-lang/rust#66136
检查 指针转换,检查是不是可能自动替换,或者构建一个工具来自动替换。
The text was updated successfully, but these errors were encountered: