0

自分のconst属性で困っていました。関数が原因で、const データを完全に保護できませんでした。関数はすべてを変更できます。

const referenceアドレスが必要なため、ひどいことです。それが const 変数のアドレスである場合、ほとんどの場合、変数データは引き続き変更または変更できます。私のデータは書き込み可能です。C++ では完全に合法であるため、パーサーはこの種のコードを防止 (無視) できません。

scanf("%d", &const_var);

データをロックし、const データを変更不可 (または書き込み不可) にする方法は?

4

3 に答える 3

3

この場合...

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

...foo実際に変更される可能性があります。または、他のほとんどのことが発生する可能性があります。コンパイラはこれをキャッチできません。これは、チェックなしで、任意のタイプの任意の数のパラメータを渡すことができるscanf旧式のcを使用しているためです。varargs渡されたパラメータがアドレスであることを保証する試みはありません。intのアドレスは言うまでもなく、非constintのアドレスではありません。

より安全なC++コードのためprintf/sscanfに、関数ファミリーを完全に使用することは避けてください。

Lintまたは他のソースコードチェッカーがここで役立つ可能性があります。私はこの特定のケースでそれを試していません。

于 2013-02-26T10:25:28.953 に答える
1

C++ は安全な言語ではありません。C++ では、不正行為ではなく、事故から身を守ることしかできませ。ユーザーが変更できないはずのものを変更したい場合は、次のように簡単です。

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

  change.X = ...;
}

あなたのコードと彼らのコードの間の契約に違反することを決定したユーザーから身を守るためにできることは何もありません。誤って契約を破棄しようとしたユーザーから身を守ることしかできません。クラスのプライベートメンバーを保護することさえできません。型を別のものにキャストして、メモリを直接突くことができるからです。

あなたの最善の策はこれです:心配しないでください。ユーザーが変数で間違ったことをした場合、結果として発生する破損はユーザーの責任です。

于 2013-02-27T08:50:31.447 に答える
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 に答える