Chinaunix首页 | 论坛 | 博客
  • 博客访问: 328102
  • 博文数量: 57
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 769
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-29 14:57
文章分类
文章存档

2014年(39)

2013年(13)

2012年(5)

我的朋友

分类: C/C++

2014-06-10 14:25:10

文档:CERT C Programming Language Secure Coding Standard

在能使用宏或inline的情况下,建议使用inline。

1.不合理的宏使用

点击(此处)折叠或打开

  1. #define CUBE(X) ((X) * (X) * (X))
  2. int i = 2;
  3. int a = 81 / CUBE(++i);
 a扩展(结果未定义):

点击(此处)折叠或打开

  1. int a = 81 / (++i * ++i * ++i)
采用inline函数解决:

点击(此处)折叠或打开

  1. inline int cube(int i) {
  2.     return i * i * i;
  3. }
  4. /* ... */
  5. int i = 2;
  6. int a = 81 / cube(++i);


2.全局变量和局部变量同名:宏在函数内展开,对局部变量count进行++操作,全局变量值为0.

点击(此处)折叠或打开

  1. size_t count = 0;
  2. #define EXEC_BUMP(func) (func(), ++count)
  3. void g(void) {
  4.     printf("Called g, count = %d.\n", count);
  5. }
  6. void aFunc(void) {
  7.     size_t count = 0;
  8.     while (count++ < 10) {
  9.         EXEC_BUMP(g);
  10.     }
  11. }
采用inline函数:函数编译时绑定全局变量count。

点击(此处)折叠或打开

  1. size_t count = 0;
  2. void g(void) {
  3.     printf("Called g, count = %d.\n", count);
  4. }
  5. typedef void (*exec_func)(void);
  6. inline void exec_bump(exec_func f) {
  7.     f();
  8.     ++count;
  9. }
  10. void aFunc(void) {
  11.     size_t count = 0;
  12.     while (count++ < 10) {
  13.         exec_bump(g);
  14.     }
  15. }

3.

点击(此处)折叠或打开

  1. #define SWAP(x,y) \
  2.     (x) ^= (y); \
  3.     (y) ^= (x); \
  4.     (x) ^= (y)

  5. /* ... */

  6. if (a>b)
  7.     SWAP(a,b);
宏扩展后,只有x ^=y进入到条件判断语句内。

点击(此处)折叠或打开

  1. if (a>b)
  2.     x ^= y;
  3. y ^= x;
  4. x ^= y;
采用inline函数:

点击(此处)折叠或打开

  1. inline void swap(int *x, int *y) {
  2.     *x ^= *y;
  3.     *y ^= *x;
  4.     *x ^= *y;
  5. }
  6. /* ... */
  7. if (a>b)
  8.     swap(&a,&b);




阅读(300) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~