如何确保在不满足条件时不运行特定代码
How to ensure that a specific code is not run while a condition is not met
我在嵌入式系统上使用 C/CPP,在我的代码中,我有一些部分是从一些"无效"的内存中运行的,在满足某些条件之前不得调用。
为简单起见:
假设foo()
是这样的函数,并且在g_isMemoryValid == false
时无效
除了 foo() 之外,无效内存部分中还有几个其他函数,每个函数都来自所有模块的多个调用。
我的问题是找到我输入无效部分的所有实例并验证我没有错过任何电话!
如何确保运行foo()
的所有分支机构都符合g_isMemoryValid == true
解决方案应输出:
跳转到代码(或指令地址)的行,但即使它只会发出模块名称,
或者地狱...[好的,NOT_OK]会做:)
注意:即使是只能解决部分场景的解决方案也可以!
请注意,除了简单的if(g_isMemoryValid)
包装器(例如调用链接调用函数本身未在满足条件或分支的某些不同语法时未调用)之外,还有许多方案
if (g_isMemoryValid)
foo(); // should pass
if (!g_isMemoryValid)
return;
foo(); // should pass too
至少在我看来
,一种比宏更优雅的解决方案是使用函数指针:
#include <stdio.h>
// The real foo()
void foo()
{
puts("OK");
}
// Handle 'invalid' memory (error message?)
void mem_invalid()
{
puts("Not OK");
}
typedef void (*foo_t)();
foo_t foo_ptr = &mem_invalid;
void main(void)
{
// Memory is 'invalid', calls error routine
foo_ptr();
...
// Memory became good somehow
foo_ptr = &foo;
...
// Call now succeeds
foo_ptr();
}
这将使用函数指针代替标志。
根据您的嵌入式系统,间接函数调用可能会有一些开销,但除非它位于内部循环等关键区域,否则它应该不是问题。 错误处理程序甚至不需要做任何事情 - 或者它可以像你喜欢的那样复杂。
如果你不能修改foo
的调用方式,你必须修改foo本身:
- 将
foo
函数重命名为inner_foo
- 给自己写一个
foo
,做所有的检查,打印所有的消息,只要一切正常,就称自己为inner_foo
- 重新编译包含旧 foo 和新 foo 的模块,并重新链接调用
foo
的所有模块。
现在所有分支都将调用您自己的新foo
函数。
相关文章:
- 如何在linux终端中同时编译和运行c++代码
- 尝试用java代码编译和运行c++代码
- 不同/较旧的处理器运行c++代码的方式是否不同
- 无法在 geany 上运行代码。无法执行构建命令
- 运行代码时,c++ 会终止进程
- 编译多个C++文件.调用二进制文件以运行代码
- 分段故障 运行C++代码时出现 SIGSEGV
- 如何分析在 Windows 上运行C++代码?
- 编译器资源管理器(godbolt)如何安全地运行代码?
- 如何在 vim (windows) 中编译和运行 c++ 代码
- 无法在 Visual Studio 代码中生成和运行 C++ 代码
- 连续运行C++代码和 Python 代码
- 在静态初始化期间运行代码
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- 我最近更改了编译器路径以运行 c++ 代码,但现在我无法运行任何 python 代码。我该如何解决这个问题?
- 如何在Visual Studio Code的终端内运行C++代码?
- 在注入的 Dll 的 DllMain 中运行代码导致注入超时
- 并行和顺序运行代码时会产生不同的结果
- 运行代码时C++错误
- 在 CortexM0 中从 RAM 运行代码时出现硬故障