powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / тестовый вопрос, где в коде баг !?? (С)
15 сообщений из 15, страница 1 из 1
тестовый вопрос, где в коде баг !?? (С)
    #38003008
Void666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c
1.
2.
3.
4.
char* AppendString( char* dst, char* src ) {
	int len = strlen( src );
	strcpy( dst + len, src );
	return dst;
}


предпологаем что dst имеет достаточно места для копирования.
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38003021
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
int len = strlen( dst );
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004646
Void666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

не понял, и в чем там ошибка ?
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004648
Void666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Void666,

а блин все, понял )
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004656
Void666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Void666,

Тест на невнимательность )
А тут где ошибка:

Код: c
1.
2.
3.
4.
5.
6.
void initArray( int* array, int len )
{
    int i = 0;
    while( i     {
         array[i] = i++;
    }
}
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004671
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Void666Void666,

Тест на невнимательность )
А тут где ошибка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void initArray( int* array, int len ){
    int i = 0;

    while( i < len ) 
    {
         array[i] = i++;
    }

}

Ну... а что эта функция делает, по-Вашему? То есть, чему будет равен array[0] после её выполнения?
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004898
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Void666,

это - UB, так как на переменную i ссылаются в разных частях выражения в котором она модифицируется в результате побочного эффекта оператора ++.
Код: plaintext
1.
array[i] = i++;


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

Чтобы было UB, надо более одного оператора с побочным эффектом перед одной точкой следования.
Тут вроде бы нет UB. Тут есть просто стрёмный код.

Почему бы не написать так -- не понятно.
Код: plaintext
1.
2.
3.
4.
5.
void initArray( int* array, int len )
{
    for( int i = 0; i < len; ++i ) 
         array[i] = i;
}
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004906
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbstractionНу... а что эта функция делает, по-Вашему? То есть, чему будет равен array[0] после её выполнения?
Может быть и 0, а может быть и случайное число.
Зависит от того насколько разработчики конкретного компилятора любят своих пользователей :)
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004912
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли кратко, то стандарт не определяет будет ли i инкрементирована
после вычисления правой части присвоения, или инкремент произойдет уже после
присвоения.
Странный какой-то стандарт... В старом добром Кернигано-Ричиевском Си результат выражения
i++*i++ предсказуем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38004942
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Я говорил про стандарт С99 и С++03 (в более поздних не смотрел, но на 99.99% уверен что ничего не поменялось).
Т.е. как в С так и С++ такие выражения недопустимы в кроссплатформенных программах.
А что там было у K&R мне честно говоря не интересно.

Вот вам цитаты из соотв. стандартов:
C99 6.5 Expressions
...
3 The grouping of operators and operands is indicated by the syntax.71) 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.

...
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).



C++03 5 Expressions
...
4 Except where noted, the order of evaluation of operands of individual operators and subexpressions of indi-
vidual expressions, and the order in which side effects take place, is unspecified.53) Between the previous
and next sequence point a scalar object shall have its stored value modified at most once by the evaluation
of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored.
The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full
expression; otherwise the behavior is undefined.
Код: plaintext
1.
2.
3.
4.
5.
[Example:
i = v[i++]; // the behavior is unspecified
i = 7, i++, i++; // i becomes 9
i = ++i + 1; // the behavior is unspecified
i = i + 1; // the value of i is incremented




Не смотря на разницу формулировок, на самом деле правила для С и С++ - эквивалентны:
Если в выражении нет логических, условных операторов и следования (,) то порядок выполнения побочных эффектов неопределен.
У выражения array[i] = i++; есть два побочных эффекта: 1) модификация элемента массива array, 2) модификация i.
Какой из них произойдет раньше - неизвестно.
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38005035
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

То есть, оператор следования в C++ тоже точка синхронизации? Не знал.
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38005121
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbstractionAnatoly Moskovsky,

То есть, оператор следования в C++ тоже точка синхронизации? Не знал.
Ну, учитывая что наиболее корректный перевод словосочетания "sequence points" - "точки следования", то не удивительно что оператор следования задает такие точки :)
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38005136
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ старом добром Кернигано-Ричиевском Си результат выражения
i++*i++ предсказуем.

Кстати, я вам не поверил и пошел поискал доказательство данного утверждения.
И вместо него обнаружил что КиР сами утверждали обратное.
См. http://c-faq.com/expr/evalorder2.html - объяснения и ссылки на 1 и 2 издания КиР

Так что не знаю про какой такой С вы говорили, но боюсь что вам для начала надо предоставить какие-то доказательства своего утверждения.
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38005138
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКстати, я вам не поверил
И правильно сделал, это я конкретно лажанулся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
тестовый вопрос, где в коде баг !?? (С)
    #38005625
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Void666, не возьмут тебя девелопером.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / тестовый вопрос, где в коде баг !?? (С)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]