代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

丢弃挥发性物质安全吗?

c++
  •  8
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    大多数时候,我都是这样做的。

    class a {
    public:
        ~ a() {
            i = 100;          // OK
            delete (int *)j;  // Compiler happy. But, is it safe?
                              // The following code will lead compilation error : delete j;
        }
    
    private:
        volatile int i;
        volatile int *j;
    };
    
    int main() {
        a aa;
    
    }
    

    但是,我在这里看到一篇文章:

    https://www.securecoding.cert.org/confluence/display/seccode/EXP32-C.+Do+not+access+a+volatile+object+through+a+non-volatile+reference

    丢弃挥发性物质可以进入 通过非易失性的物体 参考。这会导致 未定义,可能是无意的 程序行为。

    那么,我上面的代码示例的解决方法是什么?

    这是如果我使用

    删除j

    注意,这是VC6的输出(不要问我为什么要使用VC6!)

    C:\Projects\A\A.cpp(5):错误C2664: “delete”:无法转换参数1 从“volatile int*”到“void*” 转换丢失限定符

    4 回复  |  直到 13 年前
        1
  •  4
  •   Richard Pennington    14 年前

    没有什么。如果不访问易失性内存,则不影响易失性的语义。如果您通过铸造的非易失性指针访问易失性内存,编译器可能会将引用优化掉。如果这个值改变了,你会得到错误的值。为了一些错误的价值。;-)

    删除不访问易失性内存,它只是释放它。与易失性记忆有关的事情有点罕见。

        2
  •  3
  •   Potatoswatter    14 年前

    delete A型 volatile 这意味着你已经序列化了对它的访问,所以事实上,它不是, 不稳定的 再。去除挥发性物质的正确方法是 const_cast<int*> .

    如果指针,而不是 int 是不稳定的,那么你真的是说 int *volatile j . 此外,如果一个类的所有成员都是可变的,那么您可能希望一次限定整个对象, a volatile aa; .

        3
  •  2
  •   zneak    14 年前

    它取决于您期望的挥发性变量的含义。马上, j 是指向可变整数的指针;这就是您的意思吗?如果是这样,它是安全的,因为您不需要访问易失性值,只需要访问它的地址,而不需要访问易失性值。

    但是,如果您想要一个指向整数的易失性指针,那么所需的语法是 int* volatile j . 在这种情况下,将其强制转换为- volatile 首先是指针,但我认为如果您试图 delete 就这样。例如,G++,没有。

        4
  •  0
  •   Carl Norum    14 年前

    没关系,因为你不是 访问 变量后丢弃 volatile . 不过,我不知道你为什么会出错。我自己试过代码,一切似乎都很顺利,你看到了什么?