C安全编程教学-声明和初始化-不要声明或者定义保留标识符(三)_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);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

二.解决方案

    通过避免重新定义保留名称,或者使用保留的前缀及后缀。

#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);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

三.练习和答案

案例一

问题描述
    在尝试编译以下C语言代码时,编译器报错指出MAX_SIZEINTFAST16_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;  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

答案
    编译器报错,因为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;  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

答案
    代码成功编译和运行,没有命名冲突,可以正确地打印出int_fast16_t类型的值或者提示值过大。

 非常感谢您花时间阅读我的博客,希望这些分享能为您带来启发和帮助。期待您的反馈与交流,让我们共同成长,再次感谢!

👇个人网站👇

 安城安的云世界

 

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