linux程序非void函数未进行return造成的问题及思考

一、背景

开发音视频共享屏幕功能过程中,调用开启取屏程序理解崩溃(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]
 }

可以参考GCC 中在非 void 函数中不写 return 的情况

猜你喜欢

转载自blog.csdn.net/weixin_36623563/article/details/125866628