0

我对自己的const属性有问题。由于功能,我无法完全保护我的 const 数据。函数可以修改一切。

const reference是一件可怕的事情,因为它需要一个地址;如果它是 const 变量的地址,则很可能变量数据仍然可以更改或修改。我的数据是可写的。解析器无法阻止(忽略)这种代码,因为它在 C++ 中是完全合法的。

scanf("%d", &const_var);

如何锁定我的数据并使我的 const 数据不可修改(或不可写)?

4

3 回答 3

3

在这种情况下...

scanf("%d", &foo); // Out of range!!!

...foo确实可以修改,或者几乎可以发生任何其他事情。编译器无法捕捉到这一点,因为scanf使用老式 cvarargs允许传递任意数量的任何类型的参数,而无需进行任何检查。没有尝试确保传递的参数是地址,更不用说 int 的地址,当然也不是非常量 int 的地址。

为了更安全的 C++ 代码,请printf/sscanf完全避免使用函数族。

Lint 或其他一些源代码检查器可以在这里提供帮助。我还没有尝试过这个特定的案例。

于 2013-02-26T10:25:28.953 回答
1

您无法直接保护自己免受此类情况的影响。如果将常量放在可写内存中,则可以始终获取该常量的地址并以一种或另一种方式对其进行修改。但请记住,该标准说,修改常量值被认为具有未定义的行为。

如果您希望常量不可修改,您可以制定解决方法并使用宏:

#define foo 100

foo这是一个技巧,因为它会将源中所有出现的转换为100,但是没有人能够在运行时修改它的值(根据定义,100 是 100)。

但是,我会避免使用宏。您可以改用另一种解决方法:定义一个函数:

constexpr int FooValue()
{
    return 100;
}

也没有人能够修改它,但是这个解决方案允许您在类或命名空间中嵌入这样的“常量”。如果您使用可以处理 C++11 的编译器,则使用 constexpr 将允许您在任何地方输入此函数,您可能在其中插入了一个常量,例如:

int array[FooValue()];
于 2013-02-26T10:24:37.813 回答
1

C++ 不是一种安全的语言。在 C++ 中,你只能保护自己免受意外,而不是背信弃义。如果用户想要更改他们不应该更改的内容,就这么简单:

void SomeFunc(const Obj &dontChange)
{
  Obj &change = const_cast<Obj &>(dontChange);

  change.X = ...;
}

您无法保护自己免受决心违反您的代码与他们的代码之间的合同的用户的伤害。您只能保护自己免受意外试图破坏合同的用户的伤害。你甚至不能保护你的类的私有成员,因为他们可以简单地将类型转换为其他东西并直接戳内存。

你最好的选择是:别担心。如果用户对某个变量做了错误的事情,那么因此发生的任何损坏都是他们的错。

于 2013-02-27T08:50:31.447 回答