【问题标题】:Inject a memory exception by accessing forbidden memory location通过访问禁止的内存位置注入内存异常
【发布时间】:2020-01-23 09:24:09
【问题描述】:

我想测试我为嵌入式系统编写的异常处理函数,并想编写一个测试代码来注入对被禁止的内存的访问。

void Test_Mem_exception
    {
    __asm(
    "LDR R0, =0xA0100000\n\t"
    "MOV R1, 0x77777777\n\t"
    "STR R1, [R0,#0]"
);

这是我要在 0xA010000 处写入访问内存位置的代码。不知何故,这对我来说似乎不是通用的测试代码。

是否有用 C 或 C++ 编写此类测试代码的标准方法。通用我的意思是一个独立于它运行的系统的内存映射的代码。

【问题讨论】:

  • 硬件异常是特定于体系结构的,可移植的 C 代码将在任何平台上生成异常是不可行的。这也是不必要的,您只需为感兴趣的平台编写一个适当的测试。
  • ...“对于每个感兴趣的平台”我的意思是。
  • 一种可能性是在整个地址范围内简单地迭代 volatile 指针并取消引用它。如果任何地址无效并且此类无效访问将产生异常,那么您最终会命中它。如果您以 1K 或 4K 甚至更大的步长进行迭代并加快迭代速度,它可能仍然可以工作(它完全可以工作)。如果您还错位了地址,在某些平台上它会立即生成异常 - 尽管可能与您的预期不同。

标签: c testing embedded fault


【解决方案1】:

我不会为此使用asm,只需使用指针即可。

void Test_Mem_exception
{
  /* volatile, to suppress optimizing/removing the read statement */
  volatile int *ptr = 0xC0C0C0C0;
  int value = *ptr;
}

这并不总是导致异常,因为在某些系统上从地址 0 读取可能是有效的。

这同样适用于任何其他地址,不存在任何地址会在所有系统上失败。

【讨论】:

  • 这会产生运行时错误,因为语言需要它,但不一定会导致异常。
  • @Clifford 什么是runtime error?我在 Ansi-C 标准中找不到这个术语。也许de-referencing a null pointer could be undefined behavior,但即便如此仍在讨论中。并且使用0 只是一个示例(好吧,也许是一个糟糕的示例)
  • 线索就在名称中 - 错误是在程序运行时而不是在编译时发生的。取消引用 NULL 指针总是在 C 中是一个错误,但它只会导致未定义的行为 - 取消引用 NULL 指针永远不会有效 - 即使地址零有效 - 这只是意味着你不能使用 C 代码读取/写入地址零处的数据。 C 语言中没有任何东西需要异常,这就是为什么它不能保证解决问题的原因。这可能有点迂腐,因为在我看来这个问题无论如何都是考虑不周的。
  • @Clifford 可以使用不同于 0 的值定义 NULL 指针。并且仍然存在解除引用有效的例外情况 The defined behavior can simply be "you may dereference the null pointer as long as the value is not accessed. 引用来自 Johannes Schaub - litb。但是我将值更改为问题较少的值:-)
  • NULL 宏可以重新定义,但空指针始终是空指针 C99 和 C++ 都保证整数值零表示空指针 - 即使机器相关的表示不同。您修改后的解决方案与 OPs 代码基本相同。这演示了一个 C 语言解决方案,但不是适用于所有平台的单一解决方案。也许这就是我们所需要的——至少它不是特定于特定指令集的。
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2020-04-17
  • 1970-01-01
  • 2011-10-20
相关资源
最近更新 更多