Первый вопрос: Можно ли преобразовать глобальные массивы c-style в std:: arrays, не нарушая код? Я работаю над проектом, который состоит из декомпиляции исходного кода старой игры. Нам уже удалось реорганизовать большую часть вывода разборки/декомпиляции. Поскольку он автоматичен, есть еще такие разделы, как
int a;
int b[50];
*(&a + 100) = xxx;
или
int b[50];
int a;
*(&a - 100) = xxx;
и другие типы сумасшедшей арифметики указателей, которые еще предстоит реорганизовать вручную. Но мы хотели бы использовать проверку границ для разделов, которые (предположительно) были правильно изменены на массивы.
(Игнорировать текст курсивом, я сохраняю его только для согласованности в комментариях). Я обнаружил одну проблему до сих пор с чередованием каждого массива: sizeof(class containing array)
изменится. Это может сломать код в некоторых циклах, например someclass somearray [100]; // например (sizeof (somearray [0]) == 50) истинно int pointer = (int) somearray; указатель + = 100 ((SomeClass) указатель) → йоЗотеЬЫпд();
потому что pointer +=100
не будет указывать на второй элемент, но где-то внутри первого или даже нулевого, я не уверен (не забывайте, что он автоматически декомпилировал код, следовательно, уродство).
Я собираюсь изменить каждый глобальный массив на std:: array и каждый экземпляр доступа к массиву без оператора []
до array._Elems
.
Есть ли какие-либо проблемы, которые могут возникнуть, если бы я должен был изменить глобальные массивы в std:: массивы в коде, например?
Edit Вы были правы в том, что размер не меняется. У меня была ошибка в функциях тестирования. Поэтому я разберу вопрос:
Можно ли изменить каждый массив c-style на std:: array?
Edit Наш текущий код фактически работает только в режиме отладки, так как он не перемещает переменные. Режим деблокирования падает в основном в начале программы.
Edit Поскольку, похоже, возникает некоторая путаница в отношении этого вопроса, позвольте мне пояснить: есть ли какая-то гарантия того, что в массиве нет другого члена, кроме T elems [N]? Могу ли я рассчитывать на
array<array<int,10>, 10> varname;
int* ptr = &varname[0][0];
ptr += 10
и убедитесь, что ptr указывает на varname[1][0]
независимо от деталей реализации? Хотя это гарантировало, что массив смежный, я не уверен в этом. Стандарт содержит реализацию, но я не уверен, является ли эта примерная реализация или фактическое определение, которое каждая реализация должна придерживаться с помощью итератора и const_iterator, - это единственные вещи, которые являются специфичными для реализации, поскольку только у них есть слова, определенные реализацией (I не имеют последних спецификаций, поэтому могут быть и другие отличия).