jcxz 241 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 10 минут назад, Arlleex сказал: __unaligned в моем случае, т.к. __packed это для структур. Все равно warning есть... Ok. Тогда взять не ARM-компилятор. А для 8-битника или x86. Будет варнинг? Мой пример изначально не ограничивал область только ARM-ами. 10 минут назад, Arlleex сказал: А Вы не согласны, что неупорядоченный доступ к volatile-объектам - это норма? Тогда мне нечего на это ответить. Тогда на 32-битных ARM переменные u64 volatile надо вообще запретить. Имхо - предупреждения IAR о порядке доступа к volatile - это уже лишнее. Если написано a+b (при том что оба - volatile), то нужно считать что в данном конкретном месте порядок чтения не имеет значения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 6 минут назад, jcxz сказал: Тогда на 32-битных ARM переменные u64 volatile надо вообще запретить. Об этом явно и пишет сам ARM в TRM на архитектуру. И, в общем-то, это правильно. Ну, я про ARMv7-M. Цитата Тогда взять не ARM-компилятор. А для 8-битника или x86. Будет варнинг? На других щас проверить не могу. Наверное, не будет, т.к. все это весьма специфичные варнинги. Цитата Если написано a+b (при том что оба - volatile), то нужно считать что в данном конкретном месте порядок чтения не имеет значения. А я вот по запаре и мог бы где-то пропустить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 1 минуту назад, Arlleex сказал: Об этом явно и пишет сам ARM в TRM на архитектуру. И, в общем-то, это правильно. А как вам например такое: union { int i0; int volatile i1; }; можно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба On 7/18/2023 at 11:48 AM, Arlleex said: А Вы не согласны, что неупорядоченный доступ к volatile-объектам - это не норма? Тогда мне нечего на это ответить. не считаю нужным оправдываться за ваши фантазии Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 9 часов назад, jcxz сказал: А как вам например такое: union { int i0; int volatile i1; }; можно? Можно, почему нет? Это будет всего лишь указание компилятору, как действовать при конкретном обращении. Криминала нет. Ответственность за варианты на программисте. P.S. Уточнил чуть далее - это UB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба Разве? Вы про ассоциативность или какой ещё порядок может быть у одной операции? 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 - "особенный" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 10 минут назад, one_eight_seven сказал: Разве? Вы про ассоциативность или какой ещё порядок может быть у одной операции? Очевидно - порядок чтения этих переменных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба Just now, jcxz said: Очевидно - порядок чтения этих переменных. Ну я именно так и понял. Определена. Именно это в стандарте называется ассоциативностью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 4 минуты назад, one_eight_seven сказал: Ну я именно так и понял. Определена. Именно это в стандарте называется ассоциативностью. То, про что вы говорите - это порядок выполнения арифметических операций. Он не определяет порядок чтения операндов для этих операций (порядок загрузки их в регистры CPU). Это другое. Про порядок арифметических операций IAR всё знает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 7 минут назад, one_eight_seven сказал: Ну я именно так и понял. Определена. Именно это в стандарте называется ассоциативностью. Совершенно не так. Ассоциативность - это условное направление синтаксического анализа. К приоритету и порядку вычисления выражений отношения не имеет. То, о чем я говорил, это именно порядок оценки (вычисления) выражений - в стандартах глава Order of evaluation. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 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. семантика сложения - тоже ВНЕЗАПНО в стандарте. Но вы можете верить, что не определено. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 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; }; можно? Кстати, я ошибался - это тоже 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 18 июля, 2023 Опубликовано 18 июля, 2023 (изменено) · Жалоба 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 Изменено 18 июля, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 июля, 2023 Опубликовано 18 июля, 2023 · Жалоба 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). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 18 июля, 2023 Опубликовано 18 июля, 2023 (изменено) · Жалоба 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 Изменено 18 июля, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться