LINUX.ORG.RU

std::vector отрицательный size


0

2

не linux но достало.. в какие то моменты вектор возвращает отрицательный size, т.е. для 72 элементов возвращает -72

проект вдоль и поперек причесан через valgrind.

в нормальном linux и windows все нормально, но периодически в wince где gcc версии 4.4.0. ни кто про такое не слышал?

сейчас пофиксил типа (в хидере bits/stl_vector.h):

size_type                                                                                
      size() const                                                                             
      { return size_type(abs(this->_M_impl._M_finish - this->_M_impl._M_start)); }                  

★★★★★

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

Ответ на: комментарий от anonymous2

>ты забыл его спросить, пригласи сюда пусть удивится, пусть он за меня тебе в глаз даст)

как там: «согласитесь я вас раздражаю?))» )))

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

>что там, блажен кто верует, начальник чукотки? (в переводе самый главный чукча)))

супер шутка - да вам выступать нужно!!! у Петросяна на разогреве! )))

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

Чудес не бывает. Соотвественно имеет следующие подозрения: 1. Ошибка в коде. Наиболее вероятный. 2. Ошибка в gcc. 3. Ошибка в stl-реализации. 4. Ошибка в окружении (см. к примеру http://gcc.gnu.org/ml/gcc-help/2009-07/msg00342.html). 5. Ошибка процессора.

Что мешает попытаться каждый из вариантов как-то перепроверить? 1. Собственно вектор это описатель + хранение. Хранение в куче нас особо не волнует. Проблема в испорченном описателе. Гдк он лежит? Глобально, в стеке, в куче? Нет ли рядом с ним обычных массивов. Нет ли рядом объектов которые могут быть неправильно проинтерпретированы. Как идет работа с итераторами. Нет ли попытки работать с уже дохлыми. Не участвует ли данный вектор в обработке параллельных событий, достаточна ли защита? Нет ли asm-оптимизаций. Последние версии gcc жестоко карают ошибки в описании побочных эффектов и т.п. Работает как бог (gcc) на душу положит. 2. Ошибка в gcc - легко верю. Особенно в случае с C++. Однако чаще всего ошибки проявляются в случае оптимизации. Можно поставить -O0 (это не отключает все виды оптимизации!) и снести другие флаги оптимизации - при идентичном поведении ошибка gcc сомнительна. 3. С STL скорее связаны некорректные варианты использования. Хотя бывают и эффекты. Можно попробовать слегка изменить реализацию и перепроверить. 4. Пойти к соседу с другим релизом ... 5. См. errata ...

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

Что мешает попытаться каждый из вариантов как-то перепроверить?


вот, благодарю, ошибка в коде бы проявлялась постоянно на разных платформах, получил бы сразу много feedback.
оптимизацию отключал, не помогает.
все остальное сейчас вечером попытаюсь проверить, ограничен платформой + связь по wifi + gdbserver, это реализуемо.

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

> ошибка в коде бы проявлялась постоянно на разных платформах

Конечно портирование - это отличный метод для отладки программ. Но практика показывает что пара-другая переносов не показатель. Есть в конце концов процессор и ОС специфичные вещи. Любой из пунктов может поплыть. Ошибка в системных либах иногда приводит к фантастическим эффектам. msvs при работе с массивами городит тоже чудеса. Тут же WinCE.

Мне кажется ошибка gcc (если с оптимизацией тот же эффект) сомнительна.

Если есть конкретный вектор, то можно сделать для него wrapper-класс и засунуть его как член оного класса дабы вокруг описателя возник барьер. А что при помощи gdbserver-а ничего поймать не удается?

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

да газ в лужи вы закачали знатно)))

ты то заценил! надеюсь понял свое место в этой жизни, любитель газовых луж))

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от io

А что при помощи gdbserver-а ничего поймать не удается?

смотря что, break на условии и print vector.size() выдает инвалидный размер

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

А watch там работает? Если да и можно установить пару (и на начало, и конец), то можно прецизионно поймать момент некорректного присваивания при не слишком больших накладных затратах. Впрочем это для долговременного объекта. Можно конечно и на size, но тогда только singlestepping - а это обременительно. Если программа достаточно прямолинейна, то можно еще ловить при помощи cond-овых breakpoint-ов.

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

>ты то заценил!

ваш пердеж словами?

надеюсь понял свое место в этой жизни, любитель газовых луж))


не стоит завидовать, еще 10000 ведер и твой великолепный код возможно будет падать реже, ты надейся)))

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

смотря что, break на условии и print vector.size() выдает инвалидный размер

надо ловить момент когда _M_impl._M_start становиться больше чем _M_impl._M_finish или чем _M_end_of_storage. То что size() вышел отрицательным - это не сама ошибка, это следствие ошибки.

а то что на других платформах работает - не показатель. На новой платформе программа подругому разлеглась в памяти, другие системные вызовы, другие форматы и прочее-прочее. Может у вас в программе системным вызовом заполняется структура, а она в реале на WinCE на пару байт больше и подругому должна быть выронена. Вот оно и упахало вектор.

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

ваш пердеж словами?

согласись же тебе понравилось, иначе тебя здесь небыло

не стоит завидовать, еще 10000 ведер и твой великолепный код возможно

здесь только констатация фактов, главное чтобы ты понял свое место в жизни, а мы все тебе в этом поможем))

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от MKuznetsov

надо ловить момент когда _M_impl._M_start становиться больше чем

_M_impl._M_finish или чем _M_end_of_storage. То что size() вышел

отрицательным - это не сама ошибка, это следствие ошибки.


спасибо за наводку!)

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

>главное чтобы ты понял свое место в жизни, а мы все тебе в этом поможем))

помогаем тут мы тебе стать хоть чуть-чуть более вменяемым, глядишь общими усилиями даже найдешь ошибку... о ужас У СЕБЯ! )))

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

моих усилий тут вообще не было так как не было кода, я только помог тебе чуть чуть уменьшить твою спесь )))

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

так как не было кода, я только

вот же невезуха... не получилось проявится программисту на LORе
НЕПЕРЕЖИВАЙ как клоун ты удался на 100%!

anonymous2 ★★★★★
() автор топика
Ответ на: комментарий от quest

большое спасибо, я сейчас заплачу от счастья! )))


да давайте, не жалко, начинайте! мы хлопаем в ладоши!

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

>проявится программисту на LORе

да, об этом можно только мечтать, это будет венец моей карьеры! )))
смешной ты какой

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

а что домой уже собрался?
права мне дашь? ... я прослежу чтобы тихо было, ладно ладно шучу)

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

переменых знаковых/беззнаковых небывает это ваши феерические фантазии вам вернули просто 32 бита информации все зависит от того как интерпретировать эти 32 бита со знаком или без вы очевидно со знаком интерпретируете а надо без знака на это намекает size_t используйте команды ассемблера которые не учитывают знак для этого в сишке юзайте беззнаковый тип он говорит компилятору эй компиляторишка используй команды не учитывающие при проверке eflags

anonymous
()

чему в момент возникновения ошибки равны this->_M_impl._M_finish и this->_M_impl._M_start?

jtootf ★★★★★
()

Дак чё, анан_нумбер_ту предоставил таки код на котором глючил гсс под винсе? Сорри три страницы было читать влом.

На мой взгляд, если ему переменная объявленная как ансигнеб инт выдает -72, то это не проблем стл, это проблем его кода который это ему кажет (типо принтф чувак не знает как юзать) ибо всё очень плохо (но мало вероятно) с портом гсс под винсе.

anonymous
()
Ответ на: комментарий от anonymous2

Начнем с того что не -72, а число, которое интерпретируется тем средством, которым ты смотрел, как -72. Вообще как ты это узнал? может у тебя просто возвращается число 4294967224 и это есть реальный размер вектора? А ты такой хренак и делаешь вот так:

cout << «Size( )= » << ( unsigned int ) << myVector.size( ) << endl;

И вообще завязывай вести себя как быдло. Коли не имеешь на руках кода, обращаешься на LINUX.org.ru чтобы тебе решили проблемы, возникающие с WINce, пытаешься унизить почти все отпостивших в втоей теме и хочешь решения задачи? ха-ха :)

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

> > делается заранее reserve(100)

Ошибка!!! Нужен resize(100).


Если дальше делается push_back() или нечто подобное, то ошибки нет. Ежели [] / at(), то явная ошибка. Но мы кода не видели. Есть ли код вообще. Весь тред похож больше на троллинг.

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

> > там дальше в процессе push_backи

А смысл тогда в reserve() ?


Пипец, ну откройте букварь уже - там русским по белому написано.

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

> > там русским по белому написано

Во первых, английским, а во вторых я и так вспомнил.


Рад за вас.

Незачем так нервничать.


Кто сказал, что я нервничаю? ;)

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

> Кто сказал, что я нервничаю? ;)

Мне поведали об этом буковки на мониторе. Только тс-с-с!!! Я подозреваю, что они следят за мной!

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

ну так сделай так уже:

unsigned int size=-72;

unsigned int realsize = abs(*((int *)&size));

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