如何禁止在编译时使用全局变量

时间:2014-07-08 13:24:45

标签: c gcc compiler-construction

有没有办法禁止使用全局变量?

我希望GCC在定义全局变量时在编译时生成错误。

我们有一个应该按线程运行的代码,并且只允许使用堆栈(这是线程安全的)

有没有办法强制执行呢?

某些GCC标志或其他验证方式?

3 个答案:

答案 0 :(得分:17)

一种方法是生成链接器映射文件(例如将选项 -Wl,-Map,program.map 传递给gcc),并检查 .data .bss 输出部分,用于您希望在没有全局变量的情况下运行的目标文件的任何贡献。

例如,如果我的源文件 hello.c 具有:

static int gTable[100];

链接器映射文件中将包含以下内容:

.bss            0x0000000000600940      0x1b0
 *(.dynbss)
 .dynbss        0x0000000000000000        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
 *(.bss .bss.* .gnu.linkonce.b.*)
 .bss           0x0000000000600940        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o
 .bss           0x0000000000600940        0x0 /usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o
 .bss           0x0000000000600940        0x1 /usr/lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o
 *fill*         0x0000000000600941       0x1f 00
 .bss           0x0000000000600960      0x190 hello.o

您可以看到 hello.o 正在向 .bss 部分提供0x190(400)字节。我使用了使用Python脚本解析链接映射文件的方法,为嵌入式项目生成代码大小和RAM使用指标,并且过去取得了相当的成功;链接器的文本输出格式非常稳定。

答案 1 :(得分:8)

gcc中没有这样的功能。一些解决方法是在构建过程中加入一个可以检测全局变量的静态分析工具。编译不会失败,但至少你会以某种方式受到警告。我可以看到PC-Lint(www.gimpel.com)有一张支票

  

非常量非易失性全局变量,找到这些变量可以帮助多线程应用程序检测非重入情况

可能其他工具可能包含类似功能。

答案 2 :(得分:0)

我会使用ctags从源代码中提取符号,然后使用(perl或python)脚本搜索输出以获取全局变量。

E.g。以下行将告诉您C soucre文件hello.c是否包含全局变量:

ctags -f- hello.c | perl -ne"@a=split(/\t/, $_); if ($a[3] eq qq(v)){ print qq(Has global variables.); exit 0; }"