1.很多C语言开源软件的码分源代码很难懂,要快速理解有什么技巧吗?
2.带你一步步调试CPython源码(二、码分词法分析)
3.crc16校验C语言源码实例解析
4.glibc源码分析(二)系统调用
很多C语言开源软件的码分源代码很难懂,要快速理解有什么技巧吗?
阅读代码是码分一项重要的能力。你觉得技术比你弱的码分人拿的工资比你高,他有一项很重要的码分客户跟踪管理源码能力就是阅读代码。
开源代码在变量命名上,码分注释上一定做得比较好了,码分你所看不懂的码分地方只有2种可能。
1,码分编程技巧。码分这种比较容易弄懂,码分如果你对编程语言熟悉的码分话,一步一步展开来就知道作者想表达的码分意思了。(这个就像小时候学语文的码分语法,“把”字句改成“被”字句,意思没变,写法变了)
2,算法。这个就算你一步一步展开都不一定能看懂,手机logo展示源码这个要有一定的数学知识,比如向量积,线性回归,微分方程,卷积等。如果是很专业的产品,还要涉及到物理,化学,电气,概率论等等。(这个就像阅读文言文,没学过就看不懂,还可能会理解错误)
所以看不懂代码就只有提升自己的知识水平,没有捷径可走。但你可以针对性的去训练上述2条中的弱项,语言是基础,算法是核心。
记得我第一份工作是做单片机产品维护,平时工作就是php跳转qq源码在现有的产品上改改功能代码,增加新功能。那个时候没做过什么产品,虽然也会C语言,但是看别人代码就像看天书一样,主要是技术不到家,还遇到过一些让人吐血的代码,可能是公司得罪了那个工程师,代码里没一个注释,而且变量名全是k,kk,tt这种不好理解的,简直让我想把那个工程师罚站马路中间半个小时,感觉还不如自己重写快一点,后面慢慢的积累了一些经验才发现自己当时看代码的方式和思维不对。一个源码,如果你用通过代码去理解产品功能那你一定会看到心肌梗塞都吃不透,正确的应该是先把产品功能吃透,然后把功能分模块进行分析,如果是spring boot aop 源码我,我会怎么用代码去实现它?最好自己写代码做一遍,在写的过程中你一定会碰到棘手的技术点不知道该怎么去实现它,这个时候最好自己努力思考一下,最后不管你有没想出来,你再去看别人的代码是如何实现的,这样你就能一步步吃透别人的代码,至少程序架构的核心部分知道怎么处理了,剩下的细节实现其实已经无关紧要了,这是一个循环渐进的过程,也是提升自己水平很好的方法,过程越痛苦你的提升就越大。带你一步步调试CPython源码(二、词法分析)
本文是《深入理解CPython源码调试:词法分析篇》系列的第二部分,阐述CPython解释器如何进行Python代码的词法解析。首先,让我们回顾编译原理的基本步骤,编译过程包括词法分析、语法分析、中间代码生成和优化,如果修改源码建站以及最终代码执行。在CPython中,词法分析是第一步,它会逐字符读取源码并将其转换为内部字节流,便于后续处理。
CPython的词法分析和语法分析并非截然分开,许多词法分析逻辑在语法分析器中合并执行,这使得parser函数中可能包含词法处理的部分。尽管本文示例基于Python3.a2,但tokenizer的更新频繁,与文章内容可能存在差异。
词法分析的核心任务是将用户输入的字符转换为token,如数字、符号等,以简化语法分析的复杂性。CPython中的词法分析逻辑存储在Grammar/Tokens文件中,其中列出了各种token及其对应的符号。这个文件虽不直接参与编译,但用于生成词法分析器,如在项目中添加相关代码并执行build.bat命令来更新。
在Python/pythonrun.c中,我们会在行设置断点,跟踪CPython调用_PyParser_ASTFromFile将字符串转换为抽象语法树的过程。接着,程序会进入_PyPegen_run_parser_from_file_pointer,进行词法和语法分析。这个阶段从_PyTokenizer_FromFile开始,创建tok_state,初始化语法分析器,然后调用_PyPegen_run_parser执行核心逻辑。
在Parser/tokenizer.c的行,程序通过tok_nextc函数逐字符读取用户输入,直到遇到换行等终止符号,期间还会调用tok_backup以处理多字符符号。随后,程序会根据Grammar/Token文件判断字符类别并生成相应的token,存储在tok_state中供语法分析使用。
最后,CPython从键盘获取用户输入是通过PyOS_Readline系统调用实现的。词法分析器的生成逻辑则依赖于Grammar/Tokens文件,通过Tools/build/generate_token.py脚本解析并生成Parser/token.c中的相关代码。
词法分析部分的解析至此完成,下篇文章将转向语法分析,探讨Pegen在其中的作用。
crc校验C语言源码实例解析
一、CRC概念
CRC,即循环冗余码校验,通过除法和余数原理实现错误侦测。在实际应用中,发送设备计算CRC值与数据一起发送给接收设备。接收设备收到数据后,重新计算CRC值并与接收到的CRC值进行比较。若两个CRC值不同,则表明数据传输过程中出现了错误。
二、CRC源码解析
1、函数实现
2、计算结果
glibc源码分析(二)系统调用
在glibc源码中,许多系统调用被使用了.c封装的方式进行封装。这一过程借助嵌入式汇编,严格遵循系统调用封装规则。以stat函数为例,其实现揭示了.c封装的奥秘。
在源代码中,stat系统调用被INLINE_SYSCALL宏所封装。该宏首先调用INTERNAL_SYSCALL宏,执行系统调用并把返回值存入resultvar变量中。接下来,通过判断系统调用是否成功执行,采取相应的后续操作。若执行错误,则调用__syscall_error设置errno并返回-1;若执行成功,则返回resultvar。
在处理系统调用参数个数nr时,INTERNAL_SYSCALL宏发挥了关键作用。根据nr的不同,宏会调用不同的内部函数进行处理。例如,当nr为0时,调用INTERNAL_SYSCALL_MAIN_0宏,设置eax寄存器为系统调用号,执行*_dl_sysinfo函数进行系统调用。当nr为1时,宏将参数1存入ebx寄存器,同时设置eax寄存器为系统调用号,并执行系统调用。
类似的,nr为2、3、4、5或6时,宏分别会将参数2至6存入ecx、edx、esi、edi或ebp寄存器中,并与系统调用号相结合,执行*_dl_sysinfo函数。通过这一系列的嵌入式汇编操作,.c文件成功封装了系统调用,实现了高效、精确的调用过程。
总的来说,glibc中.c封装的实现展示了汇编语言的强大功能,以及在系统调用处理中的应用。通过精确的汇编指令和灵活的参数传递,封装过程确保了系统调用的执行效率和正确性。