Какое предложение адреса для GNAT.Sockets.Selector_Type - PullRequest
2 голосов
/ 27 февраля 2020

Я использую Selector_Type в своем коде.

С одной стороны, Selector_Type из GNAT.Sockets поставляется с прагмой:

pragma Volatile (Selector_Type);

С другой стороны, правило Гнаткека 9.1.1.2 , примененное к моему коду, вызовет

изменяемый объект без предложения адреса [Volatile_Objects_Without_Address_Clauses]

из-за прагмы.

Эти топи c не обрабатываются в примере wikibook , и я не решаю эту проблему нигде в моем базовом коде.

Так какой адрес я должен использовать для моего селектора?

1 Ответ

4 голосов
/ 27 февраля 2020

Вы не можете. Selector_Type является изменчивым, потому что это интерфейс с операционной системой, и может (будет) меняться без каких-либо действий со стороны кода Ada.

Мой пробный пример был

package Rules is
   type Selector is limited private;
private
   type Selector is null record with Volatile;
   S : Selector;
end Rules;

проверено как

$ gnatcheck --show-rule rules.ads -rules +RVolatile_Objects_Without_Address_Clauses
rules.ads:5:04: volatile object with no address clause [Volatile_Objects_Without_Address_Clauses]

Похоже, вы должны сказать, какие правила вы хотите проверить, почему бы просто не выбрать это?

В качестве альтернативы, если у вас есть контроль над источником , вы можете применить исключение .

В этом случае это будет выглядеть как

package Rules is
   type Selector is limited private;
private
   type Selector is null record with Volatile;
   pragma Annotate (Gnatcheck, Exempt_On,
                    "Volatile_Objects_Without_Address_Clauses",
                    "only a demo!");
   S : Selector;
   pragma Annotate (Gnatcheck, Exempt_Off,
                    "Volatile_Objects_Without_Address_Clauses");
   T : Selector;
end Rules;

и теперь оно проверяется как

$ gnatcheck --show-rule rules.ads -rules +RVolatile_Objects_Without_Address_Clauses
rules.ads:11:04: volatile object with no address clause [Volatile_Objects_Without_Address_Clauses]

(строка 11 - это неисполненное объявление T; нет претензий к объявлению S в строке 8).


Примечание:

Извинения за более ранние версии этого ответа , который имел фундаментальное недоразумение. gnatcheck поддерживает правило просто отлично, если вы правильно его прочитали: речь идет о энергозависимых объектах без предложения адреса, не энергозависимых types .

...