0


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

注:本课程参考文献《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博客

👇个人网站👇

安城安的云世界


本文转载自: https://blog.csdn.net/anananajiushiwo/article/details/141519282
版权归原作者 安小呆 所有, 如有侵权,请联系我们删除。

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

还没有评论