Перейти к содержанию
    

Приведение типов в Си

10 минут назад, Arlleex сказал:

__unaligned в моем случае, т.к. __packed это для структур. Все равно warning есть...

Ok. Тогда взять не ARM-компилятор. А для 8-битника или x86. Будет варнинг?

Мой пример изначально не ограничивал область только ARM-ами.

10 минут назад, Arlleex сказал:

А Вы не согласны, что неупорядоченный доступ к volatile-объектам - это норма? Тогда мне нечего на это ответить.

Тогда на 32-битных ARM переменные u64 volatile надо вообще запретить. :wink:

Имхо - предупреждения IAR о порядке доступа к volatile - это уже лишнее. Если написано a+b (при том что оба - volatile), то нужно считать что в данном конкретном месте порядок чтения не имеет значения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 минут назад, jcxz сказал:

Тогда на 32-битных ARM переменные u64 volatile надо вообще запретить. :wink:

Об этом явно и пишет сам ARM в TRM на архитектуру. И, в общем-то, это правильно. Ну, я про ARMv7-M.
 

Цитата

Тогда взять не ARM-компилятор. А для 8-битника или x86. Будет варнинг?

На других щас проверить не могу. Наверное, не будет, т.к. все это весьма специфичные варнинги.
 

Цитата

Если написано a+b (при том что оба - volatile), то нужно считать что в данном конкретном месте порядок чтения не имеет значения.

А я вот по запаре и мог бы где-то пропустить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, Arlleex сказал:

Об этом явно и пишет сам ARM в TRM на архитектуру. И, в общем-то, это правильно.

А как вам например такое:

union {
  int i0;
  int volatile i1;
};

можно?  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2023 at 11:48 AM, Arlleex said:

А Вы не согласны, что неупорядоченный доступ к volatile-объектам - это не норма? Тогда мне нечего на это ответить.

не считаю нужным оправдываться за ваши фантазии

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, jcxz сказал:

А как вам например такое:

union {
  int i0;
  int volatile i1;
};

можно?  :wink:

Можно, почему нет? Это будет всего лишь указание компилятору, как действовать при конкретном обращении. Криминала нет. Ответственность за варианты на программисте.

P.S. Уточнил чуть далее - это UB.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве? Вы про ассоциативность или какой ещё порядок может быть у одной операции?
 

Quote

6.5.6 Additive operators
Syntax
1 additive-expression:
multiplicative-expression
additive-expression + multiplicative-expression
additive-expression - multiplicative-expression

ISO/IEC 9899, если что. Так что Right-to-left. Не такой уж и глупый этот GCC. Это IAR - "особенный"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, one_eight_seven сказал:

Разве? Вы про ассоциативность или какой ещё порядок может быть у одной операции?

Очевидно - порядок чтения этих переменных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, jcxz said:

Очевидно - порядок чтения этих переменных.

Ну я именно так и понял. Определена. Именно это в стандарте называется ассоциативностью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, one_eight_seven сказал:

Ну я именно так и понял. Определена. Именно это в стандарте называется ассоциативностью.

То, про что вы говорите - это порядок выполнения арифметических операций. Он не определяет порядок чтения операндов для этих операций (порядок загрузки их в регистры CPU). Это другое.

Про порядок арифметических операций IAR всё знает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, one_eight_seven сказал:

Ну я именно так и понял. Определена. Именно это в стандарте называется ассоциативностью.

Совершенно не так. Ассоциативность - это условное направление синтаксического анализа. К приоритету и порядку вычисления выражений отношения не имеет.

То, о чем я говорил, это именно порядок оценки (вычисления) выражений - в стандартах глава Order of evaluation.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

In the abstract machine, all expressions are evaluated as specified by the semantic

Quote

— Accesses to volatile objects are evaluated strictly according to the rules of the abstract
machine.

семантика сложения - тоже ВНЕЗАПНО в стандарте. Но вы можете верить, что не определено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, one_eight_seven сказал:

семантика сложения - тоже ВНЕЗАПНО в стандарте. Но вы можете верить, что не определено.

Конкретный пунктик можно? ISO/IEC 9899:1999, читаем-зачитываемся:

6.5 Expressions

Цитата

2 Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression.72) Furthermore, the prior value shall be read only to determine the value to be stored.73)

Цитата

3 The grouping of operators and operands is indicated by the syntax.74) Except as specified later (for the function-call (), &&, ||, ?:, and comma operators), the order of evaluation of subexpressions and the order in which side effects take place are both unspecified.

У обычного бинарного '+' нет точек следования, нет семантики оценки выражений-операндов.

Но Вы почему-то зацепились за правила абстрактной машины, не прочитав, что там написано:

5.1.2.3 Program execution

Цитата

2 Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, 11) which are changes in the state of the execution environment. Evaluation of an expression may produce side effects. At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place. (A summary of the sequence points is given in annex C.)

Цитата

3 In the abstract machine, all expressions are evaluated as specified by the semantics. An actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no needed side effects are produced (including any caused by calling a function or accessing a volatile object).

Цитата

5 The least requirements on a conforming implementation are:
— At sequence points, volatile objects are stable in the sense that previous accesses are complete and subsequent accesses have not yet occurred.
...


Annex C (informative) Sequence points

Цитата

1 The following are the sequence points described in 5.1.2.3
— The call to a function, after the arguments have been evaluated (6.5.2.2).
— The end of the first operand of the following operators: logical AND && (6.5.13); logical OR || (6.5.14); conditional ? (6.5.15); comma , (6.5.17).
— The end of a full declarator: declarators (6.7.5);
— The end of a full expression: an initializer (6.7.8); the expression in an expression statement (6.8.3); the controlling expression of a selection statement (if or switch) (6.8.4); the controlling expression of a while or do statement (6.8.5); each of the expressions of a for statement (6.8.5.3); the expression in a return statement (6.8.6.4).
— Immediately before a library function returns (7.1.4).
— After the actions associated with each formatted input/output function conversion specifier (7.19.6, 7.24.2).
— Immediately before and immediately after each call to a comparison function, and also between any call to a comparison function and any movement of the objects passed as arguments to that call (7.20.5).

 

10 часов назад, jcxz сказал:

А как вам например такое:

union {
  int i0;
  int volatile i1;
};

можно?  :wink:

Кстати, я ошибался - это тоже UB. ISO/IEC 9899:1999:

6.7.3 Type qualifiers

Цитата

5 If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. If an attempt is made to refer to an object defined with a volatile-qualified type through use of an lvalue with non-volatile-qualified type, the behavior is undefined.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2023 at 8:13 PM, Arlleex said:

ISO/IEC 9899:1999, читаем-зачитываемся:

6.5 Expressions

Quote

2 Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression.72) Furthermore, the prior value shall be read only to determine the value to be stored.73)

осталось процитировать где написано про UB

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, sasamy сказал:

осталось процитировать где написано про UB

ISO/IEC 9899:1999:

6.7.3 Type qualifiers

Цитата

6 An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine, as described in 5.1.2.3. Furthermore, at every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine, except as modified by the unknown factors mentioned previously. 116) What constitutes an access to an object that has volatile-qualified type is implementation-defined.


А теперь берем следующий пример

u32 volatile a;

u32 c = a + a;


Доступ к 'a' (возможно) имеет сайд-эффект изменения этого самого 'a'. Второе чтение - это вторая модификация объекта, и, собственно

J.2 Undefined behavior

Цитата

— Between two sequence points, an object is modified more than once, or is modified and the prior value is read other than to determine the value to be stored (6.5).

Более того, в стандарте C11 этот пункт уже немного перетрактовали, ISO/IEC 9899:201x:

J.2 Undefined behavior

Цитата

— A side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object (6.5).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/18/2023 at 10:36 PM, Arlleex said:

Доступ к 'a' (возможно) имеет сайд-эффект

в С11 изменили 6.5 Expressions 

Quote

2 If a side effect on a scalar object is unsequenced relative to either a different side effect
on the same scalar object or a value computation using the value of the same scalar
object, the behavior is undefined. If there are multiple allowable orderings of the
subexpressions of an expression, the behavior is undefined if such an unsequenced side
effect occurs in any of the orderings.

5.1.2.3 Program execution

Quote

2 Accessing a volatile object, modifying an object, modifying a file, or calling a function
that does any of those operations are all side effects

в С99 нет ничего про UB в 6.5 Expressions

 

Quote

Annex J (informative) Portability issues

 

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...