Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪个工具可以列出对C中特定变量的写入权限?_C++_C_Code Analysis_Static Code Analysis - Fatal编程技术网

C++ 哪个工具可以列出对C中特定变量的写入权限?

C++ 哪个工具可以列出对C中特定变量的写入权限?,c++,c,code-analysis,static-code-analysis,C++,C,Code Analysis,Static Code Analysis,不幸的是,我甚至不知道这种静态分析是如何调用的。它不是真正的控制流分析,因为我不寻找函数调用,也不真正需要数据流分析,因为我不关心实际值 我只需要一个工具,列出对特定变量进行写入访问的位置(文件、函数)。我甚至不在乎列表中是否包含无法访问的行。我可以想象,编写一个简单的解析器就足以完成这项任务,但我确信一定有一个工具可以完成这个简单的分析 作为一个穷学生,我会喜欢免费的或者更好的开源工具,如果有人能告诉我这种类型的静态分析实际上是如何被称为的,我也会同样感激 编辑:我忘了提到代码库中没有指针算法

不幸的是,我甚至不知道这种静态分析是如何调用的。它不是真正的控制流分析,因为我不寻找函数调用,也不真正需要数据流分析,因为我不关心实际值

我只需要一个工具,列出对特定变量进行写入访问的位置(文件、函数)。我甚至不在乎列表中是否包含无法访问的行。我可以想象,编写一个简单的解析器就足以完成这项任务,但我确信一定有一个工具可以完成这个简单的分析

作为一个穷学生,我会喜欢免费的或者更好的开源工具,如果有人能告诉我这种类型的静态分析实际上是如何被称为的,我也会同样感激


编辑:我忘了提到代码库中没有指针算法。

我不确定是否可以编写这样的工具。指针可用于更改内存中的任意数据,而无需引用指向该数据的其他变量。想想像
memset()
这样的函数,它们会改变整个内存块

如果您对这些类型的突变不感兴趣,那么仍然需要考虑传递指针。在C语言中,可以有任意数量的指针指向相同的数据,并且必须分析这些指针的副本是在哪里生成的。然后这些副本可以被再次复制


因此,即使在“简单”的情况下,也需要进行大量的代码分析。

为什么不将变量
设置为const
,然后记下编译器禁止写访问的所有错误

注意:如果变量的内存以某种错误的方式写入,例如缓冲区溢出,则不会捕获错误

编辑:例如:

const int a = 1;
a = 2;
a = 3;
我的编译器生成:

1>MyProg.c(46): error C3892: 'a' : you cannot assign to a variable that is const
1>MyProg.c(47): error C3892: 'a' : you cannot assign to a variable that is const

你是说像这样的事吗


这适用于您努力分析的C程序。它是开源的,依赖信息也可以通过编程方式获得。随着静态分析仪的发展,它相当于光谱的“精确”一面。如果您的目标是嵌入式C代码,它会工作得更好。

哦,我忘了提到代码库中没有指针算法。这会使事情变得简单,但不会使它们变得琐碎。但是@Benji和Antoine提供的提示对我来说似乎是一个很好的解决方法。如果指针是在变量地址初始化的,它可能会被显示(尽管有很多误报)。否则,在任意地址书写将不会被捕获,但这是一个极端情况。@Antoine取决于它的准确性。在某些情况下,写操作将依赖于输入,这将非常困难,但您可以以“IF(Minconst变量的所有写入,如果您是指执行程序时出现的运行时错误,问题是程序在第一次写入时停止。@除非您丢弃常量,否则写入常量变量是错误的。显然,列举这些错误是可能的。。。请参阅我的编辑:是的,对于您显示的过于简单的示例,编译器会发出两个警告,但对于其他示例,它只会发出一个警告。编译器不会显示对
a
的所有写入操作,您甚至无法从收到的“从指针目标类型丢弃限定符”警告中轻松推断出第一次写入,更不用说其中的三次写入了。不过,您可以通过执行程序(但不是后一个)获得第一次写入。这就是说,如果OP的程序看起来像你的示例,那么是的,他可以处理编译器警告。它是否也告诉我写入访问的位置