一、背景
开发音视频共享屏幕功能过程中,调用开启取屏程序理解崩溃(SIGSEGV),具体崩溃点如下:
源文件为:WebRTC/src/modules/desktop_capture/linux/screen_capturer_x11.cc
仔细思考,问题大概率出现在传参,那只可能是options, 但问题行代码root_window_ = RootWindow(display(), DefaultScreen(display()));
并没有使用options,别急,继续追踪,发现:
Display* display() { return options_.x_display()->display(); }
#define DefaultScreen(dpy) (((_XPrivDisplay)(dpy))->default_screen)
此时一目了然了,display()结果地址应该无效,访问成员default_screen出现了段错误。
options在哪生成的呢,继续排查下去,如下:
BuildOptions
未return,导致编译器返回一个不知道是什么的option
,导致问题出现,代码最终如下:
到这儿就比较清晰了,没有进行XOpenDisplay打开的display是无效的,访问就会造成crash。
二、 结论
对非void函数未正确进行return会造成一系列问题
三、思考
为什么编译器没有报错?
查阅相关资料,结论如下
- clang编译器会报警告
- gcc, vc编译器不会报警告,会返回eax寄存器中的值
划重点:请增加编译标志-Wreturn-type或-Wall
warning: no return statement in function returning non-void [-Wreturn-type]
}