Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где здесь пробой? / 25 сообщений из 27, страница 1 из 2
02.07.2018, 08:10
    #39668146
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Запустил чекер кода, пишет такое

авторSummary: Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.
Message: Converting pointer arithmetic result to bool. The boolean result is always true unless there is pointer arithmetic overflow, and overflow is undefined behaviour. Probably a dereference is forgotten.


на вызов этого макроса, что в нем криво?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#define	STRN_TO_NAME(the_name, str, n) \
do { \
	if ((the_name).name) \
		free((the_name).name); \
	if (str) \
	{ \
		(the_name).name = malloc(n + 1); \
		memcpy((the_name).name, str, n); \
		(the_name).name[n] = '\0'; \
	} \
	else \
		(the_name).name = NULL; \
} while (0)
...
Рейтинг: 0 / 0
02.07.2018, 08:24
    #39668148
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Макросы -- зло.
Возможно, второй аргумент макроса является выражением в месте использования макроса.
Как вариант можно отпрепроцессить файл и уже потом натравить на него чекер. Либо самому развернуть макрос в одном месте.
...
Рейтинг: 0 / 0
02.07.2018, 09:39
    #39668182
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
В данном случае чекер говорит
Summary: Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.
что не стоит делать циклы основанные на бесконечности и неопределённом поведении выхода из цикла.
...
Рейтинг: 0 / 0
02.07.2018, 10:39
    #39668202
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
maytonВ данном случае чекер говорит
Summary: Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.
что не стоит делать циклы основанные на бесконечности и неопределённом поведении выхода из цикла.

дану... где в макросецикл, основанный на бесконечности и с неопределенным критерием выхода?
...
Рейтинг: 0 / 0
02.07.2018, 10:44
    #39668206
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
ИМХО заменить макрос на функцию и посмотреть на какую строку ругается.

PS do ... while (0) можно вообще выкинуть, т.к. внутри break не используется.
...
Рейтинг: 0 / 0
02.07.2018, 11:25
    #39668220
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
256kmaytonВ данном случае чекер говорит
пропущено...

что не стоит делать циклы основанные на бесконечности и неопределённом поведении выхода из цикла.

данунах... где в макросецикл, основанный на бесконечности и с неопределенным критерием выхода?
Возможно чекер просто ругается на использование константы там где обычно стоит переменная. Сонар-куб к примеру классифицирует такое как dodgy code или tricky.

Но господин Хупин вместо того чтобы спрашивать мог сделать еще 1 или 2 эксперимена с do while или без него и методом исключения просто ответить на свой вопрос. Тем более что чекер у него под рукой а у нас с вами нет.
...
Рейтинг: 0 / 0
02.07.2018, 12:13
    #39668242
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
namespace myNS
{
  template <typename T>
  __INLINE
  T* __fastcall malloc(register size_t sz)
  {
    return reinterpret_cast<T*>(std::malloc(sz));
  }
}

#define STRN_TO_NAME(the_name, str, n)\
    if (NULL!=(the_name).name) std::free((the_name).name);\
    if (NULL!=str && NULL!=((the_name).name = myNS::malloc(n+1))) {\
      memcpy((the_name).name, str, n);\
      (the_name).name[n] = '\0';\
    } else (the_name).name=NULL;
...
Рейтинг: 0 / 0
02.07.2018, 12:32
    #39668254
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Dima TPS do ... while (0) можно вообще выкинуть, т.к. внутри break не используется.

Нельзя. Ибо чревато боком при развёртывании в сложных выражениях.

А break внутри и не нужен, поскольку данный цикл по определению одноразовый и используется
тупо потому, что макрос сделан для С, не позволявшего сделать блок из кавычек. Не надо его
путать с бесконечным while(true) {}.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2018, 12:37
    #39668255
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Dimitry SibiryakovDima TPS do ... while (0) можно вообще выкинуть, т.к. внутри break не используется.

Нельзя. Ибо чревато боком при развёртывании в сложных выражениях.
Учту.

Dimitry SibiryakovА break внутри и не нужен, поскольку данный цикл по определению одноразовый и используется
тупо потому, что макрос сделан для С, не позволявшего сделать блок из кавычек. Не надо его
путать с бесконечным while(true) {}.
Я к тому что такой цикл + break можно использовать взамен goto, для выхода за цикл из любого места его тела.
...
Рейтинг: 0 / 0
02.07.2018, 12:43
    #39668263
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Ролг ХупинЗапустил чекер кода, пишет такое

авторSummary: Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.
Message: Converting pointer arithmetic result to bool. The boolean result is always true unless there is pointer arithmetic overflow, and overflow is undefined behaviour. Probably a dereference is forgotten.


на вызов этого макроса, что в нем криво?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#define	STRN_TO_NAME(the_name, str, n) \
do { \
	if ((the_name).name) \
		free((the_name).name); \
	if (str) \
	{ \
		(the_name).name = malloc(n + 1); \
		memcpy((the_name).name, str, n); \
		(the_name).name[n] = '\0'; \
	} \
	else \
		(the_name).name = NULL; \
} while (0)



Без контекста вызова не понять.
...
Рейтинг: 0 / 0
02.07.2018, 12:44
    #39668264
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
NekZМакросы -- зло.


Ну и да, почему бы это не оформить в виде функции ?
...
Рейтинг: 0 / 0
02.07.2018, 12:46
    #39668265
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Dima TЯ к тому что такой цикл + break можно использовать взамен goto, для выхода за цикл из любого места его тела.
Полезный трюк, тоже его использую. Только здесь всем не тот случай.
Здесь разжёвывается подробно для чего пишут do { ... } while(0) в макросах.
...
Рейтинг: 0 / 0
02.07.2018, 12:46
    #39668266
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
maytonВ данном случае чекер говорит
Summary: Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.
что не стоит делать циклы основанные на бесконечности и неопределённом поведении выхода из цикла.

Где там бесконечный -то цикл? Наоборот, цикл с гарантированно одним проходом..
...
Рейтинг: 0 / 0
02.07.2018, 12:48
    #39668268
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Dima TИМХО заменить макрос на функцию и посмотреть на какую строку ругается.

PS do ... while (0) можно вообще выкинуть, т.к. внутри break не используется.

Этот мнимый цикл нужен только в макросе, да.
Это чтобы всё воспринималось однозначно как один блок кода.
Если то же делать через функцию, оно автоматом получится.
...
Рейтинг: 0 / 0
02.07.2018, 12:50
    #39668272
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
MasterZivNekZМакросы -- зло.


Ну и да, почему бы это не оформить в виде функции ?
Без понятия. Видимо Ролг Хупин совсем не умеет темплейты.
...
Рейтинг: 0 / 0
02.07.2018, 12:56
    #39668278
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
MasterZivDima TИМХО заменить макрос на функцию и посмотреть на какую строку ругается.
PS do ... while (0) можно вообще выкинуть, т.к. внутри break не используется.Этот мнимый цикл нужен только в макросе, да.
Это чтобы всё воспринималось однозначно как один блок кода.
Если то же делать через функцию, оно автоматом получится.С таким же успехом можно использовать просто {...} - без всяких do{...}while (false);
Код: plaintext
1.
2.
3.
4.
5.
6.
#define STRN_TO_NAME(the_name, str, n) {\
    if (NULL!=(the_name).name) std::free((the_name).name);\
    if (NULL!=str && NULL!=((the_name).name = myNS::malloc(n+1))) {\
      memcpy((the_name).name, str, n);\
      (the_name).name[n] = '\0';\
    } else (the_name).name=NULL;}
...
Рейтинг: 0 / 0
02.07.2018, 12:57
    #39668280
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
NekZВидимо Ролг Хупин совсем не умеет темплейты.

Вероятнее всего это ещё один странный кусок, порождённый буйной фантазией юных
экспериментаторов из Беркли.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2018, 13:10
    #39668290
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
rdb_devMasterZivпропущено...
Этот мнимый цикл нужен только в макросе, да.
Это чтобы всё воспринималось однозначно как один блок кода.
Если то же делать через функцию, оно автоматом получится.С таким же успехом можно использовать просто {...} - без всяких do{...}while (false);
Код: plaintext
1.
2.
3.
4.
5.
6.
#define STRN_TO_NAME(the_name, str, n) {\
    if (NULL!=(the_name).name) std::free((the_name).name);\
    if (NULL!=str && NULL!=((the_name).name = myNS::malloc(n+1))) {\
      memcpy((the_name).name, str, n);\
      (the_name).name[n] = '\0';\
    } else (the_name).name=NULL;}



Нельзя. ПОчитай выше ссылку с Quora, внимательно.
...
Рейтинг: 0 / 0
02.07.2018, 15:29
    #39668403
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Dimitry SibiryakovNekZВидимо Ролг Хупин совсем не умеет темплейты.

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


да, это тот же одбц драйвер для постгреса
Только не надо называть их юными
...
Рейтинг: 0 / 0
02.07.2018, 16:18
    #39668425
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
MasterZivРолг ХупинЗапустил чекер кода, пишет такое

пропущено...


на вызов этого макроса, что в нем криво?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#define	STRN_TO_NAME(the_name, str, n) \
do { \
	if ((the_name).name) \
		free((the_name).name); \
	if (str) \
	{ \
		(the_name).name = malloc(n + 1); \
		memcpy((the_name).name, str, n); \
		(the_name).name[n] = '\0'; \
	} \
	else \
		(the_name).name = NULL; \
} while (0)



Без контекста вызова не понять.Ну судя по сообщению - похоже, что во второй параметр передали некое выражение, например, указатель плюс целое.
...
Рейтинг: 0 / 0
02.07.2018, 16:51
    #39668444
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Скорее всего чекер разворачивает макрос перед проверкой.
Если в макрос передали STRN_TO_NAME(..., "str, ...)
то он развернется в
Код: plaintext
1.
2.
3.
...
if ("str") 
...


В данном случае "str" рассматривается как указатель char* в булевом контексте. А его значение известно при компиляции и не равно 0, поэтому в булевом контексте там всегда true.
Вот про это и говорит это сообщение:
Converting pointer arithmetic result to bool. The bool is always true.

Резолюция - отключить этот вид проверок или выкинуть чекер если он этого не позволяет.
...
Рейтинг: 0 / 0
02.07.2018, 17:06
    #39668453
256k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Anatoly MoskovskyСкорее всего чекер разворачивает макрос перед проверкой.
Если в макрос передали STRN_TO_NAME(..., "str, ...)
то он развернется в
Код: plaintext
1.
2.
3.
...
if ("str") 
...


В данном случае "str" рассматривается как указатель char* в булевом контексте. А его значение известно при компиляции и не равно 0, поэтому в булевом контексте там всегда true.
Вот про это и говорит это сообщение:
Converting pointer arithmetic result to bool. The bool is always true.

Резолюция - отключить этот вид проверок или выкинуть чекер если он этого не позволяет.

Кстати, какой чекер порекомендуете?
...
Рейтинг: 0 / 0
02.07.2018, 17:26
    #39668465
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
256kКстати, какой чекер порекомендуете?
Используем в проекте cppcheck.
А порекомендовать не могу никакой ))
...
Рейтинг: 0 / 0
02.07.2018, 17:31
    #39668470
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
Anatoly MoskovskyСкорее всего чекер разворачивает макрос перед проверкой.
Если в макрос передали STRN_TO_NAME(..., "str, ...)
то он развернется в
Код: plaintext
1.
2.
3.
...
if ("str") 
...


В данном случае "str" рассматривается как указатель char* в булевом контексте. А его значение известно при компиляции и не равно 0, поэтому в булевом контексте там всегда true.
Вот про это и говорит это сообщение:
Converting pointer arithmetic result to bool. The bool is always true.

Резолюция - отключить этот вид проверок или выкинуть чекер если он этого не позволяет.
Да блин, ещё раз повторю, что, скорее всего дело во втором параметре, который является выражением адресной арифметики.
Например,
Код: plaintext
1.
2.
char foo[] = "Hello world";
STRN_TO_NAME(..., foo + 2, ...)



Развернётся в
Код: plaintext
1.
2.
3.
...
if (foo + 2)
...


Именно это и не нравится чекеру
Как вариант, Ролг Хупин мог бы попробовать зафигачить такую проверку в макросе
Код: plaintext
1.
2.
3.
4.
#define	STRN_TO_NAME(the_name, str, n) \
... \
if ((str) != nullptr) \
...


И проверить будет ли ругаться чекер.
...
Рейтинг: 0 / 0
02.07.2018, 20:53
    #39668516
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Где здесь пробой?
BarloneMasterZivпропущено...


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

да, вызов

Код: plaintext
1.
2.
3.
4.
			len = ptr - cmd - 1;
			STRN_TO_NAME(conn->schemaIns, cmd + 1, len);
			cmd = ptr + 2;
			ptr = NULL;
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где здесь пробой? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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