2017-01-02 11 views
2

定数整数ポインタの値をbで変更することができます。 は、誤って値を変更/制限することはできますか?理解関数(const int * a)整数定数へのポインタ

#include <stdio.h> 

/** 
* Snippet to under working of "pointer to integer(any) constant" 
* 
* We are able to modify the value of constant integer pointer by b, how 
* can we make sure/restrict accidentally modification of the value . 
* 
*/ 

void modify_value(const int *m, const int *n) { 
    //*m = 50;   // expected error, assignment of read-only location 
    *((int*)n) = 100; // value of pointed by pointer gets updated !! 
} 

int main() { 
    int a=5,b=10; 
    printf("a : %d , b : %d \n", a,b); 
    modify_value(&a,&b); 
    printf("a : %d , b : %d \n", a,b); 
    return 0; 
} 
+4

'const'をキャストしないでください。これに関する警告が必要な場合は、例えばGCCに '-Wcast-qual'があります。 – Ryan

+0

@ Ryan、私は一度const int *を渡すと思っていましたが、コンパイラは、指された値を修正することはできません。 プロダクションコードでconst値を明示的に変更しようとしても、これを完全に防ぐことができないのだろうかと思います。 – CrazyToExpplore

+0

つまり、 '-Werror = cast-qual'を使うことができます...? – Ryan

答えて

3

私が知る限り、これを防ぐための防水方法はありませんが、誤ってこれを回避する方法があります。

たとえば、いくつかのコンパイラには警告があり、警告にエラーを付けることさえできます(警告がトリガされた場合はコンパイルできません)。たとえば、GCCでは-Wcast-qual-Werror(または-Werror=cast-qual)を使用できます。しかし、これは、多くの警告のために回避する方法があるので、const *が指すデータを変更することを完全に防止しません。例えば、(int*)((char const*)m - (char*)NULL)のような整数型のキャストではキャストできますが、これは移植可能な構造ではないことに注意してください(ただしキャスト・アウェイ・コンスタンスは移植性のない構造です)。

GCCを再コンパイルして修飾子を追跡し、これらの回避策のいくつかを禁止することもできますが、それは標準適合性を犠牲にしている可能性があります。

もう1つの解決策は、何らかの種類の糸くずツールを使用することです。これらは、通常のコンパイラが渡す警告を出すことがあります。また、ビルドスクリプトでは、通常、これらのlint-warningsをビルドエラーと見なすことができます(そして、lint警告を含むファイルをコンパイルしません)。

関連する問題