如何确保在不满足条件时不运行特定代码

How to ensure that a specific code is not run while a condition is not met

本文关键字:运行 代码 条件 不满足 何确保 确保      更新时间:2023-10-16

我在嵌入式系统上使用 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函数。