是否有 C 编译器标志来检查函数修改后的输入参数?

问题描述

我想知道,C 编译器(即 GCC 或 GHS)是否有一个标志来检查输入参数是否被修改?

我的意思是,如果我有以下函数,xy 可能会在函数内修改(就像现在发生的那样),如果我不向它们添加 const .所以我想知道编译器是否可以检测到这种情况,以及是否存在这样做的标志。

int16_t myFunc(int16_t* x,int16_t* y,bool* e) 
{   
     int16_t z = 0;

     z = *x + *y;
     *x = 16; // this is wrong on purpose and I would like to detect it
      
     if ( z < 0)
     {
         *e = true;
     }

    return z;
}

解决方法

您在这里唯一想做的就是像这样使用 const

int16_t myFunc(const int16_t* x,int16_t* y,bool* e)
{
   ...
   *x = 42;  // compiler error here
   ...
}

此处编译器将发出诊断信息,例如 assignment of read-only location '*x'

这就是 const 关键字的用途,这就是您要查找的“标志”。

您应该尽可能将 const 放在指针参数上。如果您知道参数指向的对象不会被修改,请使用 const

,

我想知道,C编译器是否有一个标志来检查输入参数是否被修改?

有很多 C 编译器。我听说过 GCCClangTinyCCnwcc....(在 Linux 上;它们大部分都是开源的,你可以下载它们的源代码并改进它)。你可以自己写一个。

函数 myFunc 可以将某个 int16_t tab[12]; 的地址传递给另一个被调用的函数 myOtherFunc,后者有条件地调用第三个函数 myBizarreFunc,该函数会修改 tab[3]

而且很多 C 代码都有 function pointers。该函数指针可以在实际中在运行时计算(例如在 Linux 上使用 dlopen(3)dlsym(3),或使用 libgccjit...),然后在一些间接调用中使用。>

如果您使用最近的 GCC(至少在 2021 年,GCC 10),您可以编写自己的 GCC plugin 来执行您想要的静态分析(在 GIMPLE 表示上,也许也使用 Ghudi library)。您可以基于 Bismon 静态源代码分析器进行开发(然后通过电子邮件与我联系 basile.starynkevitch@cea.fr)。另请参阅(2021 年)this 草稿报告。

如果您使用 GCC,您可以使用 gcc -Wall -Wextra -flto -O2 和更多 static analyzer flags 编译并链接,至少像 -fanalyzer

还要研究 DECODERCompCert 之类的项目,Frama-CClang static analyzerAbsInt 之类的静态分析工具

注意与 Rice's theoremGödel's incompleteness theoremsCurry-Howard correspondenceNo free lunch theoremhalting problem 相关的理论限制。

我相信您想要进行的检查在编译时并不总是可靠的。

您可能会对 abstract interpretation 技术感兴趣。

您可能会对 address sanitizervalgrind 之类的检测工具(修改生成的机器代码)感兴趣,并且在某些情况下,您可以编写自己的工具(也许作为 C 到 C 代码转换器) ).

另见thisthat答案

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...