- 博客(353)
- 资源 (8)
- 收藏
- 关注
原创 IPsec中的安全机制小结(待完善)
IPsec和SSL是部署VPN时最常用的两种技术,它们都有加密和验证机制保证用户远程接入的安全性。OSI 定义了网络互连的七层框架:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。,它直接运行在IP(Internet Protocol,互联网协议)之上。而,是一种应用层协议,它加密的是HTTP流量,而不是直接加密IP数据包。IPsec VPN保护的是,通过IPsec VPN可以在主机和主机之间、主机和网络安全网关之间或网络安全网关(如路由器、防火墙)之间建立安全的隧道连接。
2024-10-22 16:35:17
634
原创 Linux内核学习笔记——ACPI命名空间
所有定义块都加载到单个命名空间中。命名空间 是由名称和路径标识的对象层次结构。以下命名约定适用于 ACPI 中的对象名称 命名空间:所有名称的长度均为 32 位。名称的第一个字节必须是“A”-“Z”、“_”之一。名称的每个剩余字节必须是“A”-“Z”、“0”之一 - ‘9’, ‘_’.以“_”开头的名称由 ACPI 规范保留。“”符号表示命名空间的根(即名称 前缀为 ‘’ 是相对于命名空间根目录的)。“^”符号表示当前命名空间节点的父节点 (即以“^”开头的名称相对于 当前命名空间节点)。
2023-08-20 21:31:33
1050
原创 LLVM代码空间优化(二)去除不使用函数
也就是说,链接的单位,是函数级别,这样就能丢弃没使用的函数。如果不加-ffunction-sections选项,则默认似乎是每个源文件为一个section进行链接,这样子只要这个文件中用到了一个函数,那么所有的函数都会被链接进来。:编译的时候,把每个函数作为一个section,每个数据(应该是指全局变量之类的吧)也作为一个section,这样链接的时候,–gc-sections会把没用到的section丢弃掉,最终的可执行文件就只包含用到了的函数和数据。选项,在链接的时候,加入。:需要在编译的时候,加入。
2023-05-12 22:47:49
1085
原创 LLVM代码空间优化(一) 编译器自带的优化选项
LLVM是一个开源的项目,是一个编译器框架,是一系列模块化、可重用的编译器以及工具链技术的集合。LLVM的核心是LLVM库。同时LLVM还实现了一些周边工具。LLVM的一个设计思想是优化可以渗透在整个编译流程中各个阶段,比如编译时、链接时、运行时等。你可以基于LLVM提供的功能开发自己的模块,并集成在LLVM系统上,增加它的功能;或者利用LLVM来支撑底层实现,开发自己的工具。
2023-05-12 22:32:26
2524
原创 Linux内核学习笔记——堆内存“懒/惰性”分配。
写入该页面/其中一个页面(作为第一次访问,或者在它被 `CoW` 映射到零页面之后)将软页面错误,并且 `Linux` 的页面错误处理程序将分配一个新的物理页面并将其清零。`libc` 包装器没有在那里做任何特殊的重试;所有的逻辑(检查目标页面存在和对待它就像一个软或硬页面错误)发生在内核的实现里面`read`,作为其一部分`copy_to_user`。(基本上是从内核内存到用户空间的 `memcpy`,`-EFAULT`如果您向内核传递一个您甚至在逻辑上都不拥有的指针,则可以通过权限检查使其返回。即,如果
2023-03-12 22:21:24
1317
原创 Linux内核学习笔记——页表的那些事。
接上两文,本文补充一下内核页表和用户页表创建、更新时机说明。KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。内核态页表只能在内核态下访问,可以创建到内核和用户的映射(不过用户空间受SMAP和SMEP保护)。内核页表:即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录中,硬件并不直接使用。进程页表:每个进程自己的页表,放在进程自身的页目录中。。从这个角度看,其实是完全没有用到“内核页表”的,那么“内核页表”有什么用呢?跟“进程页表”有什么关系呢?
2023-03-05 16:29:12
2367
原创 智能网联汽车ASIL安全等级如何划分
是指汽车安全完整性等级。它是由ISO 26262 标准定义的道路车辆功能安全的风险分类系统。在ISO 26262中,功能安全定义为:不存在由于电子/电气系统的功能异常表现引起的危险而导致的不合理风险( Absence of unreasonable risk due to hazards caused by malfunctioning behaviour of E/E systems)。ISO 26262定义了四种功能安全等级——ASIL A, ASIL B, ASIL C和ASIL D。
2023-02-14 23:00:00
3440
转载 智能网联汽车风险评估方法EVITA
从工程学角度上看,信息安全与功能安全都有各自独立的开发流程,但是又并不代表这两个流程没有任何交集,在处理有些问题的时候是需要相互交流的,比如针对ADAS辅助驾驶的攻击,将恶意程序注入到辅助驾驶系统中,这部分既涉及到信息安全也涉及到功能安全,因此在做处理的时候需要让两个开发流程中的人相互交流和融合,共同探讨出合适的解决方案。,电子安全车辆入侵防护应用。同非功能安全风险图类似,通过可控性、严重性和攻击概率矩阵中的交集确定风险(R1-R7+),针对潜在的威胁进行评估,其中R1代表最低风险,R7+代表最高风险。
2023-02-12 20:08:47
1476
转载 智能网联汽车风险评估方法HEAVENS
HEAVENS(HEAling Vulnerabilities to ENhance Software Security and Safety)安全模型专注于为车辆电子电气系统进行威胁分析和风险评估时使用的的方法、过程和工具。其目的是提出一种系统的方法来获取车辆电子电气系统的网络安全要求。HEAVENS相比于EVITA来说更加完整,除了评估方法外,还提供了一整套评估流程,具体流程如下所示,功能安全评估流程包括三个阶段:威胁分析、风险评估和安全需求。
2023-02-12 20:00:46
764
原创 Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)
KPTI(Kernel PageTable Isolation)全称内核页表隔离,它通过完全分离用户空间与内核空间页表来解决页表泄露。不过由于涉及到上下文切换,所以在用户态页表中必须包含部分内核地址,用来建立到中断入口和出口的映射。内核态页表只能在内核态下访问,可以创建到内核和用户的映射(不过用户空间受SMAP和SMEP保护)。开启KPTI后,再想提权就比较有局限性,比如我们常用的ret2usr方式在KPTI下将成为过去时。中断上半部的要求是尽可能的快,从而切换CR3这个操作也要求尽可能的快。
2023-01-08 20:42:41
1427
原创 Linux内核学习笔记——内核页表隔离KPTI机制
KPTI补丁基于KAISER,它是一个用于缓解不太重要问题的早期补丁,当时业界还未了解到Meltdown的存在。如果没有KPTI,每当执行用户空间代码(应用程序)时,Linux会在其分页表中保留整个内核内存的映射,并保护其访问。这样做的优点是当应用程序向内核发送系统调用或收到中断时,内核页表始终存在,可以避免绝大多数上下文切换相关的开销(TLB刷新、页表交换等)。KPTI通过完全分离用户空间与内核空间页表来解决页表泄露。支持进程上下文标识符(PCID)特性的x86处理器可以用它来避免TLB刷新,但即
2022-12-28 10:32:50
1301
转载 一步一步理解CPU芯片漏洞:Meltdown与Spectre
一个具有用户级权限的攻击者在第三条指令中试图访问内核地址,处理器会对其作安全检查,检查该进程是否有权限访问该地址,于是这条指令会触发异常,该指令及之后的指令对寄存器的修改都会被丢弃,处理器重新回到能正常执行的指令中。在支持乱序执行的CPU中,后面的指令可能在前面指令执行结束前就开始执行了。此后,攻击者就可以通过缓存侧信道攻击,不断遍历加载rbx[al*4096],由于该数据此时已经在缓存中,攻击者总会遍历出一个加载时间远小于其它的数据,推测哪个内存页被访问过了,从而推断出被访问的内核内存数据。
2022-12-18 22:12:28
2461
原创 ARM系列之MMU TLB和ASID基础概念介绍。
通常情况下,在使用 Cortex-A 系列处理器的时候,典型场景是跑多任务 OS;每一个任务(或者成为应用),都有它独立的虚拟地址空间,以及他的独立的 Translation Table;但是对于 OS 来说,Kernel 的 Translation Tables 其实是固定的,只是进程之间的 Translation Tables 不一样而已;当一个进程启动的时候,OS 负责为他 code 和 data 段建立映射表(Translation Tables);
2022-12-18 21:40:36
3071
原创 ARM系列之ARM hint instruction以及WFI补充
NOP // No operation,无操作, 不保证CPU会花时间去执行 YIELD // 提示当前线程正在执行可以换出的任务 WFE // Wait for Event,进入low power状态,直到等待的事件发生 WFI // Wait for interrupt,进入low power状态,直到等待的中断或与中断类似的操作发生 SEV // Send Event,发送事件,与WFE对应 SEVL // Send Event Local,发送本地事件,与WFE对应。
2022-12-09 08:00:00
1973
原创 TPM分析笔记(十三)TPM 授权和会话
HMAC授权仅仅使用授权值或者口令,然而Policy授权在此基础上做了增强,它可以根据TPM命令的顺序,TPM状态,以及外部设备如指纹读卡器,视网膜扫描器,和智能卡等信息来做授权。最好的理解会话的方法就是看看会话是怎么用的。会话被用于授权操作,并且单次命令的操作如加密,解密,审计等等都是在一个会话中完成的。在TPM设备中有一个单一的,永远可用的口令会话用于授权一个单独的TPM命令,会话不会保存两次命令之间的任何状态。HMAC会话会维护会话生命周期内的状态,因此会话可以用于针对TPM实体的多个动作。
2022-10-24 21:35:27
1561
原创 TPM分析笔记(十二)TPM PCR操作
PCR有两个最基本的应用。它们的值可以通过一个签名的认证引用被报告出去,这样允许一个依赖方决定平台的软件状态是否可信。它们还可以用于policy,基于PCR的值来授权其他TPM对象的使用。相对于TPM1.2PCR的算法被固定成SHA-1,TPM2.0做了改进,允许使用其他的哈希算法。TPM 2.0规范解读系列——Part 1体系结构第(九)读:PCR状态。
2022-10-22 20:47:15
6283
原创 Armv8-R系列之Device_nGnRnE属性是什么?
`Device` 后面的字母代表属性的组合:- `Gathering (G, nG)` 这指定了可以合并(`G`) 或不合并(`nG`) 访问。 这可能是将对同一位置的多个访问合并为一个访问或合并多个较小的访问 访问到一个更大的访问。- `Re-ordering (R, nR)` 这指定对相同外设的访问可以重新排序(`R`) 或不重新排序`(nR)`。 当允许重新订购时,同样的限制以同样的方式适用于`normal memory`。- `Early Write Acknowledgement (E, n
2022-09-25 08:47:00
2891
原创 Armv8-R系列之何为MPU?
Arm PMSA基于提供内存保护方案的内存保护单元 (MPU)。这PMSA在PE访问的虚拟地址 (VA) 和 32 位物理地址之间使用线性映射(PA) 在内存系统中访问。也就是说,对于所有访问,VA与PA相同/等价。PMSA主要简化的地方就是。
2022-09-18 10:52:29
2422
原创 ARM系列之ARM多核指令WFE、WFI、SEV原理
WFI和WFE都是Cortex内核进入低功耗的指令,WFI()和WFE(),如果仅仅从字面去理解,一个是中断(int)唤醒,一个是事件(event)唤醒,完美!但是,中断是什么,好理解,那事件是什么?中断算一个事件吗?WFE等待的事件是从哪里来的?内核为啥要分WFI和WFE?是不是有点懵!WFE和WFI都是用来让内核进入低功耗的,中断和事件都可以唤醒内核。WFE还会受控于一个,此寄存器软件不可访问。此功能时为多核而准备的。WFE在为0,或为1时,其功能是不一样的。WFE的E就是指这个事件寄存器。
2022-09-12 08:12:07
10191
原创 Armv8-R系列之ARM Cortex-R52 由来
Cortex-R52 是 Cortex-R 系列中最先进的处理器,可提供实时功能安全性能。作为第一款 Armv8-R 处理器,Cortex-R52 引入对虚拟机管理程序的支持,通过强大的分离来简化软件集成以保护安全关键代码,同时保持高要求的实时确定性操作可靠的控制系统。Cortex-R52 解决了一系列应用,例如高性能域用于车辆动力总成和底盘系统的控制器或作为安全岛提供在复杂的 ADAS 和自动驾驶系统中提供保护。...
2022-08-28 15:27:35
6756
2
原创 TPM分析笔记(十一)TPM 密钥组织架构(TPM Key Hierarchy)
Storage Keys:存储密钥,用来加密数据和其它密钥的通用非对称密钥,这里的其它密钥可以是另外一个存储密钥,也可以是绑定密钥或签名密钥。它本身是长度2048bit的RSA私钥,它既可以是可迁移密钥,也可以是不可迁移密钥。,存储根密钥,是整个系统拥有一个最高权限的存储密钥,这个最高级密钥也就是存储根密钥。它很特殊,在每个用户创建的时候生成,管理这个用户的所有数据,也就是存储可信根()和签署密钥()一样,一个TPM仅存在唯一一个。所有其它的密钥都在存储根密钥的保护之下。签名密钥(.........
2022-08-13 15:54:58
2795
7
原创 TPM分析笔记(十)TPM 组织架构(TPM hierarchy)
上文阐述一个TPM2.0资源实体是TPM内部可以通过handle直接引用。本质上TPM组织架构也是由一组相关的资源实体构成,它们被作为一个组来管理。这些实体包括永久对象(组织架构的handle),它将被作为一个树根节点的主要对象,树节点还有其它对象,如密钥。另外NV索引隶属于一个组织架构,但是它不在树型组织中。除去永久性实体,==其他实体可以作为一个组被整体删除==。每个hierarchy的==密码学根节点==是一个==种子==,这个种子是由TPM生成的一个很长的随机数(如果是非对称密钥,由TPM筛
2022-08-13 07:22:07
2880
原创 Linux内核学习笔记——Crypto基础框架
本篇文章主要分析关于kernel crypto算法框架,以及结合它在文件系统加密这一场景中的应用,分析内部的实现细节,以便读者对Linux crypto框架有相关的认识,并能基于它做开发。本篇文章的所有代码都是围绕Linux-5.10源码进行阅读。为方便理解,我们约定一些术语:数据转换(transformation/TFM):不管是对数据做加/解密,还是做hash,都定义成是对数据所做的转换操作。...
2022-07-11 00:15:00
3892
原创 TPM分析笔记(九)TPM资源实体-句柄
参照一个TPM2.0资源实体是TPM内部可以通过handle直接引用的内容,由句柄引用,句柄唯一标识占用TPM内存的资源RAM或NV。句柄为32位值。它的最重要的字节标识引用的资源的类型。在任何给定的时刻,它的低阶24位标识了该类型的唯一资源。由低阶24位标识的实际资源可能会随时间变化。一个特定的句柄值一次只能引用一个tpm驻留资源。这个概念包含了对象的概念,因为TPM规范使用对象来引用一个实体的子集。这看起来可能有些迷惑,所以这章节我们将分析一下这些实体的类型:1、永久实体(组织架构,字典攻击锁定机制,
2022-07-10 16:51:13
2035
原创 服务器SMP、NUMA、MPP体系学习笔记。
商业化处理器都致力于单核处理器的发展,其性能已经发挥到极致,仅仅提高单核芯片的速度会产生过多热量且无法带来相应性能改善,但CPU性能需求大于CPU发展速度。尽管通过增加流水线可以提高CPU的频率,但是由于缓存的增加与漏电流控制不力的因素,导致功率大幅增加,性能反而不如之前低频率的CPU。由于CPU的功率增加,导致CPU的散热问题也就更加严重,风冷已经不能解决问题了。那么,此使新的技术就出现了:多核处理器。早在1996年就有第一款多核CPU原型Hydra。2001年IBM推出第一个商用多核处理器POWER4,
2022-07-02 00:02:01
1065
转载 Linux内核学习笔记——SELinux介绍(SELinux Policy是什么?)
本文主要描述了SELinux的原理,以及在android中的使用。第一部分首先介绍了SELinux的基础框架;第二部分介绍了SELinux的基础理论;第三部分简单介绍了SELinux Policy。本文主要基于android系统的SELinux讲解,水平有限,如果有错误,敬请指正。一、SELinux Overview1. SELinux 来源SELinux 即Security-Enhanced Linux,由美国国家安全局(NSA)发起,Secure Computing Corporation
2022-07-01 08:09:24
2386
1
原创 如何提升代码规范性——嵌入式C编程规范。
分享一篇C语言编程规范,欢迎大家来讨论。编写代码时最重要的一条规则是:检查周围的代码并尝试模仿它。作为维护人员,如果收到的补丁明显与周围代码的编码风格不同,这是令人沮丧的。这是不尊重人的,就像某人穿着泥泞的鞋子走进一间一尘不染的房子。因此,无论本文推荐的是什么,如果已经编写了代码并且您正在对其进行修补,请保持其当前的样式一致,即使它不是您最喜欢的样式。这里列出了最明显和最重要的一般规则。在你继续阅读其他章节之前,请仔细检查它们。...
2022-06-08 22:21:22
769
1
转载 如何提升代码的安全性 —— 代码防御性编程的十条技巧
顾名思义,防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能的”保护”自己。我们通过明确地在代码中对设想进行检查,这是一种努力,防止我们的代码以将会展现错误行为的方式被调用。防御性编程使我们可以尽早的发现较小的问题,而不是等到它们发展成大的灾难的时候才发现。其开发软件的过程是:下面总结了一些防御性编程的反对和支持者的意见:采用良好的编码风格,来防范大多数编码错误。如:const关键字:关键字const可以给读你代码的人传达非常有用的信息。例如,在函数的形参
2022-06-08 21:48:01
2697
原创 TPM分析笔记(八)TPM开关机和初始化配置相关命令字
9 启动9.1 介绍本章主要介绍用于管理TPM的启动和重新启动状态的命令。9.2 _TPM_Init_TPM_Init初始化TPM。初始化操作包括测试执行下一个预期命令所需的代码。如果TPM处于升级模式 Field Upgrade mode (FUM),下一个预期命令是TPM2_FieldUpgradeData();否则,下一个预期命令是TPM2_Startup()。Note 1 如果TPM在收到_TPM_Init后执行自检,并且TPM在之前已经能进入故障模式接收到TPM2_Startup
2022-05-25 22:13:37
2224
原创 如何提升代码的安全性 —— 代码混淆
目录一、背景1.1 Android应用安全存在多重隐患二、代码混淆2.1 代码混淆的原理2.2 代码混淆的方法2.3 常见的代码混淆方式三、 C/C++ 代码混淆3.1 Obfuscator-LLVM实现C/C++混淆3.1.1 常见的混淆方法3.1.2其他常见的C/C++混淆手段:四、代码混淆可能带来的问题一、背景1.1 Android应用安全存在多重隐患代码可逆向:客户端App的逻辑能够被轻易获取和逆向,得到代码和程序中的敏感数据;功能泄漏:客户端App中高权限行为和功能被其他未授权的应
2022-05-25 21:34:44
2095
2
原创 OP-TEE内核学习笔记(一)(安全存储)—— 安全文件基础操作(创建、读、写)
目录一、基本文件操作流程1.1 安全文件的创建1.2 安全文件的读取(待完善)接上文:OP-TEE内核学习笔记(一)(安全存储)—— GP 安全存储 APIOP-TEE内核学习笔记(一)(安全存储)—— 密钥和文件结构了解了以上基本概述后,我们接下来看一下详细的安全文件的基础操作,了解OPTEE是如何处理安全文件的数据的。因为OPTEE中没有文件系统的功能,需要借助tee_supplicant守护进程来完成访问文件系统的工作。读写安全文件也是类似的过程,TA发送RPC请求给tee_supplic
2022-05-09 08:00:00
2427
原创 OP-TEE内核学习笔记(一)(安全存储)—— 安全存储 GP API
数据是最核心资产,存储系统作为数据的保存空间,是数据保护的最后一道防线;随着存储系统由本地直连向着网络化和分布式的方向发展,并被网络上的众多计算机共享,使存储系统变得更易受到攻击,相对静态的存储系统往往成为攻击者的首选目标,达到窃取、篡改或破坏数据的目的。存储安全变得至关重要,安全存储主要包括存储安全技术、重复数据删除技术、数据备份及灾难恢复技术等。
2022-05-04 11:17:34
4729
原创 OP-TEE内核学习笔记(一)(安全存储)—— 密钥和文件结构
这里写目录标题一、存储机制介绍二、OPTEE REE文件系统安全存储(OPTEE SFS机制)2.1 OP-TEE 系统安全文件2.2 GlobalPlatform 安全存储要求2.3 Linux 文件系统中的 TEE 文件结构2.4 密钥管理器2.4.1 硬件唯一密钥`(Hardware Unique Key, HUK)`2.4.2 安全存储密钥`(Secure Storage Key, SSK)`2.4.3 TA存储密钥`(Trusted Application Storage Key, TSK)`2.
2022-05-03 11:42:10
5019
2
原创 Linux内核学习笔记 - RCU机制总结
目录一、什么是RCU机制1、历史背景 —— 原始的RCU思想2、基础架构 —— RCU算法设计3、实现思路—— 读写回收实现思路4、实现思路 —— 实例说明宽限期订阅——发布机制数据读取的完整性二、RCU核心API1、rcu_read_lock()2、rcu_read_unlock()3、synchronize_rcu()4、call_rcu()5、rcu_assign_pointer()6、rcu_dereference()7、内核常见使用实例一、什么是RCU机制RCU机制是Linux2.6之后提供的
2022-04-30 13:44:53
4296
6
原创 Linux内核学习笔记——Linux中的用户组和权限管理(UID是什么?)
目录一、背景进程权限最小权限原则linux系统安全模型用户用户组用户和组的关系安全上下文进程的用户ID函数setreuid和setregid函数seteuid和setegid思考:UID能为TEE安全世界带来什么用处呢?一、背景Linux的用户在登录(login)之后,就带有一个用户身份(user ID, UID)和一个组身份(group ID, GID)。一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/etc/group中,文件的每一行代表一个用户/组。早期的Linux将
2022-04-22 22:06:25
7773
原创 TPM分析笔记(七)TPM 模块中的密码算法家族。
目录密码攻击暴力破解根据类型来计算算法强度针对算法本身的攻击安全的定义密码家族哈希(摘要)哈希扩展(HashExtend)基于哈希的消息认证码(HashedMessageAuthenticationCode)密钥生成函数(KeyDerivationFunction)认证或者授权凭据(Ticket)对称加密密钥对称密钥的模式Nonce非对称密钥RSA非对称密钥算法RSA用于密钥加密RSA用于数字签名ECC非对称密钥算法ECDH用于密钥交换ECDSA用于数字签名公钥证书密码攻击密码学因阻止攻击者作恶而生。一
2022-04-13 21:37:00
2761
原创 【值得一看】Linux C 语言程序之变量类型解析 。
目录背景从编译的角度从 ELF 二进制程序文件的角度从运行的角度背景近期发现项目组同学对于C语言static关键字作用还是不太清晰。从语法的角度去解释某个关键字用法的文章很多,可是这些解释蛮多时候是很生硬的,不是那么好记忆。本文尝试从实操的角度去解析 static以及更多类型的 C语言变量的形态,希望对大家有帮助。static这个关键字用来限定某个变量或者函数的作用域,这个作用域可能是文件层面,也可能是函数层面。从编译的角度假如某个功能需求由多个文件构成如下:$ cat print.hext
2022-04-11 09:00:00
1037
原创 TPM分析笔记(六)TPM 如何使用setjmp和longjmp实现异常后处理。
目录背景问题1问题2C 语言中 setjmp 和 longjmp函数间跳转原理函数原型案例说明setjmp和longjmp源码解析背景问题解析背景问题11、 _plat___RunCommand() 函数用于在TPM代码中调用 ExecuteCommand() 。这个函数为TPM命令字处理模块的主入口函数,用于处理来自TPM2-TSS软件栈协议数据。在调用 ExecuteCommand 之前,为什么主入口函数需要先调用setjmp函数?问题2当TPM中出现故障时,手册上表示使用 _plat__Fa
2022-04-10 14:40:14
645
2
转载 给大家推荐一个查变量名的网站 - mark
程序员最头疼的事情除了头发以外就是给变量或函数命名,一开始学编程语言的时候还可以 abc、a1、x2 等方式命名,等到工作过程中开始真正的项目开发时,如果还是这样随意的命名,即使同事可以忍受你的 abc,隔几个月自己再重新看代码说不定都想锤自己一顿。这个时候,英语好的同学可以挤尽脑子想一些与中文意思差不多的单词,英语捉急的便只能求助有道翻译。但这两种方法最后的效果都让人很不满意。有没有第三方工具可以帮助大家轻轻松松的给变量或函数命名呢?变量命名网站 CodelfCodelf 是通过搜索在线开源平台Git
2022-04-01 23:04:32
4123
1
GP接口函数描述和入参解析
2022-05-04
Linux 设备模型之kobject
2015-06-08
字符设备LED驱动程序
2015-04-14
Windows下基于socket多线程并发通信的实现
2015-04-07
采温显示存储报警模块
2013-04-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人