630 词
简介 禅道是第一款国产的开源项目管理软件,它的核心管理思想基于敏捷方法scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。 漏洞概述 禅道17.4以下版本存在权限绕过到命令执行漏洞。该漏洞是由于禅道项目管理系统权限认证存在缺陷导致,攻击者可利用该漏洞在未授权的情况下,通过权限绕过在服务器执行任意命令。 影响版本 企业版 7.4以下的未知版本<=version<=8.0.beta1 8.0.beta2 开源版 17.4以下的未知版本<=version<=18.0.beta1 旗舰版 3.4以下的未知版本<=version<=4.0.beta1 环境安装 选择漏洞版本安装:https://www.zentao.net/download/zentaopms18.0.beta1-...
948 词
编译器的结构 重要的系统软件 识别符合语法和非法的程序 生成正确且高效的代码 分析部分(前端front end) 词法分析,生成词素(lexeme) 语法分析,生成语法树 语义分析,收集类型信息,进行语义检查 中间代码生成,生成intermediate representation(IR) 综合部分(后端back end) 代码优化,机器无关优化,生成优化后的IR 代码生成,生成目标代码 静态分析 静态分析:不执行程序代码,推导程序的行为,分析程序的性质。 控制流(control flow):程序执行的流程 数据量(data flow):数据在控制流上的传递 根据分析控制流和数据流,我们可以知道更多关于程序的性质(properties) 根据这些性质优化代码 过程内分析和过程间分析 过程内分析(intra-procedural analysis) 仅在函数内部进行分析 过程间分析(inter-procedural analysis) 考虑函数调用时参数传递和返回值的数据流和控制流 为什么过程间分析是个问题? 需要通过数据流分析得知 i 的具体类型,才知道...
2.6k 词
对于面向对象软件系统的设计而言,在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。在面向对象设计中,可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想,可以从不同的角度提升一个软件结构的设计水平。 面向对象设计原则为支持可维护性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。面向对象设计原则也是我们用于评价一个设计模式的使用效果的重要指标之一。 原则的目的: 高内聚,低耦合 面向对象设计原则表 1,单一职责原则类的职责单一,对外只提供一种功能,而引起类变化的原因都应该只有一个。 12345678910111213141516171819202122232425package mainimport "fmt"type ClothesShop struct {}func (cs *ClothesShop) OnShop() { fmt.Println("休闲的装扮"...
Go
1.2k 词
go类型转换go 存在 4 种类型转换分别为:断言、强制、显式、隐式。 通常说的类型转换是指断言,强制在日常不会使用到、显示是基本的类型转换、隐式使用到但是不会注意到。断言、强制、显式三类在 go 语法描述中均有说明,隐式是在日常使用过程中总结出来。 断言类型转换(针对接口)断言通过判断变量是否可以转换成某一个类型1var s = x.(T) 如果 x 不是 nil,且 x 可以转换成 T 类型,就会断言成功,返回 T 类型的变量 s。如果 T 不是接口类型,则要求 x 的类型就是 T,如果 T 是一个接口,要求 x 实现了 T 接口。 如果断言类型成立,则表达式返回值就是 T 类型的 x,如果断言失败就会触发 panic。 上述表所示再断言失败就会 panic,go 提供了另外一种带返回是否成立的断言语法: 1s, ok := x.(T) 该方法和第一种差不多一样,但是 ok 会返回是否断言成功不会出现 panic,ok 就表示是否是成功了。 类型switchgo语法还提供了一种类型switch的断言方法。 x 断言成了 type 类型,type 类型具体值就是 switc...
531 词
分块 目标:为对象在heap上分配内存 提前将内存分块 调用系统调用mmap()向OS申请一大块内存,例如4MB 先将内存分成大块,例如8kb,称作mspan 再将大块继续划分成特定大小的小块,用于对象分配 noscan mspan:分配不包含指针的对象–GC不需要扫描 scan mspan:分配包含指针的对象–GC需要扫描 对象分配:根据对象的大小,选择合适的块返回 缓存 TCMalloc: thread caching 每个p包含一个mcache用于快速分配,用于为绑定于p上的g分配对象 mcache管理一组mspan 当mcache中的mspan分配完毕,向mcentral申请带有未分配块的mspan 当mspan中没有分配的对象,mspan会被缓存在mcentral中,而不是立刻释放并归还给OS 内存管理优化 对象分配是非常高频的操作:每秒分配GB级别的内存 小对象占比较高 Go内存分配比较耗时 g -> m -> p -> mcache -> mspan -> memory block -> return pointer ...
6k 词
Golang的协程调度器原理及GMP设计思想一、Golang“调度器”的由来?(1) 单进程时代不需要调度器我们知道,一切的软件都是跑在操作系统上,真正用来干活(计算)的是CPU。早期的操作系统每个程序就是一个进程,直到一个程序运行完,才能进行下一个进程,就是“单进程时代”一切的程序只能串行发生。早期的单进程操作系统,面临2个问题:1.单一的执行流程,计算机只能一个任务一个任务处理。2.进程阻塞所带来的CPU时间浪费。那么能不能有多个进程来宏观一起来执行多个任务呢?后来操作系统就具有了最早的并发能力:多进程并发,当一个进程阻塞的时候,切换到另外等待执行的进程,这样就能尽量把CPU利用起来,CPU就不浪费了。 (2)多进程/线程时代有了调度器需求在多进程/多线程的操作系统中,就解决了阻塞的问题,因为一个进程阻塞cpu可以立刻切换到其他进程中去执行,而且调度cpu的算法可以保证在运行的进程都可以被分配到cpu的运行时间片。这样从宏观来看,似乎多个进程是在同时被运行。但新的问题就又出现了,进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间,CPU虽然利用...