注:本课程参考文献《C安全编码标准》
欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~
目录
一.不安全代码
二.修改代码
三.练习与答案
一.不安全代码
考察以下不兼容的代码示例,我们发现文件作用域内的对象_max_limit
和_limit
的命名都采用了下划线作为前缀。尽管_max_limit
由于是静态声明的,似乎不会受到实现定义名称冲突的影响。然而,值得注意的是,所包含的<stddef.h>
头文件定义了size_t
,这意味着存在潜在的名称冲突风险。此外,_limit
由于具有外部链接属性,它可能与语言运行时库中定义的同名符号发生冲突,即使这个符号并未在任何头文件中显式定义。因此,我们可以得出结论,即使链接方式可能将标识符的可见性限制在单个翻译单元内,使用下划线作为文件作用域标识符名称的前缀仍然是不安全的做法。
二.修改代码
文件作用域对象名称不以下划线开始
三.练习与答案
考察以下代码,我们注意到全局变量_globalCount
和_buffer_size
的命名都使用了下划线前缀。尽管_buffer_size
是静态声明的,看似不会受到名称冲突的影响,但实际上,由于它使用了size_t
类型,而size_t
在<stddef.h>
头文件中定义,这就引入了潜在的名称冲突风险。此外,_globalCount
变量由于具有外部链接属性,可能会与语言运行时库或其他模块中定义的同名符号发生冲突。因此,即使链接限制可能使得标识符仅在单个翻译单元内可见,使用下划线作为全局变量名称的前缀依然是不安全的做法。
为了避免潜在的名称冲突,我们修改了全局变量的命名,使其不再以下划线开始。
在这个修改后的代码中,全局变量globalCount
和bufferSize
的命名避免了使用下划线前缀,从而减少了与标准库或其他模块中定义的符号发生冲突的可能性。
非常感谢您花时间阅读我的博客,希望这些分享能为您带来启发和帮助。期待您的反馈与交流,让我们共同成长,再次感谢!
👇个人网站👇