powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где здесь пробой?
25 сообщений из 27, страница 1 из 2
Где здесь пробой?
    #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
Где здесь пробой?
    #39668148
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Макросы -- зло.
Возможно, второй аргумент макроса является выражением в месте использования макроса.
Как вариант можно отпрепроцессить файл и уже потом натравить на него чекер. Либо самому развернуть макрос в одном месте.
...
Рейтинг: 0 / 0
Где здесь пробой?
    #39668182
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В данном случае чекер говорит
Summary: Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.
что не стоит делать циклы основанные на бесконечности и неопределённом поведении выхода из цикла.
...
Рейтинг: 0 / 0
Где здесь пробой?
    #39668202
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ данном случае чекер говорит
Summary: Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.
что не стоит делать циклы основанные на бесконечности и неопределённом поведении выхода из цикла.

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

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

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

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

Но господин Хупин вместо того чтобы спрашивать мог сделать еще 1 или 2 эксперимена с do while или без него и методом исключения просто ответить на свой вопрос. Тем более что чекер у него под рукой а у нас с вами нет.
...
Рейтинг: 0 / 0
Где здесь пробой?
    #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
Где здесь пробой?
    #39668254
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS do ... while (0) можно вообще выкинуть, т.к. внутри break не используется.

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

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

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

Dimitry SibiryakovА break внутри и не нужен, поскольку данный цикл по определению одноразовый и используется
тупо потому, что макрос сделан для С, не позволявшего сделать блок из кавычек. Не надо его
путать с бесконечным while(true) {}.
Я к тому что такой цикл + break можно использовать взамен goto, для выхода за цикл из любого места его тела.
...
Рейтинг: 0 / 0
Где здесь пробой?
    #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
Где здесь пробой?
    #39668264
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZМакросы -- зло.


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

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

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

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


Ну и да, почему бы это не оформить в виде функции ?
Без понятия. Видимо Ролг Хупин совсем не умеет темплейты.
...
Рейтинг: 0 / 0
Где здесь пробой?
    #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
Где здесь пробой?
    #39668280
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZВидимо Ролг Хупин совсем не умеет темплейты.

Вероятнее всего это ещё один странный кусок, порождённый буйной фантазией юных
экспериментаторов из Беркли.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Где здесь пробой?
    #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
Где здесь пробой?
    #39668403
256k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovNekZВидимо Ролг Хупин совсем не умеет темплейты.

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


да, это тот же одбц драйвер для постгреса
Только не надо называть их юными
...
Рейтинг: 0 / 0
Где здесь пробой?
    #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
Где здесь пробой?
    #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
Где здесь пробой?
    #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
Где здесь пробой?
    #39668465
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
256kКстати, какой чекер порекомендуете?
Используем в проекте cppcheck.
А порекомендовать не могу никакой ))
...
Рейтинг: 0 / 0
Где здесь пробой?
    #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
Где здесь пробой?
    #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
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Где здесь пробой?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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