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/