C 通过访问禁止的内存位置注入内存异常

C 通过访问禁止的内存位置注入内存异常,c,testing,embedded,fault,C,Testing,Embedded,Fault,我想测试一个为嵌入式系统编写的异常处理函数,并想编写一个测试代码来注入对内存的访问 void Test\u Mem\u异常 { __asm( “LDR R0,=0xA0100000\n\t” MOV R1,0x7777\n\t “STR R1,[R0,#0]” ); 这是我想在0xA010000处写入访问内存位置的代码。不知为什么,这似乎不是一个通用测试代码 在C或C++中有一种编写测试代码的标准方法。泛型是指独立于系统运行的内存映射的代码。< /P> < P>我不使用 ASM,简单地使用指针

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

void Test\u Mem\u异常
{
__asm(
“LDR R0,=0xA0100000\n\t”
MOV R1,0x7777\n\t
“STR R1,[R0,#0]”
);
这是我想在0xA010000处写入访问内存位置的代码。不知为什么,这似乎不是一个通用测试代码


在C或C++中有一种编写测试代码的标准方法。泛型是指独立于系统运行的内存映射的代码。< /P> < P>我不使用<代码> ASM<代码>,简单地使用指针。< /P>

void Test_Mem_exception
{
  /* volatile, to suppress optimizing/removing the read statement */
  volatile int *ptr = 0xC0C0C0C0;
  int value = *ptr;
}
这并不总是导致异常,因为从地址0读取在某些系统上可能是有效的


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

硬件异常是特定于体系结构的,在任何平台上生成异常的可移植C代码是不可行的。也没有必要,您只需为感兴趣的平台编写适当的测试。。。。“对于每个感兴趣的平台”我的意思是。一种可能是简单地在整个地址范围内迭代一个
volatile
指针并取消引用它。如果任何地址无效,并且这种无效访问将生成一个异常,那么您最终会遇到它。它可能仍然有效(在它工作的地方),如果您以1K或4K甚至更大的步数进行迭代,将加快迭代速度。如果您还未对齐地址,则在某些平台上,它将立即生成异常-尽管可能是与您预期不同的异常。这将生成运行时错误,因为语言需要它,但不一定会导致错误例外。@Clifford什么是
运行时错误
?我在Ansi-C标准中找不到这个术语。也许,但即使是这个术语,仍在讨论中。而使用
0
只是一个示例(好的,也许是一个不好的示例)线索在于名称——以及程序运行时而不是编译时发生的错误。在C中取消引用空指针始终是一个错误,但它只会导致未定义的行为——取消引用空指针永远无效——即使地址零是有效的——这只意味着您无法使用C代码在同一时间读/写数据地址零。C语言中没有任何东西需要异常,这就是为什么不能保证它能解决这个问题的原因。这可能有点迂腐,因为在我看来,这个问题无论如何都是考虑不周的。@Clifford空指针可以用不同于0的值定义。而且,在某些例外情况下,解引用是有效的
定义的行为可以是“只要不访问该值,就可以取消空指针。< /COD>引用。但是我把值改成了一个较小的问题:-空宏可以重新定义,但是空指针总是空指针C99和C++,它都保证一个整数值零表示空指针——即使机器依赖表示。定义不同。修改后的解决方案基本上与OPs代码相同。这演示了一个C语言解决方案,但不是针对所有平台的单一解决方案。也许这就是所需的——它至少不是特定于特定指令集的。