C安全编程教学-声明和初始化-不要声明或者定义保留标识符(三)

C安全编程教学-声明和初始化-不要声明或者定义保留标识符(三)_第1张图片

注:本课程参考文献《C安全编码标准》

 欢迎关注我,收藏下次不迷路┗|`O′|┛ 嗷~~

目录

一.不安全代码

二.解决方案

三.练习和答案


一.不安全代码

    在下述不兼容的代码示例中,C语言标准程序库的头文件包含了,而名称MAX_SIZE与表示size_t上限的标准宏名称相同,因此产生了冲突。另外,尽管C语言标准库没有定义名为INTFAST16_LIMIT_MAX的标识符,但由于它以INT为前缀,并以_MAX为后缀,所以它也被视为一个保留的标识符。

#include 
#include 

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 
#include 

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_SIZEINTFAST16_LIMIT_MAX的命名冲突。代码的目的是打印一个int_fast16_t类型的值,如果值超过设定的上限则提示值过大。

代码示例

#include   
#include   
  
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可能与中定义的宏冲突,同时INTFAST16_LIMIT_MAX使用了保留的命名模式。

案例二

问题描述
    修正上述代码,以避免命名冲突,并确保代码可以成功编译和运行。

代码示例

#include   
#include   
  
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博客

个人网站

安城安的云世界

 C安全编程教学-声明和初始化-不要声明或者定义保留标识符(三)_第2张图片

你可能感兴趣的:(C语言软硬件教学,c语言,开发语言,javascript,ecmascript,前端,算法,安全)