Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
#1

Битовые утечки при записи данных на диск - C++

06.06.2016, 14:42. Просмотров 3489. Ответов 119
Метки нет (Все метки)

Доброго дня форумчане!
Сорри если оффтоп но... Пишу в консольке на C++ (MSVCE 2010) различные движки по расчетам и тут столкнулся с опасной проблемой.
При записи на диск искажаются данные на один бит, где то один раз на 109 - 1011 данных. Бит просто "теряется" (был 1 стал 0 или наоборот) , соответственно данные уже не верны, что приводит к нулю все проделанную работу.
Из исследованного:
Бит теряется при записи как в поток текстового значения переменных (типа fileout << a[i] << endl;)
Так и при записи в двоичном виде (типа fileout.write(reinterpret_cast<char*>(a),size*sizeof(a[0]));)
Замечено, что данные в памяти верные, т.к. были пойманы моменты при повторном выводе из того же массива все данные были записаны корректно.
Ошибка не зависит от винчестера на который данные были записаны (были записи на 3 различных винта, один из которых рейд массив).
Чаще всего теряется один из старших битов (типа 24-й бит в unsigned long или 24-й в unsigned long long). Других потерянных бит не замечено.
Термин "потерянный" возможно применяю в данном случае не верно. Т.к. заметно искажение только при его инвертировании. Соответственно если был сбой и он вместо 1 записал сбойную 1 - этого я не найду.
Система молчит про контроль целостности данных. Винт тоже. У винтов и рейда все показатели в порядке (блоки не сыпятся, SMART в порядке).

Сталкивался ли кто с подобным? В чем может быть проблема?

В ближайшем будущем хочу переустановить систему и MSVCE 2013. Но не уверен, что система виновата.
Кто что подскажет?
1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2016, 14:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовые утечки при записи данных на диск (C++):

Избежать утечки памяти при преобразовании строки в массив символов - C++ Builder
Всем привет! Как избежать утечки памяти в таком коде: char* ConvertString(String input) { char *output = new char; ...

Утечки памяти при использовании new/delete для двумерных массивов - C++
Добрый день. Суть в том, что есть несколько функций, получающих на вход и возвращающих двумерные массивы. Реализация передачи массивов...

Битовые операции с разными типа данных - C++
Здравствуйте. В голове возник такой странный вопрос, а мб и не странный. Возможны ли битовые операции с разными типа данных, например int...

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Ошибка при записи данных в файл - C++
Для записи перменной типа string выделяю динамически массив из 64 элементов char,после записи данных освобождаю память,но почему-то при...

Ошибка при записи в файл данных из обьекта класса - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; using namespace std; class Vector { public: double x; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,525
14.06.2016, 14:40 #61
Petrolion, Evg, заменил <<30 на <<29, запустил, на экране
Array at address (0x80000040). Proc: 3
и крутится колесико (типа думает)
это хорошо или плохо)?

Добавлено через 1 минуту
...причем жестко так думает - даже диспетчер задач не могу вызывать... все 4 ядра что ли захавал)?

Добавлено через 51 секунду
...чуть чуть отлип, написал
Table asc ready. Read: 0
Добавлено через 6 минут
...еще малек подумал и написал 1 после нуля)
1
Evg
Эксперт CАвтор FAQ
17815 / 6025 / 388
Регистрация: 30.03.2009
Сообщений: 16,554
Записей в блоге: 26
14.06.2016, 14:41 #62
Цитата Сообщение от vxg Посмотреть сообщение
и крутится колесико (типа думает)
Я не знаю, что такое "крутится колёсико". Если процесс исполняется и курсор это подсвечивает, то наверное это нормально. Программа-то явно долго работает. Но она не может захватить все 4 ядра, т.к. однопточная
1
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,525
14.06.2016, 14:51 #63
Evg, вот поэтому и удивляет жесткое залипание. может выделение триллионов байт памяти вызывает такой тупняк)?
1
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
14.06.2016, 14:59 #64
vxg, если собирать этот код на 32 битах, то появляется вот такое предупреждение (рапортует gcc):
iteration 536870911u invokes undefined behavior
На этот код:
C++
1
2
        for (int i = 0; i < n; i++)     //Asc tab
            b[i]=k+i; // ЗДЕСЬ
Я думаю, в твоем случае дело именно в этом.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.06.2016, 15:17 #65
Я уже предлогал протестировать модули памяти по отдельности, если их несколько. Можно будет сразу исключить или наоброт подтвердить проблему памяти. Если, конечно, не все модули по нелепой случайности окажутся сбойными.

Добавлено через 14 минут
DrOffset, странно, у меня почему то ничего не выводит. Можно узнать версию и параметры запуска?
У меня 4.9.3 и запускал вот так
Код
g++ -Wall -Wextra -pedantic -std=c++14 -m32
Так же пробовал добавлять -fsanitize=undefined, так же безрезультатно, вывод чист.
1
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,525
14.06.2016, 15:21 #66
DrOffset, собираю 64 бит. сейчас молотит. пишет строки вроде
Table ... ready. Read: ...
и еще разок написал
Array at address (0x80000040). Proc: 1
это хорошо все или плохо я не понял)?
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.06.2016, 15:22 #67
Правда, выкидывает исключение std::bad_array_new_length, так как ( 1 << 30 ) * 4 получается 4 гб.
1
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
14.06.2016, 15:27 #68
Toshkarik,
Bash
1
g++ -Wall -std=c++11 -02
Версия
gcc version 4.8.3 20140911 (Red Hat 4.8.3-7) (GCC)
Код из поста ТС.

Добавлено через 2 минуты
Цитата Сообщение от vxg Посмотреть сообщение
это хорошо все или плохо я не понял)?
Насколько я понял - это нормально.
1
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,525
14.06.2016, 15:35 #69
DrOffset, а что скажет при ошибке?
1
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
14.06.2016, 15:36 #70
Цитата Сообщение от vxg Посмотреть сообщение
а что скажет при ошибке?
Error at adr ....
и т.д.
2
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.06.2016, 16:52 #71
DrOffset, как Вы его смогли собрать? Там ведь винудзный код, а у Вас, как я понимаю, RedHat.

Я, если честно, тоже, как и мой компилятор, не вижу здесь переполнения. При i = 536870911, сумма i + k будет равна 587202559.
0
vxg
Модератор
3163 / 1966 / 221
Регистрация: 13.01.2012
Сообщений: 7,525
14.06.2016, 17:10 #72
Цитата Сообщение от Evg Посмотреть сообщение
Но она не может захватить все 4 ядра, т.к. однопточная
лагал своп вплоть до потери реакции на действия пользователя. побоялся что запорет все к чертям. снизил размер через <<28 оставил на 12 ч тест. теперь не лагает, первые строки выплюнул почти мгновенно.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
14.06.2016, 19:21 #73
Цитата Сообщение от Toshkarik Посмотреть сообщение
как Вы его смогли собрать?
Ну что ж я, безрукий что ли? Выбросил и заменил виндузное на аналоги. Сути это все равно не меняет. Рассматриваемый код я не трогал.

Цитата Сообщение от Toshkarik Посмотреть сообщение
если честно, тоже, как и мой компилятор, не вижу здесь переполнения.
На самом деле я тоже не вижу. Но должен был поделиться наблюдением.

Добавлено через 10 минут
Toshkarik, вообще это похоже на баг в gcc.
1
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
14.06.2016, 19:24 #74
DrOffset, возможно, Вы изменили n? Так как при n == ( 1 << 30 ) оно не запускается, так как пытается выделить ровно 4гб памяти.

Добавлено через 1 минуту
DrOffset, там Target Milestone: 4.8.1. У Вас 4.8.3. Вроде, уже пофикшена должна быть бага.
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
14.06.2016, 19:43 #75
Цитата Сообщение от Toshkarik Посмотреть сообщение
возможно, Вы изменили n? Так как при n == ( 1 << 30 ) оно не запускается, так как пытается выделить ровно 4гб памяти.
Нет, не менял. Зачем мне изменять n, да еще создавая при этом UB?

Добавлено через 7 минут
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вроде, уже пофикшена должна быть бага.
Ну во-первых это не факт, что она же. Во-вторых, баги иногда появляются снова, после очередной версии - в больших проектах, как ты знаешь, такое случается. Ну и в третьих, автор репорта мог банально ошибиться.
Завтра проверю пример из репорта.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2016, 19:43
Привет! Вот еще темы с ответами:

Утечки при использовании порта завершения и соккетов - C++
Здравствуйте, уважаемые Гуру! Реализовываю сервер с использованием порта завершения. Всё работает, всё прекрасно. Одно меня смущает -...

ClientDataSet, Blob утечки памяти при записи в файл - Delphi
столкнулся с такой ситуацией, есть ClientdataSet в котором есть блоб поле, которое я записываю процедурой ниже: Procedure...

При записи файлов на диск, комптютер выдал ошибку, что данный диск не может дальше использоваться - Windows 7
При записи файлов на диск, через некоторое время мой комптютер выдал ошибку, что данный диск не может дальше использоваться(или что-то...

При закачке игры на жесткий диск пишет "Ошибка при записи на диск" - Жесткие диски
В системе 2 жестких диска. Так вот, при попытке установить на жесткий диск игры со стима пишет &quot;Ошибка при записи на диск&quot;, загрузка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.06.2016, 19:43
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru