1
对从go源码和汇编源码生成可执行程序的过程,下面描述错误的是()
A. 使用go tool compile可以将go源码编译成目标文件
B. 使用go tool asm可以将go源码编译成汇编代码
C. 使用go tool link可以将目标文件链接为可执行程序
D. 使用cgo特性时,需要使用外部C编译器来编译go代码中被调用的C代码
B
2
关于Go语言sync/atomic包,下面说法错误的是()
A. sync/atomic包支持的原子操作有:加法(add)、比较并交换(compare and swap),加载(load)、存储(store)、交换(swap)
B. sync/atomic包中原子操作支持的数据类型包括:int32、int64、uint32、uint64、uintptr、unsafe.Pointer、atomic.Value。
C. ```func AddInt32(addr *int32, delta int32) (new int32)```,其中delta入参为负数的话,可以实现减法操作。
D. ```func AddUint32(addr *uint32, delta uint32) (new uint32)```,由于delta是uint32类型,无法为负数,因此无法支持减法操作。
D
3
关于Go语言http.Server类型的ListenAndServe方法做的事情,下面描述错误的是()
A. 检查当前的http.Server类型的值的Addr字段。
B. 通过调用net.Listen函数在已确定的网络地址上启动基于TCP协议的监听。
C. 调用当前http.Server值的Serve方法准备接受和处理将要到来的HTTP请求。
D. 这个方法不会开启针对网络连接的存活探测机制,无法保证连接是持久的。
D
4
下列程序中创建文件/目录,权限设置正确的是()
```go
func initAccessfile() (int, error) {
f, err := os.OpenFile("access.txt", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
if err != nil {
return 0, err
}
defer f.Close()
return f.WriteString("Merge access record:\n")
}
func initLogger(dirName, fileName string) {
if _, err := os.Stat(dirName); err != nil {
if err = os.MkdirAll(dirName, os.ModePerm); err != nil {
panic(err)
}
}
}
```
A. initAccessfile 正确;initLogger 正确
B. initAccessfile 错误;initLogger 错误
C. initAccessfile 正确;initLogger 错误
D. initAccessfile 错误;initLogger 正确
C
5
对于下面这段Go语言汇编代码,描述错误的是()
```go
"".add STEXT size=108 args=0x18 locals=0x28
0x0000 00000 (main.go:5) TEXT "".add(SB), $40-24
0x0000 00000 (main.go:5) MOVQ TLS, CX
0x0009 00009 (main.go:5) MOVQ (CX)(TLS*2), CX
0x0010 00016 (main.go:5) CMPQ SP, 16(CX)
0x0014 00020 (main.go:5) JLS 101
0x0016 00022 (main.go:5) SUBQ $40, SP
0x001a 00026 (main.go:5) MOVQ BP, 32(SP)
0x001f 00031 (main.go:5) LEAQ 32(SP), BP
0x0024 00036 (main.go:5) PCDATA $2, $0
0x0024 00036 (main.go:5) PCDATA $0, $0
0x0024 00036 (main.go:5) MOVQ $0, "".~r2+64(SP)
0x002d 00045 (main.go:6) MOVQ "".y+56(SP), AX
0x0032 00050 (main.go:6) MOVQ AX, (SP)
0x0036 00054 (main.go:6) MOVQ $1, 8(SP)
0x003f 00063 (main.go:6) CALL "".sub(SB)
0x0044 00068 (main.go:6) MOVQ 16(SP), AX
0x0049 00073 (main.go:6) MOVQ AX, "".a+24(SP)
0x004e 00078 (main.go:7) MOVQ "".x+48(SP), CX
0x0053 00083 (main.go:7) ADDQ CX, AX
0x0056 00086 (main.go:7) MOVQ AX, "".~r2+64(SP)
0x005b 00091 (main.go:7) MOVQ 32(SP), BP
0x0060 00096 (main.go:7) ADDQ $40, SP
0x0064 00100 (main.go:7) RET
```
A. ` 0x002d 00045 (main.go:6) MOVQ "".y+56(SP), AX `
表示将SP + 56这个内存地址存放的值赋值给AX寄存器。
B. ```go
0x0032 00050 (main.go:6) MOVQ AX, (SP)
0x0036 00054 (main.go:6) MOVQ $1, 8(SP)
0x003f 00063 (main.go:6) CALL "".sub(SB)
```
这个表示将AX里面的值,还有常量1压入栈中,然后调用sub函数, 函数的参数是前面压入的两个值。
C. ```go
0x0044 00068 (main.go:6) MOVQ 16(SP), AX
0x0049 00073 (main.go:6) MOVQ AX, "".a+24(SP)
0x004e 00078 (main.go:7) MOVQ "".x+48(SP), CX
0x0053 00083 (main.go:7) ADDQ CX, AX
```
表示将SP + 16地址里面的值赋值给a,最终将a和SP + 48内存地址的x相加,结果存放在CX寄存器中。
D. ` 0x003f 00063 (main.go:6) CALL "".sub(SB)`会将下一个指令的地址压入栈中,然后调用sub函数。
C
6
下边Go语言程序中,发生逃逸的变量是()
```go
type S struct {
}
func main() {
var v1 S
var v2 S
_ = *ref(&v1)
_ = *val(v2)
}
func ref(v3 *S) *S {
return v3
}
func val(v4 S) *S {
return &v4
}
```
A. v1
B. v2
C. v3
D. v4
选D试试吧 之前选B错了
7
对于如下Go程序片段,下面描述正确的有()
```go
func map1() {
m := make(map[int]int)
for i := 0; i < 10; i++ {
m[i] = i
}
for k := range m {
delete(m, k)
}
m = nil
}
```
A. map在增加键值对时,会触发扩容
B. m的元素删除后,会释放占用的内存
C. 在for循环中遍历删除时,会引起异常
D. 在m赋值为nil时,会释放map占用的内存
AD
8
关于Goroutine调度的G-P-M模型,下面描述正确的是()
A. 每个Goroutine有自己的栈内存,切换时寄存器值会保存到栈内存中。
B. 每个M都有自己的Goroutine列表。
C. 每个Goroutine都在固定的M中执行。
D. P的数量是由GOMAXPROCS决定的。
ABD
3ms搜到的答案,存疑
9
对于下边Go语言代码的运行结果,下面描述正确的是()
```go
func main() {
a := make(chan int)
go func() {
for i := 0; i < 10; i++ {
time.Sleep(time.Second)
a <- i
}
// 1 close(a)
}()
// 2. close(a)
for i := range a {
fmt.Println("Value i", i)
}
}
```
A. 上述程序运行后会直接退出,不输出任何内容。
B. 上述程序会依次输出Value 0~ Value 9,然后因为死锁crash
C. 在1处中调用close(a)可以使程序顺利结束,且正确输出Value 0 ~ Value 9
D. 在2处中调用close(a)可以使程序顺利结束,且正确输出Value 0 ~ Value 9
BC
10
下列选项中,可以保证initialise函数只调用一次的有()
```go
var once sync.Once
func initialise(){
// do something to initialise the programe
}
```
A. ```go
func main() {
go once.Do(initialise)
go initialise()
}
```
B. ```go
func main() {
go func() {
once.Do(initialise)
}()
go initialise()
}
```
C. ```go
func doInit() {
once.Do(initialise)
}
func main() {
go doInit()
doInit()
}
```
D. ```go
func main() {
go once.Do(initialise)
go func() {
once.Do(initialise)
}()
}
```
CD
3ms搜到的答案是CD
自测只有C可以
11
关于go test相关flag和工具的使用,以下描述正确的有()
A. 用命令go test -count N执行示例函数(Example_开头)会执行N次
B. 用命令go test -failfast 执行用例,在第一个用例失败后,不会再执行其后的用例
C. 用命令go test -count N时,如果同时用-cpu指定了cpu集合,用例会在所有协程上执行N次
D. 用命令go test -parallel 1 -p 1执行用例。
是BCD吧
-parallel 1 表示允许同时执行并行测试的函数数目是 1,默认是 GOMAXPROCS,-p 1 表示允许并行测试的 test binary 同时只有一个,默认是 CPU的核数。
http://3ms.huawei.com/km/blogs/details/11006795
某开源图像解析库存在解析漏洞,NVD(National Vulnerability Database)漏洞库对该漏洞评分是攻击向量(AV)为网络(N),机密性影响(C)/完整性影响(I)/可用性影响(A)都是高(H)。某产品中集成了该开源图像库,用于解析本地的图片,且使用系统低权限用户运行该图像解析进程,针对该产品的攻击场景,CVSSv3(Common Vulnerability Scoring System)基础评分中下列哪个说法是正确的:
A. 机密性影响(C)/完整性影响(I)/可用性影响(A)为高(H)
B. 攻击向量(AV)为网络(N)
C. 攻击向量(AV)为本地(L)
D. 只有可用性影响(A)为高(H)
A. 产品Mission来源于产品竞争力分析
B. 产品资产及其价值分析是产品韧性目标定义的输入之一
C. 产品Mission定义是产品利益相关人价值分析的重要输入
D. 产品韧性目标需要描述清晰产品需要实现的特性、功能或者目标状态,这些目标并不要求必须是可度量的