2013-04-26 5 views
0

Я прочитал пару потоков об этой ошибке Valgrind, большинство из которых дают локализованные ответы. Я хотел бы точно знать, что не так, чтобы я мог самостоятельно отлаживать эти ошибки в будущем.Понимание «Недопустимое чтение размера n»

Я буду размещать только соответствующий код, если кто-то хочет больше я вывешу, что тоже ..

Так у меня есть Invalid read of size 4 на этой линии:

int t = (p->acts+p->ac)->time; 

Примечание указатель арифметика, который я думаю, может быть связано с ошибкой ??

я получаю ту же ошибку на этой линии, доступ к тому же члену:

next->time = next->acts[next->ac].time; 

Как я подхожу отладкам это .. программа работает нормально, но я хочу знать, что происходит.

Прошу прокомментировать, если вам нужна дополнительная информация.

ответ

1

Эта ошибка будет означать, что next->ac (p->ac) это значение в конце прошлого памяти, выделенной для next->acts (p->acts)

т.е. ..

next->acts = malloc(sizeof(something) * count); 
next->ac = count; 

next>acts[next->ac].time = 0; 

Это бросить ошибку, потому что count как индекс массива на самом деле один за размером массива (базовый ноль и все это)

Иными словами, next->ac >= count бросил бы это ошибка в примере, который я даю.

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

+0

Или что 'next-> act' был выпущен обратно во время выполнения и, хотя разыменование все еще« работает », это неопределенное поведение. В любом случае, это плохо. – WhozCraig

+0

Интересно, что это не вызывает ошибку seg !? – jsj

+0

Вероятно, это не вызовет SIGSEGV, потому что он ** является ** (или был) действительным указателем. Неопределенное поведение заключается в том, что вы понятия не имеете, к чему используется доступ к памяти, к которой вы обращаетесь (вы ее не владеете и понятия не имеете, если что-либо еще или вообще используется в памяти). Неопределенный характер заключается в том, каковы последствия его манипулирования могут быть ... помните, что запись за конец буферов - это обычная хакерская техника (хотя обычно они нацеливаются на переменные стека при этом) –

Смежные вопросы