首页 > 解决方案 > 如何让 GCC 强制执行纯/常量属性?

问题描述

我尝试使用属性 const 和 pure 来尝试让 GCC 强制一个函数不允许访问任何全局变量,但这编译得很好:

#include <stdlib.h>
#include <stdio.h>

int data;

__attribute__((const))
int test_func(int val){
    data = val;
    return data;
}

int main(){
    scanf("%d", &data);
    printf("test: %d\n", test_func(data));
    return 0;
}

这不应该编译。

有没有办法强制执行规则,即函数本身和它调用的任何其他函数都不能访问除参数之外的任何变量?

标签: gccconstants

解决方案


GCC手册__attribute__((const))程序员使用它来指示函数的行为,以便更好地优化它。

调用返回值不受程序可观察状态更改影响且对这种状态除了返回值没有可观察到的影响的函数的调用可能有助于优化,例如消除公共子表达式。使用 const 属性声明此类函数允许 GCC 避免在重复调用具有相同参数值的函数时发出一些调用。

在文档中,在某些情况下会出现编译错误,而错误行为(访问函数内的全局变量)不是其中之一。因此,您有责任不要将此属性用于使用全局变量的函数。


推荐阅读