Как заставить GCC применять атрибут pure / const? - PullRequest
1 голос
/ 24 мая 2019

Я попытался использовать атрибут 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;
}

Это не должно компилироваться.

Есть ли способ применить правило, согласно которому ни сама функция, ни любые другие вызываемые ею функции не могут получить доступ к каким-либо переменным, кроме их аргументов?

1 Ответ

3 голосов
/ 24 мая 2019

Руководство по GCC говорит, что __attribute__((const)) используется программистом, чтобы указать поведение функции, чтобы ее можно было лучше оптимизировать.

Вызовы функций, на возвращаемое значение которых не влияют изменения наблюдаемого состояния программы и которые не оказывают видимого влияния на такое состояние, кроме как для возврата значения, могут быть использованы для оптимизаций, таких как устранение общих подвыражений. Объявление таких функций с помощью атрибута const позволяет GCC избегать генерации некоторых вызовов при повторных вызовах функции с одинаковыми значениями аргументов.

В документации есть несколько случаев, для которых обещана ошибка компиляции, и неправильное поведение (доступ к глобальным переменным внутри функции) не является одним из них. Поэтому вы обязаны не использовать этот атрибут для функций, использующих глобальные переменные.

...