文档:CERT C Programming Language Secure Coding Standard
在能使用宏或inline的情况下,建议使用inline。
1.不合理的宏使用
-
#define CUBE(X) ((X) * (X) * (X))
-
int i = 2;
-
int a = 81 / CUBE(++i);
a扩展(结果未定义):
-
int a = 81 / (++i * ++i * ++i)
采用inline函数解决:
-
inline int cube(int i) {
-
return i * i * i;
-
}
-
/* ... */
-
int i = 2;
-
int a = 81 / cube(++i);
2.全局变量和局部变量同名:宏在函数内展开,对局部变量count进行++操作,全局变量值为0.
-
size_t count = 0;
-
#define EXEC_BUMP(func) (func(), ++count)
-
void g(void) {
-
printf("Called g, count = %d.\n", count);
-
}
-
void aFunc(void) {
-
size_t count = 0;
-
while (count++ < 10) {
-
EXEC_BUMP(g);
-
}
-
}
采用inline函数:函数编译时绑定全局变量count。
-
size_t count = 0;
-
void g(void) {
-
printf("Called g, count = %d.\n", count);
-
}
-
typedef void (*exec_func)(void);
-
inline void exec_bump(exec_func f) {
-
f();
-
++count;
-
}
-
void aFunc(void) {
-
size_t count = 0;
-
while (count++ < 10) {
-
exec_bump(g);
-
}
-
}
3.
-
#define SWAP(x,y) \
-
(x) ^= (y); \
-
(y) ^= (x); \
-
(x) ^= (y)
-
-
/* ... */
-
-
if (a>b)
-
SWAP(a,b);
宏扩展后,只有x ^=y进入到条件判断语句内。
-
if (a>b)
-
x ^= y;
-
y ^= x;
-
x ^= y;
采用inline函数:
-
inline void swap(int *x, int *y) {
-
*x ^= *y;
-
*y ^= *x;
-
*x ^= *y;
-
}
-
/* ... */
-
if (a>b)
-
swap(&a,&b);
阅读(300) | 评论(0) | 转发(0) |