注:本课程参考文献《C安全编码标准》
欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~
一.不安全代码
在下述不兼容的代码示例中,C语言标准程序库的头文件
<inttypes.h>
包含了
<stdint.h>
,而名称
MAX_SIZE
与表示
size_t
上限的标准宏名称相同,因此产生了冲突。另外,尽管C语言标准库没有定义名为
INTFAST16_LIMIT_MAX
的标识符,但由于它以
INT
为前缀,并以
_MAX
为后缀,所以它也被视为一个保留的标识符。
#include <inttypes.h>
#include <stdio.h>
static const int_fast16_t INTFAST16_LIMIT_MAX = 12000;
void print_fast16(int_fast16_t val){
enum { MAX_SIZE = 80 };
char buf[MAX_SIZE];
if (INTFAST16_LIMIT_MAX < val) {
sprintf(buf,"The value is too large");
} else {
snprintf(buf,MAX_SIZE,"The value is %" PRIdFAST16,val);
}
}
二.解决方案
通过避免重新定义保留名称,或者使用保留的前缀及后缀。
#include <inttypes.h>
#include <stdio.h>
static const int_fast16_t MY_INTFAST16_UPPER_LIMIT = 12000;
void print_fast16(int_fast16_t val) {
enum { BUFSIZE = 80 };
char buf[BUFSIZE];
if (MY_INTFAST16_UPPER_LIMIT < val){
sprintf(buf,"The value is too large");
} else {
snprintf(buf,BUFSIZE,"The value is %" PRIdFAST16,val);
}
}
三.练习和答案
案例一:
问题描述:
在尝试编译以下C语言代码时,编译器报错指出
MAX_SIZE
和
INTFAST16_LIMIT_MAX
的命名冲突。代码的目的是打印一个
int_fast16_t
类型的值,如果值超过设定的上限则提示值过大。
代码示例:
#include <inttypes.h>
#include <stdio.h>
static const int_fast16_t INTFAST16_LIMIT_MAX = 12000;
void print_fast16(int_fast16_t val){
enum { MAX_SIZE = 80 };
char buf[MAX_SIZE];
if (INTFAST16_LIMIT_MAX < val) {
sprintf(buf,"The value is too large");
} else {
snprintf(buf,MAX_SIZE,"The value is %" PRIdFAST16,val);
}
printf("%s\n", buf);
}
int main() {
print_fast16(15000);
return 0;
}
答案:
编译器报错,因为
MAX_SIZE
可能与
<inttypes.h>
或
<stdint.h>
中定义的宏冲突,同时
INTFAST16_LIMIT_MAX
使用了保留的命名模式。
案例二:
问题描述:
修正上述代码,以避免命名冲突,并确保代码可以成功编译和运行。
代码示例:
#include <inttypes.h>
#include <stdio.h>
static const int_fast16_t MY_INTFAST16_UPPER_LIMIT = 12000;
void print_fast16(int_fast16_t val) {
enum { BUFSIZE = 80 };
char buf[BUFSIZE];
if (MY_INTFAST16_UPPER_LIMIT < val){
sprintf(buf,"The value is too large");
} else {
snprintf(buf,BUFSIZE,"The value is %" PRIdFAST16,val);
}
printf("%s\n", buf);
}
int main() {
print_fast16(10000);
return 0;
}
答案:
代码成功编译和运行,没有命名冲突,可以正确地打印出
int_fast16_t
类型的值或者提示值过大。
非常感谢您花时间阅读我的博客,希望这些分享能为您带来启发和帮助。期待您的反馈与交流,让我们共同成长,再次感谢!
👇热门内容👇
python使用案例与应用_安城安的博客-CSDN博客
软硬件教学_安城安的博客-CSDN博客
Orbslam3&Vinsfusion_安城安的博客-CSDN博客
网络安全_安城安的博客-CSDN博客
教程_安城安的博客-CSDN博客
python办公自动化_安城安的博客-CSDN博客
👇个人网站👇
安城安的云世界
版权归原作者 安小呆 所有, 如有侵权,请联系我们删除。