如何解决对传递给特定函数的字符串文字进行编目C++ 中的数据驱动和测试
我有一个 C++ 应用程序,它不允许进行太多更改(遗留代码),它依赖于 C 头文件中的大量常量来运行(自定义/专有音乐/音频混合设备)。
设备偶尔不得不在某些硬件被换出的情况下进行更改,我们得到一个 C 头文件,其中提供了一个内存位置和名称列表,以启用/禁用整个音频设备中的功能,例如:
#define PCM_BASE 0x8000000
#define PCM_BASE_CHANNEL_0 0x80010000
#define PCM_BASE_CHANNEL_1 0x80020000
我们现在使用支持多种操作模式(即不同的采样率,例如 8kHz、11kHz、48kHz)的新“PCM 芯片”(即音频硬件)。我正在使用的代码设计得很差,如果不完全重新编写它就不能支持多种“模式”(不允许这样做;如果我这样做,我会被解雇)。我现在有 4 组头文件,它们具有完全相同的宏名称(即如上例所示),但值不同。
所以,我能想到两个直接的解决方案:
-
编译软件的多个版本(即每个“模式”一个;管理层可能会让我这样做,但他们想避免它,因为客户会因为不得不启动/关闭相同的实例而烦恼当他们想要更改音频“模式”时的应用程序)。
-
供应商提供这些值的
JSON
格式副本作为“JSON 目录”,按“模式”分类(下面的示例;编号方案没有明显/保证的模式)。{ "8K": { "PCM_BASE": "0x8000000","PCM_BASE_CHANNEL_0": "0x80010000","PCM_BASE_CHANNEL_1": "0x80020000" },"11K": { "PCM_BASE": "0x8010000","PCM_BASE_CHANNEL_0": "0x80110000","PCM_BASE_CHANNEL_1": "0x80120000" },"48K": { "PCM_BASE": "0x8090000","PCM_BASE_CHANNEL_0": "0x80910000","PCM_BASE_CHANNEL_1": "0x80940000" } }
到目前为止我的解决方案:我编写了一个简单的解析器,它从供应商提供的 JSON“目录”中读取 JSON 值,并使用一个简单的 getter/setter 类读取/写入这些内存地址 I写入(而不是通过 C 头文件直接写入这些内存地址)。
旧代码:
#include <stdint.h>
#include "pcm_memory_vendor.h"
uint32_t* pcm = PCM_BASE;
// Turn chip on.
*pcm = 1;
新代码:
MemoryHandler mem;
if (mode.is_8k()) {
mem.write("PCM_BASE","8K",1)
}
另外,(排队 Picard facepalm),某些模式将具有其他模式中不存在的额外功能 :(。例如,“48K”模式具有一些额外功能:
{
"8K": {
"PCM_BASE": "0x8000000","PCM_BASE_CHANNEL_1": "0x80020000"
},"11K": {
"PCM_BASE": "0x8010000","PCM_BASE_CHANNEL_1": "0x80120000"
},"48K": {
"PCM_BASE": "0x8090000","PCM_BASE_CHANNEL_1": "0x80940000","PCM_BASE_CHANNEL_2": "0x80A10000","PCM_BASE_CHANNEL_3": "0x80A40000","PCM_BASE_CHANNEL_4": "0x80B40000","PCM_BASE_CHANNEL_5": "0x80C40000",}
}
我的问题:是否有一些装饰器或单元测试框架/工具可以用来“审核”我的代码以验证传递给我的 write()
函数的字符串文字,但在编译时时间?例如,我想确保一个罕见的用例(即很少触及的代码块,即使是通过代码覆盖率测试)实际上正在尝试搜索有效的内存地址(即有效的字符串文字)。
我知道我可以通过编写一个解析器来实现这一点,该解析器将 JSON“目录”转换为一堆 C++ 定义(即生成一个充满 constexpr
字符串的头文件,并让我的代码直接使用这些字符串定义通过在编译时将这个新的头文件包含在我的代码库中),但我想保留这种数据驱动/运行时方法(使 QA 团队更容易通过直接使用它来编写 shell 脚本和 Python 脚本JSON 目录,而不必编写调用 C/C++ CLI 工具的脚本)。
我也想过只grep
更新我的代码库,但这也不能保证。例如,可以捕获以下字符串文字:
mem.write("PCM_BASE","11K",1);
但以下不会,并且是有效的 C++:
mem.write(
"PCM_BASE",1);
重点:是否有一些语法糖、代码装饰器或(简单的)C++ 测试框架可以让我审计/跟踪传递给我的函数的参数(即字符串文字),或者我是否只需要咬紧牙关,编写一个解析器,将所有这些动态查询的 JSON 值转换为编译时常量,我“烘焙”到我的 C++ 程序中?
谢谢!!!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。