LINUX.ORG.RU

Некорректно работает программа. Баг gcc?


0

1

Я лично сам подозреваю что это ошибка с выравниванием данных или типа того.

Компилирую самым обычным способом. Пробовал с флагом -g - тоже самое.

Вот код функции:

NxDataContainer *nx_get_data_from_table_by_field(NxTable *table, int id, int field)
{
	NxModelIndex index;
	NxListIterator *model_iterator;
	NxListNode *model_node;
	NxDataModel *model;
	void *data;
	int i = 0;
	
	model_iterator = nx_list_get_iterator(table->model, NX_START_HEAD);
	
	index.id = id;
	index.field = field;
	
	while((model_node = nx_list_next(model_iterator)) != NULL)
	{
		if(i == field)
		{
			model = model_node->value;
			if((data = nx_dict_fetch_value(table->data, &index)) == NULL) {
				nx_list_release_iterator(model_iterator);
				return NULL;
			}
			
			if(model->type == NX_TYPE_STRING || model->type == NX_TYPE_BINARY) {
				model->size = model->max;
			}
			
			return nx_create_data_container(model->type, model->size, data);
		}
		i++;
	}
	
	nx_list_release_iterator(model_iterator);
		
	return NULL;
}

Причём если сделать так:

NxDataContainer *nx_get_data_from_table_by_field(NxTable *table, int id, int field)
{
	NxModelIndex index;
	NxListIterator *model_iterator;
	NxListNode *model_node;
	NxDataModel *model;
	void *data;
	int i = 0;
	
	model_iterator = nx_list_get_iterator(table->model, NX_START_HEAD);
	
	index.id = id;
	index.field = field;
	
	while((model_node = nx_list_next(model_iterator)) != NULL)
	{
		if(i == field)
		{
			model = model_node->value;
			if((data = nx_dict_fetch_value(table->data, &index)) == NULL) {
				warning("I AM SAY WORK!!!");
				nx_list_release_iterator(model_iterator);
				return NULL;
			}
			
			if(model->type == NX_TYPE_STRING || model->type == NX_TYPE_BINARY) {
				model->size = model->max;
			}
			
			return nx_create_data_container(model->type, model->size, data);
		}
		i++;
	}
	
	nx_list_release_iterator(model_iterator);
		
	return NULL;
}

тогда работает.



Последнее исправление: ur (всего исправлений: 1)

Баг gcc?

Т.е. если добавить: warning(«I AM SAY WORK!!!»); то все работает?

в 99.9% проблема в архитектуре/реализации программы. Multithread программа? тогда без семафоров/мьютексов никак

velikS
()

Дорогой ur! В связи с магнитной бурей и массовыми фальсификациями выборов в Зимбабве, библиотека libastral у большинства пользователей ЛОРа работает со сбоями. Не могли бы Вы указать, что именно в Вашей программе работает корректно/некорректно, и в чем эта некорректность заключается? Или ждите, пока наш штатный телепат просохнет после праздников.

AIv ★★★★★
()
Ответ на: комментарий от ur

Тогда valgrind Вам в зубы. Такая симптоматика характерна при проблемах с памятью, где то Вы промахиваетесь.

AIv ★★★★★
()

Вот ассемлерный листинг рабочего варианта

if(field_iterator == field)
		{
			model = model_node->value;
			if((data = nx_dict_fetch_value(table->data, &index)) == NULL) {
0x0000000000404507  <nx_get_data_from_table_by_field+94>:  mov    -0x48(%rbp),%rax
0x000000000040450b  <nx_get_data_from_table_by_field+98>:  mov    0x20(%rax),%rax
0x000000000040450f  <nx_get_data_from_table_by_field+102>:  lea    -0x40(%rbp),%rdx
0x0000000000404513  <nx_get_data_from_table_by_field+106>:  mov    %rdx,%rsi
0x0000000000404516  <nx_get_data_from_table_by_field+109>:  mov    %rax,%rdi
0x0000000000404519  <nx_get_data_from_table_by_field+112>:  callq  0x4034c1 <nx_dict_fetch_value>
0x000000000040451e  <nx_get_data_from_table_by_field+117>:  mov    %rax,-0x10(%rbp)
0x0000000000404522  <nx_get_data_from_table_by_field+121>:  cmpq   $0x0,-0x10(%rbp)
0x0000000000404527  <nx_get_data_from_table_by_field+126>:  jne    0x40454b <nx_get_data_from_table_by_field+162>
				warning("I AM SAY WORK");
0x0000000000404529  <nx_get_data_from_table_by_field+128>:  mov    $0x4080da,%edi
0x000000000040452e  <nx_get_data_from_table_by_field+133>:  mov    $0x0,%eax
0x0000000000404533  <nx_get_data_from_table_by_field+138>:  callq  0x404bff <warning>
				nx_list_release_iterator(model_iterator);
0x0000000000404538  <nx_get_data_from_table_by_field+143>:  mov    -0x28(%rbp),%rax
0x000000000040453c  <nx_get_data_from_table_by_field+147>:  mov    %rax,%rdi
0x000000000040453f  <nx_get_data_from_table_by_field+150>:  callq  0x40254e <nx_list_release_iterator>
				return NULL;
0x0000000000404544  <nx_get_data_from_table_by_field+155>:  mov    $0x0,%eax
0x0000000000404549  <nx_get_data_from_table_by_field+160>:  jmp    0x4045c5 <nx_get_data_from_table_by_field+284>
			}

Вот нерабочего:

if(field_iterator == field)
0x00000000004044ef  <nx_get_data_from_table_by_field+70>:  mov    -0x4(%rbp),%eax
0x00000000004044f2  <nx_get_data_from_table_by_field+73>:  cmp    -0x50(%rbp),%eax
0x00000000004044f5  <nx_get_data_from_table_by_field+76>:  jne    0x404586 <nx_get_data_from_table_by_field+221>
		{
			model = model_node->value;
0x00000000004044fb  <nx_get_data_from_table_by_field+82>:  mov    -0x20(%rbp),%rax
0x00000000004044ff  <nx_get_data_from_table_by_field+86>:  mov    0x10(%rax),%rax
0x0000000000404503  <nx_get_data_from_table_by_field+90>:  mov    %rax,-0x18(%rbp)
			if((data = nx_dict_fetch_value(table->data, &index)) == NULL) {
0x0000000000404507  <nx_get_data_from_table_by_field+94>:  mov    -0x48(%rbp),%rax
0x000000000040450b  <nx_get_data_from_table_by_field+98>:  mov    0x20(%rax),%rax
0x000000000040450f  <nx_get_data_from_table_by_field+102>:  lea    -0x40(%rbp),%rdx
0x0000000000404513  <nx_get_data_from_table_by_field+106>:  mov    %rdx,%rsi
0x0000000000404516  <nx_get_data_from_table_by_field+109>:  mov    %rax,%rdi
0x0000000000404519  <nx_get_data_from_table_by_field+112>:  callq  0x4034c1 <nx_dict_fetch_value>
0x000000000040451e  <nx_get_data_from_table_by_field+117>:  mov    %rax,-0x10(%rbp)
0x0000000000404522  <nx_get_data_from_table_by_field+121>:  cmpq   $0x0,-0x10(%rbp)
0x0000000000404527  <nx_get_data_from_table_by_field+126>:  jne    0x40453c <nx_get_data_from_table_by_field+147>
				nx_list_release_iterator(model_iterator);
0x0000000000404529  <nx_get_data_from_table_by_field+128>:  mov    -0x28(%rbp),%rax
0x000000000040452d  <nx_get_data_from_table_by_field+132>:  mov    %rax,%rdi
0x0000000000404530  <nx_get_data_from_table_by_field+135>:  callq  0x40254e <nx_list_release_iterator>
				return NULL;
0x0000000000404535  <nx_get_data_from_table_by_field+140>:  mov    $0x0,%eax
0x000000000040453a  <nx_get_data_from_table_by_field+145>:  jmp    0x4045b6 <nx_get_data_from_table_by_field+269>
			}
ur
() автор топика
Ответ на: комментарий от ur

Кто-то где-то срет в память. valgrind тебе поможет

Reset ★★★★★
()
Ответ на: комментарий от ur

А, ище использование неинициализированных значений... ну тоже valgrind.

AIv ★★★★★
()
Ответ на: комментарий от ur

Никаких потоков нет. :)
Вместо warning(«I AM SAT WORK!!!»); можно подставить что угодно.

Ну тогда timing проблема отпадает. Возможно перезапись памяти. gcc виноват в последнюю очередь

velikS
()

При [code] return nx_create_data_container(model->type, model->size, data); [/code] не будет вызван [code] nx_list_release_iterator(model_iterator); [/code]

gag ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.