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

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

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

目录

一.不安全代码

二.修改代码

三.练习与答案


一.不安全代码

    考察以下不兼容的代码示例,我们发现文件作用域内的对象_max_limit_limit的命名都采用了下划线作为前缀。尽管_max_limit由于是静态声明的,似乎不会受到实现定义名称冲突的影响。然而,值得注意的是,所包含的<stddef.h>头文件定义了size_t,这意味着存在潜在的名称冲突风险。此外,_limit由于具有外部链接属性,它可能与语言运行时库中定义的同名符号发生冲突,即使这个符号并未在任何头文件中显式定义。因此,我们可以得出结论,即使链接方式可能将标识符的可见性限制在单个翻译单元内,使用下划线作为文件作用域标识符名称的前缀仍然是不安全的做法。 

#include <stddef.h>
static const size_t _max_limit = 1024;
size_t _limit = 100;
unsigned int getValue(unsigned int count){
    return count < _limit ? count : _limit;
}

二.修改代码

    文件作用域对象名称不以下划线开始

#include <stddef.h>

static const size_t max_limit = 1024;
size_t limit = 100;

unsigned int getValue(unsigned int count){
    return count < limit ? count : limit;
}

三.练习与答案

    考察以下代码,我们注意到全局变量_globalCount_buffer_size的命名都使用了下划线前缀。尽管_buffer_size是静态声明的,看似不会受到名称冲突的影响,但实际上,由于它使用了size_t类型,而size_t<stddef.h>头文件中定义,这就引入了潜在的名称冲突风险。此外,_globalCount变量由于具有外部链接属性,可能会与语言运行时库或其他模块中定义的同名符号发生冲突。因此,即使链接限制可能使得标识符仅在单个翻译单元内可见,使用下划线作为全局变量名称的前缀依然是不安全的做法。

#include <stddef.h>  
  
static const size_t _buffer_size = 256;  
size_t _globalCount = 0;  
  
void incrementCount() {  
    _globalCount++;  
}  
  
size_t getBufferSize() {  
    return _buffer_size;  
}

    为了避免潜在的名称冲突,我们修改了全局变量的命名,使其不再以下划线开始。

#include <stddef.h>  
  
static const size_t bufferSize = 256;  
size_t globalCount = 0;  
  
void incrementCount() {  
    globalCount++;  
}  
  
size_t getBufferSize() {  
    return bufferSize;  
}

    在这个修改后的代码中,全局变量globalCountbufferSize的命名避免了使用下划线前缀,从而减少了与标准库或其他模块中定义的符号发生冲突的可能性。

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

👇热门内容👇 

python使用案例与应用_安城安的博客-CSDN博客

软硬件教学_安城安的博客-CSDN博客

Orbslam3&Vinsfusion_安城安的博客-CSDN博客

网络安全_安城安的博客-CSDN博客

教程_安城安的博客-CSDN博客

python办公自动化_安城安的博客-CSDN博客

👇个人网站👇

安城安的云世界

 

  • 26
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值