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

gcc - how to detect pointer-based memory access

本文关键字:指针 内存 访问 于指针 检测 gcc- 何检测      更新时间:2023-10-16

我关注的是微Python,特别是分支动态原生模块。

将来,此功能将允许您将C/C++函数编译为本机.obj,并将其与.py接口打包在一起,从而大大提高速度。

太棒了!但问题是,如果你使用的是没有虚拟内存的RTOS,那么任何正在执行的本地代码都可以访问地址空间的任何部分,包括外围设备、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文件并检测指针的使用(对于每种二进制二进制格式)

评论反馈

我知道可能不可能阻止恶意用户,但这不是首要问题。我们希望停止善意但偶然的代码。如果不可能停止每一个单独的情况,那就

如果我们可以禁止/检测显式指针访问,并简单地提供有关数组使用的警告,那么这仍然非常有价值。

警告:您正在使用阵列!确保你不会越界

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

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

有一种方法可以做你想做的事——只要你避免诚实的错误,而不是故意破坏事情。

首先,您接受C++核心指南,并使用工具的支持:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-工具

出于您的目的,它将阻止您的代码在非库代码中使用原始指针和指针算术。时期核心指导方针的作用不止于此,但这正是与您的问题相关的内容。

然后,对代码执行一个简单的grep,以确保它没有使用Guidelines所支持的指针——这或多或少是一个简单grep的情况。

在实践中,这是不可能的。

您可能会考虑更改编译(例如,使用GCC插件,如Florian Weimer的回答中提到的),以检查对数组的每次访问,但这会使生成的代码明显变慢。你的原生硬件已经足够慢了,你不想让它变得更慢。

Python并不是正确的源语言。它的动态键入会使它的速度变得相当慢。

也许你可以考虑一种静态类型的语言,比如Ocaml(与JIT或AOT编译库相结合,比如GCCJIT等)。类型系统(及其推理)提高了生成代码的安全性(和速度),并付出了大量的努力(几年,可能值得获得博士学位因为你需要做新的研究),你可能会改进类型推断,甚至推断出数组索引从未越界的情况(甚至不需要索引边界检查)。

在大多数情况下,升级硬件(升级为树莓派风格的硬件,带有MMU,并且可能具有带一些虚拟内存的真实操作系统)可能是最实用的方法

PS。请注意Rice定理。大多数静态源分析无法可靠且良好地工作(从技术角度来看,是健全和完整的)。