「2014-2-8」Reading a blog on the pain points of Global Variables of C language
晚上读到一篇《C 语言全局变量那些事儿》。我先前对链接的理解不深,算是涨了一番姿势。此文吐槽的重点,是「非 static 限定的全局变量」带来的看似出人意料(实则可以被合理解释)的行为。虽说都是 tricky 的实验代码,现实环境下,可以通过更好的编程习惯、更有效的 code review 流程和静态检查工具来避免(起码对于「拥有全局作用域的符号被多重定义」这种行为,静态检查肯定是能够吼住的),但了解一下这方面的坑也好。
1. 前三个例子,是基本链接和静态链接。参考这个评论「编译器向汇编器输出强、弱全局符号,链接器再将 .o 文件和静态库“从左至右”进行符号解析,这可以解释前面三个例子」。
所谓「强符号」和「弱符号」的概念:「前者指的是定义并且初始化了的变量,后者指的是未定义或者定义但未初始化的变量」。GNU 链接器对此的决议(resolve)规则是:
# 不允许出现多个相同强符号。
# 如果有一个强符号和多个弱符号,则选择强符号。
# 如果有多个弱符号,那么先决议到 sizeof (type) 最大的那个,如果同样大小,则按照链接顺序选择第一个。
2. 第四个例子,是一个动态链接的例子。参考 1 2 这两则评论。
简单来讲,对于 dll 动态加载符号表的情况,「当一个符号需要被加入全局符号表时,如果相同的符号名已经存在,则后加入的符号被忽略」。《Expert C Programming》里提到的 interpositioning 问题应该也是此来由:某古老的 SunOS 版本,一个非 static 限定的函数 funcTemp 和系统上的内置库函数重名,形参也一致;另一个内置库函数 libDoSomething 调用 funcTemp,结果根据链接顺序和决议规则,libDoSomething 调用的都是用户编写的 funcTemp 函数、而非期望的系统内置 funcTemp 函数,从而出现偶发错误。
P.S. 对于这种隐藏得比较深、又不是必然出错、较难定位的链接问题,C++ 中引入的 name mangling 和 namespace 还是有功的。
「2014-2-8」Reading a blog on the pain points of Global Variables of C language的更多相关文章
- 面试都在问的「微服务」「RPC」「服务治理」「下一代微服务」一文带你彻底搞懂!
❝ 文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程 ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
- Objective-C 实用关键字详解1「面试、工作」看我就 🐒 了 ^_^.
在写项目 或 阅读别人的代码(一些优秀的源码)中,总能发现一些常见的关键字,随着编程经验的积累大部分还是知道是什么意思 的. 相信很多开发者跟我当初一样,只是基本的常用关键字定义属性会使用,但在关键字 ...
- FFmpeg + SDL2 实现的视频播放器「视音频同步」
文章转自:http://blog.csdn.net/i_scream_/article/details/52760033 日期:2016.10.8 作者:isshe github:github.com ...
- [转帖]「知乎知识库」— 5G
「知乎知识库」— 5G 甜草莓 https://zhuanlan.zhihu.com/p/55998832 通信 话题的优秀回答者 已关注 881 人赞同了该文章 谢 知识库 邀请~本文章是几个答 ...
- 从0开始学习 GitHub 系列之「03.Git 速成」
前面的 GitHub 系列文章介绍过,GitHub 是基于 Git 的,所以也就意味着 Git 是基础,如果你不会 Git ,那么接下来你完全继续不下去,所以今天的教程就来说说 Git ,当然关于 G ...
- 「CSP-S模拟赛」2019第四场
「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...
- 「查缺补漏」巩固你的Redis知识体系
Windows Redis 安装 链接: https://pan.baidu.com/s/1MJnzX_qRuNXJI09euzkPGA 提取码: 2c6w 复制这段内容后打开百度网盘手机App,操作 ...
- 给 Mac 添加右键菜单「使用 VSCode 打开」
最终的实现效果是在文件 / 文件夹上右击时,会出现菜单项「用 VSCode 打开」,点击后会启动 Visual Studio Code 打开对应的文件 / 文件夹. 实现步骤 打开「自动操作.app」 ...
随机推荐
- c#FileStream文件读写(转)
FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能.这是因为FileStream类 ...
- div+css的第一个布局
---恢复内容开始--- 这个东西说难也不难,但也要详细思虑一番: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...
- 微信公众账号第三方平台全网发布源码(java)- 实战测试通过
第一部分:微信第三方平台配置
- uiautomator跑安卓端UI testing
用uiautomator做安卓的app端的UI testing的环境搭建及编jar包和运行case的步骤如下: 1.新建java工程 2.右键properties, 添加junit4的library, ...
- 模仿win10样式,基于jquery的时间控件
工作需要,写了一个基于jquery的时间控件,仿win10系统时间控件格式. 目前基本功能都有了,但时间格式只实现少数,但由于结构设计已经充分优化,填充起来非常容易. 这个控件相对网上其他的时间控件, ...
- maxiang conf
/**设置你自己的CSS.例如:h1 {border-bottom: 1px solid #ccc;line-height:1.6;}body {background:#FDFFD0} **/ p ...
- netcat使用
一.端口监听(实时消息) 首先在A计算机上,它充当的是服务器角色,$ nc -l 3333 这时就创建了一个监听端口(listening socket(server)).- -l 它让 nc 监听一个 ...
- JavaScript数组的一些方法集合
数组方法集合 push()添加到数组末尾,并返回修改后数组的长度 var a=array.push('a','b'); alert(a);//2 pop() 移除数组最后一项,返回移除的项. shif ...
- xlrd读取多个excel电子表数据
import sys import xlrd import traceback def ReadData(FileName): try: workBook = xlrd.open_workbook(F ...
- 23种oop设计模式定义
创建型模式 单例模式:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实现. 工厂模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化.工厂方法使一个类的实例化延迟到子类. 抽象 ...