Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Задачка для новичков#1: найти причину UB в коде и исправить его согласно условию

21.08.2016, 12:05. Показов 3639. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет молодые коллеги,

нашёл у себя под диваном интересную задачку - она лёгкая для гуру ( поэтому вы увидите ниже ответы на задачку и фразу, и что тут сложного ), а другие оценят забавность задачки)

Условия задачи:
1. Не меняя 2 последних строки функции
2. Данные 2 последних строки должны остаться последними в функции
3. Количество return 1шт.

C++
1
2
3
4
5
6
7
8
9
// what wrong with this fragment of code? how without rewrite last 2 lines - fix UB?
int foo()
{
   int x = 0;
   cin >> x;
 
   if(x > 10)
      return 10;
}

Если знаете ответ, засовывайте под spoiler.


 Комментарий модератора 
В названии темы должно быть указано что в ней, а не для кого она.
2
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.08.2016, 12:05
Ответы с готовыми решениями:

Найти сумму целых отрицательных чисел удовлетворяющих условию (найти и исправить ошибку в коде)
#include<iostream> #include<math.h> using namespace std; int main() { int y = 0; for(int i = -21; i < -99; i+=3) ...

Создать массив. Напечатать его в общепринятом виде. Упорядочить его согласно условию
Нужно помочь с тремя заданиями.(ниже) желательно сделать к ним и блок схемы. 2. Создать массив. Напечатать его в общепринятом виде....

Задачка для новичков
Возникла идейка задать небольшую задачку интересную (для новичков по крайней мере, т.к. она довольно простая): выведет ли следующий код...

62
21.08.2016, 15:09
Студворк — интернет-сервис помощи студентам

Не по теме:

Ferrari F1, хитрите, в данном случае скобочка не является строкой :)

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.08.2016, 15:10  [ТС]
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
2. Данные 2 последних строки должны остаться последними в функции - выполнено
У вас предпоследняя пустая строка, а в примере там if( x > 10) . Куда вы смотрите?

Даже вынесу вам для сравнения)
C++
1
{
C++
1
if( x > 10)
Найдите отличия)))
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
21.08.2016, 15:12
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
У вас предпоследняя пустая строка
нет, последняя строка состосит из символа }, а предпоследняя из return 10;
так что все ок
В коде из первого поста я сохранил строки 8 и 9

Добавлено через 1 минуту
obivan, тс-ом это не было оговорено в условии, так что считаю свой ответ верным
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
21.08.2016, 15:17
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
да это решение ждал препод)))
Кликните здесь для просмотра всего текста
К сожалению не подходит к условию. Условие - пофиксить UB. Если UB - это значит, что программа компилится, это значит, что где-то уже есть main() т.е. решая задачу таким образом мы получаем две main() со всеми вытекающими.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
21.08.2016, 15:18
Формально Ferrari F1 прав - } по стандарту входит в function-body
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
21.08.2016, 15:21
ct0r, в сторону стандарта я и близко не смотрел, все гениальное просто: написано про две последние строчки, а то, что называть строками ТС не объяснял. Следовательно, смысл этого слова я могу интерпритировать в свою пользу, как мне удобно, в данном случае взял строчки с теми же циферками из начала темы
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.08.2016, 15:34  [ТС]
avgoor,
Кликните здесь для просмотра всего текста
если не оговорено в условиях задачи, что где-то есть main - то зачем сопротивляться? В условии "фрагмент" кода - более абстрактной формулировки нету наверно)
0
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
21.08.2016, 16:00
мне пришло в голову то самое заветное решение, но оно дурацкое.
Кликните здесь для просмотра всего текста
и я думал, что нельзя менять прототип функции..
решение с исключением самое верное.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.08.2016, 22:36
Кликните здесь для просмотра всего текста
Если вариант с заменой foo на main является приемлемым, то должен подойти и такой вариант:
C++
1
2
3
4
5
6
7
8
9
10
int foo()
{
   int x = 0;
   cin >> x;
 
   if(x <= 10) exit(0);
    
   if(x > 10)
      return 10;
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.08.2016, 10:54
Цитата Сообщение от obivan Посмотреть сообщение
вот еще идея пришла
рекомендую вам всерьёз подумать о карьере эксперта
в области систем безопасности, и защиты информации.


Кликните здесь для просмотра всего текста
Цитата Сообщение от obivan Посмотреть сообщение
#define if(a) if((a) | true)
очевидно жеж, вы - будущий хакер.
вам бы лишь бы что нибудь похакать.

и да, это - UB
2
22.08.2016, 11:01

Не по теме:

hoggy, Мне вот интересно, почему вы строчки до конца не дописываете? Как будто у Вас в голове символомер стоит, и когда он отсчитывает нужное кол-во, то вы заканчиваете слово и переносите все на новую строку. Это привычка или специально?

0
22.08.2016, 11:07

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
Мне вот интересно, почему вы строчки до конца не дописываете?
зрение ваше берегу

0
Падаван С++
 Аватар для obivan
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
22.08.2016, 12:56
hoggy, Угу, спасибо что прокоментировали мне как раз уже скинули ссылочку на стак оверфлоу я там почитал про это
Цитата Сообщение от hoggy Посмотреть сообщение
рекомендую вам всерьёз подумать о карьере эксперта
в области систем безопасности, и защиты информации
про это даже не знаю, с сарказмом вы говорили или нет, просто решил попробовать в контектсе нашей задчи реализовать такую идею
0
22.08.2016, 13:34

Не по теме:

Цитата Сообщение от obivan Посмотреть сообщение
про это даже не знаю, с сарказмом вы говорили или нет, просто решил попробовать в контектсе нашей задчи реализовать такую идею
я на полном серьезе.
задатки и предрасположенность к взлому у вас точно есть:)

0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
09.12.2016, 10:06
rikimaru2013,

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int foo()
{
    int x = 0;
 
    while (!(std::cin >> x) || x <= 10) // Пропущу только если введешь число больше 10, хе-хе
    {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
 
    if (x > 10)
        return 10;
}


Добавлено через 11 минут

Не по теме:

Но это не интересно... Я там че-то в начале темы читал, но так и не понял, что должно произойти если x <= 10

0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.12.2016, 10:43  [ТС]
Цитата Сообщение от meJevin Посмотреть сообщение
Я там че-то в начале темы читал, но так и не понял, что должно произойти если x <= 10
Компилятору сказали, вернуть int - он не находит return - и что вернуть бездушной машине, если она не знает что возвращать? 5? 104? Вот что произойдёт не понятно - UB
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
09.12.2016, 11:10
rikimaru2013, ну, у меня в коде UB нету.

В дебаге-то да, будет помойка возвращена.

А вот в релизе так:
Миниатюры
Задачка для новичков#1: найти причину UB в коде и исправить его согласно условию  
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
09.12.2016, 11:34
Тема про UB, но меня не позвали?
Обидно, знаете ли.
кушайте на здоровье
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//clang 3.7.0
 
#include <iostream>
 
 
int lol_impl()
{
    lol_impl();
    return 15;
}
 
 
 
int lol(int x)
{
    while(true) {
        if (x == 20) {
            return lol_impl();
        }
    }
    return 10;
}
 
 
 
void foo(const int &z)
{
    const_cast<int&>(z) = 50;
    std::cout << "foo z: " << z << std::endl;
}
 
 
void bar(const int &z)
{
    std::cout << "bar z: " << z << std::endl;
}
 
 
 
int main()
{
    int x = lol(50);
    std::cout << "main x:" << x << std::endl;
    const int z = 10;
    foo(z);
    std::cout << "main z: " << z << std::endl;
    bar(z);
    std::cout << "main z: " << z << std::endl;
}
http://rextester.com/HGOUA78964

только не подавитесь.
4
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
09.12.2016, 11:49
Кликните здесь для просмотра всего текста

Думаю проблема в том, что учитывая описание функции, число должно по любому вернуться
Из этого следует что нужно создать соответствующую логику что бы условие возврата сработало
Можно принять число из стандартного входного потока как это описано в задаче, поработать с ним
А когда оно нафиг больше не нужно - жестко проставить то значение которого хватит что бы сработал return
Так можно сделать т.к перед return по идее мы должны были уже закончить все операции с этим числом и можно жестко проставить любое значение которое подходит для выполнения условия
Но на практике такой изврат не имеет смысла и даже вреден
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
09.12.2016, 11:53
Croessmah, SIGKILL без оптимизации
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2016, 11:53

Задачка от Страуструпа для новичков
Вот задачка от Страуструпа для новичков char* cat(const char* str_1, const char* str_2) { int len_1 = strlen(str_1), ...

Создать список действительных чисел и преобразовать его согласно условию
Здраствуйте!) Срочно нужна помощь в реализации такой задачи: Разработать программу, которая создает список, элементами которого...

Задачка для новичков #3: определить, является ли строка палиндромом
Простенькая задачка, нужно запилить нормальный плюсовый код. Юзер посимвольно вводит строку, прога должна определять, является ли...

Изменить заданное целое число согласно условию и вывести его на консоль
Дано целое число. Если оно является положительным, то прибавить к нему 1; если отрицательным, то вычесть из него 2; если нулевым, то...

Проинициализировать массив целых чисел согласно условию и вывести его на консоль
С помощью цикла проициализировать массив целых чисел. Заполнить массив значениями 0, 10, 20, 30, 40 и так далее до 100


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru