23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
1

Кто отвечает за корректность аргументов функции?

22.07.2019, 19:23. Показов 5021. Ответов 72

Author24 — интернет-сервис помощи студентам
Вопрос к знатокам стандарта или просто ведующим.

В языке c за корректность аргументов обычно отвечает вызывающая сторона.

Т.е. если ты вызываешь printf("%d", some_int) и подставляешь туда нечто не int,
то это твои проблемы потом удивляться, недоумевать или возмущаться на некорректный вывод или уход в даун.

А с++ какая практика?
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2019, 19:23
Ответы с готовыми решениями:

Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)?
Я конечно, понимаю, что на такие вопросы отвечают "почитай книжку". Я читала, честное слово:)...

Странное расположение в памяти аргументов функции с неизвестным количество аргументов
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки...

Для разминки тем, кто спрашивает и тем, кто отвечает
Преамбула. Задача возникла не вдруг и не на пустом месте. Это попытка (возможно и не очень...

Кто отвечает на форумах?
Мне стало интересно кто отвечает на форумах? Этим людям заняться нечем чтоли, чтобы искать чьи то...

72
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 19:26 2
Отвечает тоже вызывающая сторона, но автор функции должен так разработать ее интерфейс, чтобы некорректные аргументы было сложно подставить. Ну и, конечно, первыми операторами должны идти всевозможные проверки корректности аргументов с заменой неверных дефолтными значениями либо выбросом исключений.
1
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 19:33  [ТС] 3
Цитата Сообщение от jugu Посмотреть сообщение
Отвечает тоже вызывающая сторона
Цитата Сообщение от jugu Посмотреть сообщение
Ну и, конечно, первыми операторами должны идти всевозможные проверки корректности аргументов с заменой неверных дефолтными значениями либо выбросом исключений.
немного противоречат друг другу не находите
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 19:40 4
Цитата Сообщение от rams Посмотреть сообщение
немного противоречат друг другу не находите
Никаких противоречий. Отвечает за корректность вызывающая сторона. А функция должна работать надежно при любых аргументах, даже неверных. Т.е. в алгоритме функции все пути должны быть в идеале определены.
0
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 19:54  [ТС] 5
Цитата Сообщение от jugu Посмотреть сообщение
А функция должна работать надежно при любых аргументах, даже неверных.
Это отражено в стандарте или вы сами придумали. Мысль конечно не плохая.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.07.2019, 20:47 6
Цитата Сообщение от rams Посмотреть сообщение
немного противоречат друг другу не находите
Конечно. Проверять дважды не эффективно. Но решать, - программисту. Если функция влияет на скорость, то лучше проверки делать на вызывающей стороне (это всегда лучше именно там и делать), но если проверка не критична к скорости, но критична по возможным последствиям никто не обвинит монашку и свечу.
А в сях есть запись в стандарте об ответственности и проверках передаваемых аргументов?
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 20:53 7
Цитата Сообщение от rams Посмотреть сообщение
Это отражено в стандарте или вы сами придумали. Мысль конечно не плохая.
К сожалению, придумал не я, а те, кто стоял у истоков программирования на языках высокого уровня.

Добавлено через 5 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Конечно. Проверять дважды не эффективно. Но решать, - программисту.
Всё зависит от того, что это за функция, где, как и кем она будет использоваться. Нас учили в свое время, что хорошая функция должна адекватно реагировать на любые комбинации аргументов, правильные они или нет. К сожалению, на 100% это обеспечить можно далеко не всегда.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
22.07.2019, 21:00 8
Цитата Сообщение от rams Посмотреть сообщение
Т.е. если ты вызываешь printf("%d", some_int) и подставляешь туда нечто не int
У тебя вопрос стоИт в контексте эллипса (параметров с тремя точками) или чего? А то если аргумент функции объявлен как int, а туда передают, например, float, то по правилам языка построится преобразование типов. А это уже совсем из другой оперы
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2019, 21:08 9
Цитата Сообщение от rams Посмотреть сообщение
В языке c за корректность аргументов обычно отвечает вызывающая сторона.
обе стороны.
и это не зависит от языка.

есть такое понятие "инвариант".
это - способность функции сохранять работоспособность
независимо от корректности вызывающей стороны.

хороший код - инвариантен.

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

что касается сишки:
существуют кейсы, когда инвариант попросту не возможен.
например: printf, или классика жанра:
C
1
2
// функция в принципе не способна валидировать аргументы
int process(const int* array, const size_t count);
так уж устроен язык.
не всегда есть возможность проверить аргументы.
но если есть возможность обеспечить инвариант - его нужно обеспечить.
2
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
22.07.2019, 21:15 10
Цитата Сообщение от IGPIGP Посмотреть сообщение
Конечно. Проверять дважды не эффективно. Но решать, - программисту.
Добавлю, что обычно для проверки корректности использования внутреннего API используют assertions, например:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
===============
Creates a viewport with the specified width and height.
 
@param v Is a valid pointer to a Viewport structure.
@param w The viewport's width in range [0, VIEWPORT_MAX_WIDTH].
@param h The viewport's height in range [0, VIEWPORT_MAX_HEIGHT].
===============
*/
void Viewport_Create(Viewport *v, unsigned int w, unsigned int h)
{
    assert(v != NULL);
    assert(w <= VIEWPORT_MAX_WIDTH);
    assert(h <= VIEWPORT_MAX_HEIGHT);
 
    SDL_CreateWindowAndRenderer(w, h, 0, &v->window, &v->renderer);
 
    v->width = w;
    v->height = h;
}
Так что говорить о неэффективности не приходится.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.07.2019, 21:49 11
Цитата Сообщение от jugu Посмотреть сообщение
Всё зависит от того, что это за функция, где, как и кем она будет использоваться.
Существуют прямые и точные указания?
Цитата Сообщение от Eanmos Посмотреть сообщение
Так что говорить о неэффективности не приходится.
assert в релиз не компилируется и является отладочным кодом. В этом смысле он не является кодом функции в заданной теме. Хотя к теме и относится, конечно.

Цитата Сообщение от hoggy Посмотреть сообщение
принцип простой:
все входящие аргументы должны быть проверены.
если аргументы не корректны,
необходимо уведомить об этом вызывающую сторону.
Ни кто не может запретить. Поэтому - холивар по определению. Однако если вызывающая сторона передаёт сериями, например. В цикле, скажем. То там можно проверить границы диапазона и положиться на алгоритм и шаг изменения. Это просто быстрее. У вызывающей стороны может быть гораздо больше эффективных способов обеспечить "инвариант". Она порождает значения аргументов и знает о них больше чем функция. О функции знает разраб кода. Отказываться от этого - комфорт и тормоза. Энтропия от потери информации - зло. Зато не нужно знать читать маны.
Холивар, имхо.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.07.2019, 22:27 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
Поэтому - холивар по определению.
по какому такому определению?

Цитата Сообщение от IGPIGP Посмотреть сообщение
Это просто быстрее.
"быстрее" - это вопрос дизайна и принципов обработок ошибок.

вообще, судя по твоей реакции ты не в теме.
ты знаешь, что такое assert, и зачем он нужен?

Цитата Сообщение от IGPIGP Посмотреть сообщение
У вызывающей стороны может быть гораздо больше эффективных способов обеспечить "инвариант"
не может, по определению понятия "инвариант".

Цитата Сообщение от hoggy Посмотреть сообщение
"инвариант".
это - способность функции сохранять работоспособность
независимо от корректности вызывающей стороны.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Она порождает значения аргументов и знает о них больше чем функция.
есть ещё понятие "инкапсуляция".

инкапсуляция - характеристика компонента (функции/класса/библиотеки/модуля/etc),
которая характеризует степень независимости деталей внутренней реализации от внешнего мира.

хороший код - инкапсулированый.
хорошая функция ничего не знает,
и не должна знать о внешнем мире.

когда верхние и нижние этажи пишутся с оглядкой друг на друга - это говнокод.
0
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 22:32  [ТС] 13
Я за вариант корректность аргументов дело того кто использует, а не того кто пишет почти на 100%.
Просто есть максималисты ну типа см. выше.
И доводы что обычно проверок и так хватает и проверять еще и аргументы значит еще более все усложнять не работают.
Вот я подумал может есть какой то гуру или указание стандарта на который можно сослаться.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.07.2019, 22:57 14
Цитата Сообщение от hoggy Посмотреть сообщение
инкапсуляция - характеристика компонента (функции/класса/библиотеки/модуля/etc),
которая характеризует степень независимости деталей внутренней реализации от внешнего мира.
хороший код - инкапсулированый.
хорошая функция ничего не знает,
и не должна знать о внешнем мире.
Вызывающая сторона - внешний мир. И она должна знать о функции. Деталей реализации не нужно знать. Но если нет возможности понять, что для функции съедобно, а что нет, то это и есть
Цитата Сообщение от hoggy Посмотреть сообщение
говнокод
Другой вопрос, это то, что с ростом сложности, отслеживание логики для вызова становится бесполезной затеей. Для этого и OOP. Там идеома "чёрного ящика", о которой вы настойчиво говорите, реализуется по-человечески.
И всё же, решать разработчику, что ему выбрать. Делать код который будет падать/бросать исключения при отладке и тестировании, до тех пор пока не будут устранены причины. Либо делать код который будет тихо поедать всё что ему скармливают. Сроки, деньги и доступные ресурсы не последний аргумент. Проще всего идти по второму пути. Я не спорю. Но это не самый быстрый вариант.

Добавлено через 4 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
вообще, судя по твоей реакции ты не в теме.
ты знаешь, что такое assert, и зачем он нужен?
hoggy, хамите сударь.

Добавлено через 6 минут
Цитата Сообщение от rams Посмотреть сообщение
Я за вариант корректность аргументов дело того кто использует, а не того кто пишет почти на 100%.
Согласен. Но о процентах я бы не говорил. Если скорость - любой ценой, то функция не должна тормозить. Ограничения в документации. Но чаще-таки, всё иначе. Чем сложнее код тем накладней отслеживать такие зависимости.
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
22.07.2019, 23:06 15
Цитата Сообщение от IGPIGP Посмотреть сообщение
Существуют прямые и точные указания?
Математически точных указаний, конечно же, нет. Но есть требования, которые предъявляются к программам, их структурным элементам, в т.ч. и к функциям. Одно из таких требований - универсальность, т.е. работа с любыми данными, не только корректными.

Добавлено через 3 минуты
Цитата Сообщение от rams Посмотреть сообщение
Я за вариант корректность аргументов дело того кто использует, а не того кто пишет почти на 100%.
Это ваше право. Можно, конечно, писать функции, ничего не проверяя, отдавая это на откуп тому, что вызывает. Типа "передал фигню", ну и получи! В результате могут возникать трудноуловимые ошибки времени выполнения, на устранение которых тратится масса времени.
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
22.07.2019, 23:08 16
Цитата Сообщение от jugu Посмотреть сообщение
Одно из таких требований - универсальность, т.е. работа с любыми данными, не только корректными.
Где это требование изложено?
jugu, я не спорю о том, что как рекомендация, это имеет право на жизнь. Я говорил о том, что не существует способа написать такое требование задав точные границы. То есть, оно не может быть частью разумного стандарта.
0
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
22.07.2019, 23:10 17
Цитата Сообщение от rams Посмотреть сообщение
или указание стандарта на который можно сослаться
На каждую функцию, или набор функций, необходимо смотреть требования.
В угоду производительности, проверку аргументов многие функции стандартной библиотеки не производят.
1
23 / 23 / 5
Регистрация: 04.04.2012
Сообщений: 107
22.07.2019, 23:12  [ТС] 18
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но о процентах я бы не говорил
int getRand(int min, int max){
if(min > max) ...?//Ну и на фига
}
1
698 / 140 / 57
Регистрация: 20.08.2017
Сообщений: 255
22.07.2019, 23:17 19
Цитата Сообщение от rams Посмотреть сообщение
C
1
2
3
int getRand(int min, int max){
if(min > max) ...?//Ну и на фига
}
Опять же, такая проверка имеет смысл в форме

C
1
2
3
4
5
int getRand(int min, int max)
{
    assert(min < max);
    ...
}
Чтобы исключить ошибки при использовании API разработчиками. Такой способ просто не даст использовать функцию неправильно. Хотя можно заранее обговорить действия, выполняемые при передаче в функцию неверных аргументов (специальное возвращаемое значение, errno и т. д.).
0
rikimaru2013
22.07.2019, 23:18     Кто отвечает за корректность аргументов функции?
  #20

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
hoggy, хамите сударь.
А где тут хамство?

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2019, 23:18

Чат не отвечает, пока кто-либо не подключится
Всех приветствую. Столкнулся со следующей проблемой при написании простого чата по TCP/IP: после...

Можно ли наращивать количество аргументов функции? Можно ли вернуть количество аргументов функции?
К примеру есть примитивная запись int Funk(bool Er,int q1,int q2,int q3) {return 0;} В...

Корректность функции
Мне нужно чтобы не в процедуре проверялся ввод данных а в функции, как это сделать ? procedure...

Вычислить значение функции и вывести на печать значения функции и аргументов
Уважаемые программисты, Я новенький на вашем форуме, так что извините, если что не так. Помогите...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru