C语言项目不规范函数声明的隐患及其检测
一个线上问题
一服务进行现网版本发布。服务更新后,收到 core dump 告警。查看 core file,从函数调用栈帧、地址、行号等信息来看,已经有部分内存遭到污染。栈帧出现了重复,gdb 显示的行号也显然不可能发生问题。好在通过 core file 函数名进行代码分析后,比较及时地找到了问题原因。
一服务进行现网版本发布。服务更新后,收到 core dump 告警。查看 core file,从函数调用栈帧、地址、行号等信息来看,已经有部分内存遭到污染。栈帧出现了重复,gdb 显示的行号也显然不可能发生问题。好在通过 core file 函数名进行代码分析后,比较及时地找到了问题原因。
为什么叫“再造”呢?有再造,那么就一定有第一个:GitHub: Bokjan/DiaoBot。
DiaoBot是主体完工于2019年9月的企业微信机器人框架,完整地实现了当时企业微信机器人所有能力的封装。但其存在一些不论是当时还是现在都会令人感觉比较奇怪的一些缺陷:
select()
的复用,性能低(?真的需要性能吗)diaobotd
)、公用SDK动态链接库(libdiaobot.so
)以及不定数量的用户业务逻辑动态链接库(由diaobotd
读取配置文件动态挂载)我现在惊讶地发现有一个问题其实是有解的:你可以找到一台既能够接收内网回调、又能够请求公网API的机器。如果说当你想干点什么的时候,却发现这个必要的工具其实不好用,是不是就会想去先把工具改造一下了?所以,到了差不多两年之后的今天,GitHub: Bokjan/wcbot横空出世。
在GitHub: Bokjan/LabDIP的Release中可以找到生成好的二进制。
这个学期开了一门课叫数字媒体处理技术,课程内容倒是非常丰富,图像、音频、视频都讲了个遍,涉及的内容也非常广。虽说课是这么一直这么上着,但是给人的感觉是听了也就听了,不知道有什么用,怎么用。这倒是不要紧,10月13号(第六周)开始实验课了。原以为像往常的实验一样,这实验也不打紧,看到任务书倒是目瞪口呆。
修改示例程序,从一个图像显示框,改造成两个显示框,并增加一个文本参数输出框,实现类似下图的基本程序界面(可在此基础上进一步优化)。
- 功能区可以分tab页,按照后续功能添加;
- 图像显示区域需考虑图像的缩放与自适应显示;
- 参数输出区,用以显示过程,以及相关统计数据和调试信息,可滚动,可选择,可复制,可清除。
阅读程序框架,继续采用Windows多线程和OpenMP两种方式,补充实现下述功能。算法需自行实现,不能直接使用OpenCV函数。- 采用三阶插值的图像任意角度旋转与缩放
- 图像的傅立叶变换,并与功能1联动,输入图像经过旋转、缩放后的傅立叶变换结果可在右侧显示
- 给图像添加高斯噪声
- 采用采用平滑线性滤波、高斯滤波、维纳滤波三种方法过滤不同参数的高斯噪声
今天要介绍的是一个C语言编写的随机数库Radiom,它需要RTLSDR硬件设备支持。目前仅能在Linux平台使用,不过可以很方便地修改,使其能够在Windows和macOS上生成。其实一个月以前就在做这个工作了,毕竟那一段时间比较闲,想要找一点事情做。不过基本完工之后呢,又渐渐地忙了起来,所以这里其实是写的一个月前的事情。
两年以前,我就写过一篇《软件定义无线电导论》,简单介绍了一些廉价的 RealTeK SDR 设备的玩法。一个月前经常纠结于外卖点什么的问题,经常使用RANDOM.ORG的服务。那么也算是心血来潮,我想,为什么不可以自己做一个相似的东西呢?想到手边有一个RTL2832的电视棒,觉得可行,于是说干就干了。
距BravoFinder的第一次发布已经过去了接近两年时间,这段时间里获得了不少人的支持,也发现了一些问题。为了解决许多历史遗留问题,前一段时间我将整个项目完全推翻重写了一次,编码工作已经完成了,文档工作正在慢慢补上。
我一直致力于写平台无关的代码,并且在这个项目里面确实也不会用上专有的API。考虑到大部分模拟飞行玩家都是Windows用户,Windows平台是必须支持的。但我长时间在*nix下做开发,使用的工具链与微软系还是有一定距离,比如CMake在Windows上正常运作可能就有些困难了。在Windows上构建不会太难,但是一个示范介绍是绝对必要的。
这次展示的内容依旧使用自由软件工具链,但不运行于类似于Cygwin的模拟环境下,而是完全使用Windows原生API。选择的IDE是轻量级C/C++开发工具Dev-C++,这个软件有一段历史了,官方更是早已停更,版本号停留在4.9.9.2。这里采用的是Orwell升级版,可以在SourceForge上下载。它附带了MinGW下的GCC及相关工具,GCC版本为4.9.2,稍显老旧,但支持BravoFinder中用到的C++11特性是足够了。
当然,在开始之前我们还需要将代码仓库给克隆下来。