c++ - gcc - 如何检测基于指针的内存访问

标签 c++ c gcc decompiling

我专注于 micropython,特别是分支 dynamic-native-modules .

此功能将在未来允许您将 C/C++ 函数编译为原生 .obj 并将其与 .py 接口(interface)打包在一起,用于巨大的速度提升。

太棒了!但问题是,如果您使用的是实时操作系统,doesn't have virtual memory , 那么任何正在执行的 native 代码都可以访问地址空间的任何部分,包括外围设备、RTOS 的状态等。

你不希望用户能够做这样的事情:

void user_func()
{
/* point to arbitrary memory, potentially the reset registers, flash erase . . . you get the point */
  int * a = (int*)0x1234;  
  *a = 0x10110000; // DESTROY!!!
}

即使是以下内容也应该被禁止:

void user_func()
{
  int a;
  (int*)(&a-1000) = 0x10010111;
}

解决方案?

  • 创建自己的 gcc 版本(针对每种二进制格式)
  • 反编译 .obj 文件并检测指针的使用(针对每个二进制二进制格式)

意见反馈

我知道阻止恶意用户可能是不可能的,但这不是第一个担心的问题。我们想停止善意但意外的代码。如果不可能阻止每一个案例,那没关系

如果我们能够禁止/检测显式指针访问并简单地提供有关数组使用的警告,那仍然非常有值(value)。

WARNING: YOU'RE USING AN ARRAY! MAKE SURE YOU DON'T GO OUT-OF-BOUNDS

最佳答案

最好的机会是 GCC 插件,它查看前端生成的 GENERICGIMPLE IR 并实现您想要的政策。根据您要接受的政策和源代码,这可能需要大量工作并且非常困难。

如果您想要一种纯粹基于语法或基于类型的方法(简单地拒绝所有指针算法),那么 Clang 及其 AST 比 GCC 更容易使用。

关于c++ - gcc - 如何检测基于指针的内存访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187371/

相关文章:

c++ - 有效地对定义顺序的 vector 子集进行排序

c - 这个指针是否安全声明?

c++ - cpp vector 排序运行时错误

c++ - QCamera 获取分辨率和原始帧

c++ - C++中的::*是什么?

c - 如何重置 getutent() 的指针

java - Android 语音调用桌面

C++ 开始()和结束()

c - arm-none-eabi-gcc 4.8 段错误 (ChibiOS-RT)

c - 用普通 C 将文本文件读入数组