gcc - 如何让 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;
}
这不应该编译。
有没有办法强制执行规则,即函数本身和它调用的任何其他函数都不能访问除参数之外的任何变量?
解决方案
GCC手册说__attribute__((const))
程序员使用它来指示函数的行为,以便更好地优化它。
调用返回值不受程序可观察状态更改影响且对这种状态除了返回值没有可观察到的影响的函数的调用可能有助于优化,例如消除公共子表达式。使用 const 属性声明此类函数允许 GCC 避免在重复调用具有相同参数值的函数时发出一些调用。
在文档中,在某些情况下会出现编译错误,而错误行为(访问函数内的全局变量)不是其中之一。因此,您有责任不要将此属性用于使用全局变量的函数。
推荐阅读
- ember.js - 获取在用户配置文件创建期间创建的 JWT 令牌:Ember js
- javascript - 嵌套 $(document).ready()
- php - PHP Laravel,无需重新编译即可编辑刀片文件
- vb.net - 我继承了一个列表(字符串)并想减少实例本身,如何?
- json - 如何从sql server中的表中查询json数组类型列的值?
- jquery - $(document).ready() 有时在 AngularJS 应用程序中不起作用
- javascript - 单击提交按钮时的动画加载圈
- java - 如何通过 SharedPreference 在按钮中仅保存一个 phoneId 和密码
- angular - 无法读取未定义角度的属性“订阅”
- android - 为什么 EditText 中的 Android imeActionId - activity.xml 显示错误 Invalid resource type?