文档:CERT C Programming Language Secure Coding Standard
1.宏的变量名加上括号()
-
#define CUBE(I) (I * I * I)
-
int a = 81 / CUBE(2 + 1);
宏扩展后
-
int a = 81 / (2 + 1 * 2 + 1 * 2 + 1); /* evaluates to 11 */
在变量名加上括号问题得到解决:
-
#define CUBE(I) ( (I) * (I) * (I) )
-
int a = 81 / CUBE(2 + 1)
2.注意像函数的宏代替函数。
下面的代码调用puts不会打印任何东西。
-
#include <stdio.h>
-
#define puts(x)
-
/* ... */
-
puts("hello world!\n")
解决方式:使用()、#undef、extern
括号的方式:C99上说括号封闭函数名,函数的任何宏定义都会局部地禁止。
-
#include <stdio.h>
-
#define puts(x)
-
/* ... */
-
(puts)("I'm a library call!\n")
#undef方式
-
#include <stdio.h>
-
#define puts()
-
#undef puts
-
/* ... */
-
puts("I'm a library call!\n")
extern方式
-
extern int puts(char const *s);
-
/* ... */
-
puts("I'm a library call!\n")
3.别使用标准头文件名作为文件名
如果一个与标准头文件同名的文件放置在头文件(included source files)的搜索路径中,其行为是未定义的。
阅读(403) | 评论(0) | 转发(0) |