Форсирование проверки возвращаемого значения
От: remark Россия http://www.1024cores.net/
Дата: 23.02.06 12:53
Оценка:
Как на стадии компиляции форсировать проверку возвращаемого значения функции? Или это не возможно?
Как ни странно на форуме ничего похожего не нашёл...

Например:

bool some_func();

if (some_func()); // компилируется

bool result = some_func(); // компилируется

some_func(); // не должно компилироваться




...возвращать прокси-объект...
...перегрузить operator bool()...

Дальше как-то мысля не идёт.

Как что бы не компилировалось приведение к bool очевидно, а как что-бы наоборот?

Исключения и проверку в ран-тайм не предлагать.



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re: Форсирование проверки возвращаемого значения
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 23.02.06 16:45
Оценка:
Здравствуйте, remark, Вы писали:

R>Как на стадии компиляции форсировать проверку возвращаемого значения функции? Или это не возможно?

R>Как ни странно на форуме ничего похожего не нашёл...

Думаю, это невозможно.

Функция some_func() должна возвращать результат, который будет неявно приводится к bool (требование для if ( condition ) statement).
Следовательно, в месте, помеченном как "не должно компилироваться", просто произойдет вычисление этого выражения — и все (к сожалению) скомпилируется.

Извини, довольно сумбурно. Надеюсь, поправят
Re: Форсирование проверки возвращаемого значения
От: _Winnie Россия C++.freerun
Дата: 23.02.06 21:27
Оценка:
Здравствуйте, remark, Вы писали:

R>Как на стадии компиляции форсировать проверку возвращаемого значения функции? Или это не возможно?

R>Как ни странно на форуме ничего похожего не нашёл...

Я так и не придумал, как это сделать. Вот аналогичная тема — http://rsdn.ru/Forum/?mid=1450317
Автор: _Winnie
Дата: 23.10.05

Все ответы там были в стиле "Аффтар, убей себя, тебе это не нужно."
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Форсирование проверки возвращаемого значения
От: MaximE Великобритания  
Дата: 23.02.06 21:37
Оценка: 1 (1) +2
On Thu, 23 Feb 2006 12:53:28 -0000, remark <38267@users.rsdn.ru> wrote:

> Как на стадии компиляции форсировать проверку возвращаемого значения функции? Или это не возможно?


Никак.

Для решения этой задачи хорошо подходят исключения, так как их нельзя случайно проигнорировать.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: Форсирование проверки возвращаемого значения
От: remark Россия http://www.1024cores.net/
Дата: 24.02.06 10:11
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Thu, 23 Feb 2006 12:53:28 -0000, remark <38267@users.rsdn.ru> wrote:


>> Как на стадии компиляции форсировать проверку возвращаемого значения функции? Или это не возможно?


ME>Никак.


ME>Для решения этой задачи хорошо подходят исключения, так как их нельзя случайно проигнорировать.


ME>--

ME>Maxim Yegorushkin


Для решения этой задачи исключения совсем не подходят. Вызов функции может возвращать false, это не ошибка, но тем не менее проверять значение обязательно.

Пример: выполнение запроса на выборку к БД:


DBCommand dbCommand("select a, b from some_table");
while (dbCommand.Fetch()) // Выборка всех записей из запроса
{
...
// Копируем запись куда-то
}



Или выборка одной записи:


DBCommand dbCommand("select a, b from some_table");
if (!dbCommand.Fetch()) // Выборка одной записи
  return false;

...
// Обработка одной записи




Т.ч. отмените ему очко


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Форсирование проверки возвращаемого значения
От: bkat  
Дата: 24.02.06 10:17
Оценка:
Здравствуйте, remark, Вы писали:


R>Для решения этой задачи исключения совсем не подходят.


Почему не подходят?
Учитывая то, что мы говорим о С++, вариантов у тебя не много.
В тех ситуациях, когда обязательно надо проверить результат,
ты можешь возвращать не обычный bool, а объект
и в итоге пользоваться механизмом исключений.

А еще тебе может помочь банальное code review.
Тоже эффективный способ, чтобы проверить выполнение определенных требований к коду.
Можешь попробовать присобачить тулы для статического анализа кода.
Re[4]: Форсирование проверки возвращаемого значения
От: remark Россия http://www.1024cores.net/
Дата: 24.02.06 10:32
Оценка:
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, remark, Вы писали:



R>>Для решения этой задачи исключения совсем не подходят.


B>Почему не подходят?

B>Учитывая то, что мы говорим о С++, вариантов у тебя не много.
B>В тех ситуациях, когда обязательно надо проверить результат,
B>ты можешь возвращать не обычный bool, а объект
B>и в итоге пользоваться механизмом исключений.

B>А еще тебе может помочь банальное code review.

B>Тоже эффективный способ, чтобы проверить выполнение определенных требований к коду.
B>Можешь попробовать присобачить тулы для статического анализа кода.


Задача именно в той постановке, в которой есть.

Уже есть дофига кода в большом количестве проектов, где используется эта функция и именно с таким описанием (как возвращающая bool).
Просмотр кода тут не подойдёт.
Изменение семантики функции нельзя делать — нельзя, что бы дофига продуктов начали пададь в местах, о которых все уже давно забыли.

Единственное, что приемлимо — если компилятор покажет места, где значение игнорировалось.



1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: Форсирование проверки возвращаемого значения
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 24.02.06 10:38
Оценка:
Здравствуйте, remark, Вы писали:

R>Единственное, что приемлимо — если компилятор покажет места, где значение игнорировалось.


Объясни, почему не подходит внешний инструмент, запускаемый сразу после компиляции?
Простой скрипт, проверяющий нужное условие, писать минут 10.

Понятно, что использовать для этой цели компилятор кошернее, ну дык ты неделю будешь думать, как это реализовать (а потом все равно напишешь скрипт ).
Re[5]: Форсирование проверки возвращаемого значения
От: bkat  
Дата: 24.02.06 10:47
Оценка:
Здравствуйте, remark, Вы писали:


R>Единственное, что приемлимо — если компилятор покажет места, где значение игнорировалось.


Ну тогда удачи в поиске решения
В итоге все равно придется устроить code review
и методично просмотреть такие места.
Re[6]: Форсирование проверки возвращаемого значения
От: bkat  
Дата: 24.02.06 10:49
Оценка:
Здравствуйте, Alxndr, Вы писали:

A>Понятно, что использовать для этой цели компилятор кошернее, ну дык ты неделю будешь думать, как это реализовать (а потом все равно напишешь скрипт ).


Если это действительно критично, я бы и скрипту не доверил.
Мало ли какие ситуации в коде, а если скрипт с ошибкой,
то можно критичное место автоматически проигнорировать.
Re: Форсирование проверки возвращаемого значения
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 24.02.06 10:50
Оценка:
Здравствуйте, remark, Вы писали:

R>Как на стадии компиляции форсировать проверку возвращаемого значения функции? Или это не возможно?

R>Как ни странно на форуме ничего похожего не нашёл...

В подобной постановке задача просто некорректна и не решаема. Иными словами, Вы пытаетесь заставить автора вызывающего кода проверить значение, возвращаемое функцией. Это можно сделать лишь на уровне языка программирования и компилятора. Сама же функция не может отвечать за то, как ее используют. Грубо говоря, функция — это "кирпич", из которого автор вызывающего кода строит свой "дом". Но в реальности Вы же не можете заставить кирпич проверять, корректно ли спроектирован дом.

На мой взгляд, более продуктивно поговорить о проблемах, из-за которых Вы хотите внести такую проверку, и попробовать найти для них другое решение.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re[7]: Форсирование проверки возвращаемого значения
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 24.02.06 10:54
Оценка:
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, Alxndr, Вы писали:


A>>Понятно, что использовать для этой цели компилятор кошернее, ну дык ты неделю будешь думать, как это реализовать (а потом все равно напишешь скрипт ).


B>Если это действительно критично, я бы и скрипту не доверил.


Если это действительно критично И объем работы большой И делать это придется не один раз — я выбираю автоматический инструмент.
Ты доверяешь компилятору?

B>Мало ли какие ситуации в коде, а если скрипт с ошибкой,

B>то можно критичное место автоматически проигнорировать.

Инструменты надо тестировать.
Re[8]: Форсирование проверки возвращаемого значения
От: bkat  
Дата: 24.02.06 10:58
Оценка:
Здравствуйте, Alxndr, Вы писали:

B>>Мало ли какие ситуации в коде, а если скрипт с ошибкой,

B>>то можно критичное место автоматически проигнорировать.

A>Инструменты надо тестировать.


Понятно что надо...
В общем это уже офтопик, который видимо
перейдет в обсуждение требований на этот самый скрипт.

По сути же я с тобой согласен.
Re[5]: Форсирование проверки возвращаемого значения
От: igna Россия  
Дата: 24.02.06 10:58
Оценка:
Здравствуйте, remark, Вы писали:

R>Единственное, что приемлимо — если компилятор покажет места, где значение игнорировалось.


Или не компилятор, а lint.

534 Ignoring return value of function 'Symbol' (compare with
Location) -- A function that returns a value is called
just for side effects as, for example, in a statement by
itself or the left-hand side of a comma operator. Try:
(void) function(); to call a function and ignore its
return value. See also the fvr, fvo and fdr flags in
Section 5.5 Flag Options.

Re[6]: Форсирование проверки возвращаемого значения
От: remark Россия http://www.1024cores.net/
Дата: 24.02.06 11:10
Оценка:
Здравствуйте, Alxndr, Вы писали:

A>Здравствуйте, remark, Вы писали:


R>>Единственное, что приемлимо — если компилятор покажет места, где значение игнорировалось.


A>Объясни, почему не подходит внешний инструмент, запускаемый сразу после компиляции?



Проекты не мои, проектов много, я не могу для этих проектов запускать скрипты и т.д.




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: Форсирование проверки возвращаемого значения
От: remark Россия http://www.1024cores.net/
Дата: 24.02.06 11:16
Оценка: +1
Здравствуйте, bkat, Вы писали:

B>Здравствуйте, Alxndr, Вы писали:


B>>>Мало ли какие ситуации в коде, а если скрипт с ошибкой,

B>>>то можно критичное место автоматически проигнорировать.

A>>Инструменты надо тестировать.


B>Понятно что надо...

B>В общем это уже офтопик, который видимо
B>перейдет в обсуждение требований на этот самый скрипт.

B>По сути же я с тобой согласен.



Поддерживаю, что инструменты для автоматической проверки кода — это полезно. Особенно, если они проверяют и другие вещи.

оффтоп: меня поразили возможности IntelliJ Idea в этой области — вплоть до проверки цикломатической (по-моему так это называется) сложности функций. И всё это встроено прямо в IDE.


Но мне это не подойдёт в моём конкретном случае.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Форсирование проверки возвращаемого значения
От: remark Россия http://www.1024cores.net/
Дата: 24.02.06 11:27
Оценка: 6 (1)
Здравствуйте, Кирилл Лебедев, Вы писали:

КЛ>Здравствуйте, remark, Вы писали:


R>>Как на стадии компиляции форсировать проверку возвращаемого значения функции? Или это не возможно?

R>>Как ни странно на форуме ничего похожего не нашёл...

КЛ>В подобной постановке задача просто некорректна и не решаема. Иными словами, Вы пытаетесь заставить автора вызывающего кода проверить значение, возвращаемое функцией. Это можно сделать лишь на уровне языка программирования и компилятора. Сама же функция не может отвечать за то, как ее используют. Грубо говоря, функция — это "кирпич", из которого автор вызывающего кода строит свой "дом". Но в реальности Вы же не можете заставить кирпич проверять, корректно ли спроектирован дом.



В 90 году было так
Но теперь я могу заставить не компилироваться, где наоборот проверяется возвращаемое значение функции.
Или заставить не компилироваться присваивание переменной long результата функции, которая возвращает int.
Или определить для чего используют результат operator[] — для того, что бы присвоить ему что-то, или что бы присвоить его чему-то.
Одним словом, язык с++ гораздо более мощный, чем Вы представляете.


КЛ>На мой взгляд, более продуктивно поговорить о проблемах, из-за которых Вы хотите внести такую проверку, и попробовать найти для них другое решение.



Проблемы всё те же — забывчивость и невнимательность человека


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[7]: Форсирование проверки возвращаемого значения
От: igna Россия  
Дата: 24.02.06 11:48
Оценка: :)
Здравствуйте, remark, Вы писали:

R>Проекты не мои, проектов много, я не могу для этих проектов запускать скрипты и т.д.


Вот оно как! Тогда предположим, будто C++ позволяет сделать так, чтобы:

bool some_func();

if (some_func()); // компилируется

bool result = some_func(); // компилируется

some_func(); // не должно компилироваться


Немаловероятно, что после первой неудачной попытки откомпилировать программу пользователь some_func сделает так:

if (some_func())
    do_the_same_as_yesterday();
else
    ; // HANDLE THIS CASE LATER!!!


Или даже так:

if (some_func());
do_the_same_as_yesterday();


Тем более, если проект использующий some_func завершен.
Re[8]: Форсирование проверки возвращаемого значения
От: remark Россия http://www.1024cores.net/
Дата: 24.02.06 12:37
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, remark, Вы писали:


R>>Проекты не мои, проектов много, я не могу для этих проектов запускать скрипты и т.д.


I>Вот оно как! Тогда предположим, будто C++ позволяет сделать так, чтобы:


I>
I>bool some_func();

I>if (some_func()); // компилируется

I>bool result = some_func(); // компилируется

I>some_func(); // не должно компилироваться
I>


I>Немаловероятно, что после первой неудачной попытки откомпилировать программу пользователь some_func сделает так:


I>
I>if (some_func())
I>    do_the_same_as_yesterday();
I>else
I>    ; // HANDLE THIS CASE LATER!!!
I>


I>Или даже так:


I>
I>if (some_func());
I>do_the_same_as_yesterday();
I>


I>Тем более, если проект использующий some_func завершен.




И к чему ты всё это?
А если кидать исключение? То что?
Добавят: catch (...){}
Только это ещё хуже, т.к. места, где это надо добавить выявяться только после падения программы.
Я же не говорил форсировать корректную обработку ошибки, я сказал — форсировать хотя бы проверку результата функции.

Если человек напишет:
I>
I>if (some_func())
I>    do_the_same_as_yesterday();
I>else
I>    ; // HANDLE THIS CASE LATER!!!
I>


То возможно он задумается, что в строчке HANDLE THIS CASE LATER!!! его программа будет падать.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[9]: Форсирование проверки возвращаемого значения
От: igna Россия  
Дата: 24.02.06 12:46
Оценка:
Здравствуйте, remark, Вы писали:

R>И к чему ты всё это?


А что ты думаешь по поводу lint
Автор: igna
Дата: 24.02.06
'а?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.