C/C++コードセキュリティ(一)

1698 ワード

  1:

            。

C11  :                      ,        。
#define assign(uc1,uc2,val) uc1##uc2 = val 

void func(){

    int u0401;

    assign(u04,01,4);

    printf("u0401 = %d
",u0401); } int main(){ func(); }
この結果は定義されていません.リンクえっ文字列を使用して値を割り当てないでください.ルール2:不正なマクロパラメータの使用を避ける
#define ABS(x)  (((x) < 0) ? -(x) : (x))

void fun(int n){
    /*
     *   n++;
     *   ABS(n);  right
     */
    ABS(n++);/*erro*/

}
nの加減に注意してください.ソリューション1:このマクロの代わりにインライン関数を書くか、静的関数を書くことができます.ソリューション2:モデルを使用したプログラミング_Genericパラメータ、パターン選択は値を求めないので、私たちの値は一度だけ求めます.
#include
#include
#include

static inline long labs(long v){
    return v < 0 ?  -v : v;
}

static inline int ilabs(int v){
    return v < 0 ? -v : v;
}

static inline short slabs(int v){
    return v < 0 ? -v : v;
}


#define ABS(v) _Generic(v,long : labs ,\
                          int  : ilabs ,\
                          short: slabs)(v)

void fun(int n){
    int m = ABS(++n);
}

int main(){

    fun(10);
}
ソリューション3:GCC拡張を使用しますが、プラットフォームの問題が発生します.
#define ABS(x) __extension__ ({__typeof(x) tmp = x ;\
                               tmp < 0 ? -tmp : tmp;})
ルール:クラス関数のマクロ呼び出しでプリプロセッサ命令を使用しない
void func(const char * src){

    char *dest;
    memcpy(dest,src,
        #ifdef A
          12
        #else 
          13
        #endif);

}
実はこのコードを書くことができる人の脳の穴も大きいので、安全問題には関係ないと思います.解決方法は簡単だから、ちゃんと書けばいい.
原文を参照:http://zmrlinux.com/2016/08/27/cc-%e4%bb%a3%e7%a0%81%e5%ae%89%e5%85%a8%ef%bc%88%e4%b8%80%ef%bc%89/