问题描述
我想知道,C 编译器(即 GCC 或 GHS)是否有一个标志来检查输入参数是否被修改?
我的意思是,如果我有以下函数,x
和 y
可能会在函数内修改(就像现在发生的那样),如果我不向它们添加 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 编译器。我听说过 GCC、Clang、TinyCC、nwcc....(在 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
。
还要研究 DECODER 或 CompCert 之类的项目,Frama-C 或 Clang static analyzer 或 AbsInt 之类的静态分析工具
注意与 Rice's theorem、Gödel's incompleteness theorems、Curry-Howard correspondence、No free lunch theorem、halting problem 相关的理论限制。
我相信您想要进行的检查在编译时并不总是可靠的。
您可能会对 abstract interpretation 技术感兴趣。
您可能会对 address sanitizer 或 valgrind 之类的检测工具(修改生成的机器代码)感兴趣,并且在某些情况下,您可以编写自己的工具(也许作为 C 到 C 代码转换器) ).