读大三的老弟最近喜欢上了 c/c++,看 c/c++的源码,他告诉我他发现了 Linus Torvalds git 仓库里的 bug (程序 bug + 内存泄露 + 段错误),然后我说你赶紧提 PR 呀,看了半天他说的其中一个 bug init-db.c 没发现问题,各种怀疑人生,一问才知道是第一版 git. 其中一个 bug
sha1_dir = getenv(DB_ENVIRONMENT);
if (sha1_dir) {
struct stat st;
if (!stat(sha1_dir, &st) < 0 && S_ISDIR(st.st_mode))
return 0;
fprintf(stderr, "DB_ENVIRONMENT set to bad directory %s: ", sha1_dir);
}
stat 返回 0 或 -1,非零加!结果为 0,0 加!结果为 1,这里<0 条件永远不成立?各位老哥们,这里我没理解错吧,别误导了我弟,哈哈哈哈。
顺带求一份适合深入学习的 C++开源代码( C 的话老弟专心看 redis 了,时不时问我一些问题,我也跟着学习下 redis,到时候再被八股文,岂不美滋滋?)
1
mywaiting 2020-10-10 00:42:43 +08:00
虽然我不懂 C/CPP 但是我觉得 Linus 没有写错,是的,脑残粉就是这么无脑 [摊手~]~
|
2
timothyqiu 2020-10-10 00:50:10 +08:00 6
|
3
52coder OP @timothyqiu 感谢老铁,昨天太晚,没去翻提交记录
|
4
52coder OP @mywaiting 看第一个版本的 git,我给我老弟讲要学习里面的理念(虽然我没看过,但这话放之四海皆准[doge])
|
5
mywaiting 2020-10-10 10:44:21 +08:00 1
@52coder 第一个版本的 Git 单纯从代码上感觉没太多亮点,基本就是熟手的 C/CPP 水平
然而可以从高处抽象出 tree 和 blob 这两个实现然后实现一套完整的分布式版本管理,整个思路和体系很值得学习 化繁为简,用一千多行代码就高效完成整个系统的搭建,短小精悍,更是项目实现中的典范,这个才真值得学习 |
6
52coder OP @mywaiting 是的,非常赞同你说的这个,当然我也建议我弟从提交记录开始往后躲看看,为什么要这么高,抽象和设计就要自己消化和吸收了。
|
7
DiamondY 2020-10-10 11:46:31 +08:00
在 C 一般会这样定义,true:-1 false:0
那样写也不算错,但去掉更准确,有些人或编译器会把 true 定义成 1 |
10
52coder OP @DiamondY C 里一般 true 1 ,false 0,不是-1,即使是-1,上面那个代码也是错的,你可以写 demo 验证下。
|
11
hwdef 2020-10-10 13:26:08 +08:00
源码,,既然看了 redis 的话,,可以看看另一个 k/v 数据库,leveldb,也值得学习,也不长。
|
12
DiamondY 2020-10-10 13:44:11 +08:00
@52coder 是搞混了~和!,估计上午脑子进水了
C 里面判断只是认为 0 值为 false,非 0 就是 true,虽然标准库里面 true 是定义成 1,但定义成-1 也没错的 |
14
berrx 2020-10-10 14:16:02 +08:00
哥, 咱家有钱了 🐶
|
16
maigebaoer 2020-10-10 14:36:35 +08:00 via Android
害,我们这些应用侧的,还是直接背八股文吧🤣
|
17
52coder OP @maigebaoer 我也应用测的,主要 java,偶尔 go,看看 redis 源码,再背八股文可能好背一些吧.
|