Какие функции C/C++ чаще всего используются неправильно и могут привести к переполнению буфера?

Для экспорта из AutoCad используйте формат OBJ или FBX. Страница Unity, «какие файлы можно импортировать», вводит в заблуждение, потому что экспортируемые форматы файлов различаются с каждым новым годом, а новые версии экспортирующих программ часто не совместимы с Unity. К сожалению, разработчикам Unity требуется несколько лет, чтобы ускорить процесс импорта.

Что касается оптимизации ваших моделей, «очистка их» в Maya - это шутка, потому что Maya также будет экспортировать «тяжелые», в зависимости от формата, который вы используете. Существует приоритет для очистки модели, но продукты AutoCad являются лучшими в отрасли, и если вы очищаете их в CAD-программе, а затем экспортируете в OBJ или FBX, все должно быть хорошо. Maya также является продуктом AutoCad, я просто говорю, что вам не нужно жонглировать файлом в разных программах. Если вы используете формат экспорта OBJ или FBX, и если ваш файл в основном является моделью CG, то он будет работать нормально, как обычно, из CAD-программы в Unity. В программах CAD есть утилиты для очистки моделей, а также такие программы, как Sketchup, DAZ3D и другие. Вам не нужно триангулировать лица, и обычно OBJ будет работать отлично.

. Ваш лучший вариант для импорта в Unity - использовать OBJ, если возможно, из любой исходной программы. Большинство моделей поддержат это, если у вас нет анимации или «костей». Если вы экспортируете в OBJ и выбираете опцию NOT triangulate всех лиц, и DO включают текстуры, вы должны быть в порядке. Если ваша модель включает анимацию, тогда вы должны использовать формат FBX, который будет иметь значительно более высокую стоимость файла.

Кроме того, он лучше работает и перетаскивает .obj-файл, файл .mtl и текстуры папке в папке Unity Asset, где вы ее хотите (лучше, чем пытаться использовать функцию Unity для импортирующего актива).

Следует иметь в виду, что многие форматы, которые Unity заявляет для импорта на своих «каких файлах я могу import "недействительны в зависимости от версии программы экспорта. Например, файлы DXF должны быть более ранней, а не последней. Такие программы, как Sketchup и .skp, будут импортированы только в Unity, если вы используете более раннюю версию еще в 2013 году, как и Unity 5.6.0f3.

Обычно, если вы знаете об этих проблемах, и вы готовы попробовать несколько методов экспорта / импорта модели CG, вы найдете успех. Очевидно, игровые разработчики продолжают использовать Unity, потому что они оценивают двигатель достаточно, чтобы терпеть эти недостатки.

16
задан Community 23 May 2017 в 12:30
поделиться

11 ответов

В целом, любая функция, которая не проверяет границы в аргументы. Список был бы

  • , добирается ()
  • scanf ()
  • strcpy ()
  • strcat ()

, необходимо использовать ограниченные версии размера как stncpy, strncat, fgets, и т.д. Затем быть осторожными при предоставлении предела размера; учтите '\0' завершений строки.

кроме того, массивы НЕ связываются зарегистрированные C или C++. Следующий пример вызвал бы ошибки. См. прочь одной ошибкой

int foo[3];
foo[3] = WALKED_OFF_END_OF_ARRAY;

редактирование : Скопированные ответы @MrValdez, @Denton Дворянство

11
ответ дан 30 November 2019 в 17:28
поделиться

Valgrind является Вашим новым лучшим другом.

valgrind - tool=memcheck - leak-check=full./a.out

5
ответ дан 30 November 2019 в 17:28
поделиться

Вопрос запускается в неправильном конце, я боюсь. Это предполагает, что переполнение буфера происходит в других функциях. Наиболее распространенной причиной является оператор ++, по моему опыту, или альтернативно отсутствие оператора! =.

лучшим решением найти пакет тех является / GS в Visual Studio 2005/8. Это не найдет всех их, но это - дешевый способ уменьшить количество необходимого физического труда.

3
ответ дан 30 November 2019 в 17:28
поделиться

Вот некоторые функции, что я нашел, что опасны:

  • добирается () - Это не проверяет длину переменной и может перезаписать память, если вход больше, чем буфер переменной.
  • scanf () - я так рад, что Visual Studio сказала мне, что эта функция удерживается от использования. Это было легкой фиксацией.
  • strcpy () - Если пространство памяти источника больше, чем место назначения, данные после того, как место назначения перезаписывается.
2
ответ дан 30 November 2019 в 17:28
поделиться

К сожалению, любой массив может привести к переполнению буфера:

uint32_t foo[3];
foo[3] = WALKED_OFF_END_OF_ARRAY;

С точки зрения функций, sprintf счастливо уйдет от конца буфера. Это может быть заменено snprintf.

2
ответ дан 30 November 2019 в 17:28
поделиться

Memcpy () является другим опасный.

Любой цикл, получающий доступ к массиву, является опасной точкой, потому что нет никакого выхода за пределы остановки конца массива.

Утечки памяти вызываются, выделяя память, и не освобождая ее. Конструктор и деструкторы должны быть другой сильной точкой обзора, последний, чтобы удостовериться, что любая выделенная память освобождена.

2
ответ дан 30 November 2019 в 17:28
поделиться

Какую версию Visual Studio Вы используете? В 2008 со всеми включенными предупреждениями, все функции Вы упоминаете (и больше) предупреждают Вас, что они удерживаются от использования.

, Возможно, Вы могли проверить, что все предупреждения включены и позволяют компилятору сделать тяжелую работу для Вас?

Как примечание стороны, превосходное безопасный код записи делает отличную работу, объясняя различное ловушки некоторых более старых функций.

2
ответ дан 30 November 2019 в 17:28
поделиться

У меня есть несколько та же проблема на кодовой базе, я продолжаю работать. Мой совет: опасайтесь любых функций C, которые похожи на str* () и мадам* (). Также опасайтесь чего-либо, что берет указатель на буфер без длины. Так как кажется, что у Вас есть шанс использовать C++, я был бы в самых вопиющих случаях пытаться использовать контейнеры C++ для вещей: вектор, строка, карта, и т.д. Они делают Вашу жизнь намного легче.

кроме того, автоматизированные проблемные инструменты обнаружения замечательны иметь. Если бы можно использовать valgrind, я рекомендовал бы его. Также Рациональный Очищают, чрезвычайно мощно, хотя не дешевый.

2
ответ дан 30 November 2019 в 17:28
поделиться

Следующая ссылка должна дать Вам всесторонний взгляд на функции защиты в C++ (которые снабжаются постфиксом '_s' для решения проблем как переполнение): http://msdn.microsoft.com/en-us/library/8ef0s5kh (По сравнению с 80) РЕДАКТИРОВАНИЕМ .aspx

: Эта ссылка содержит определенные функции, которые были заменены: http://msdn.microsoft.com/en-us/library/wd3wzwts (По сравнению с 80) РЕДАКТИРОВАНИЕМ .aspx

: я должен упомянуть, что это методы Microsoft, но ссылка все еще полезна для идентификации функций, которые считали красным флагом.

2
ответ дан 30 November 2019 в 17:28
поделиться

В основном, что-либо, что принимает указатель и записи к нему, не проверяя длину. Так вещь как strcpy (), sprintf () и т.д.

0
ответ дан 30 November 2019 в 17:28
поделиться

Еще одна проблема в C - это функция strncpy (). Многие люди не понимают, что можно бесплатно возвращать строку, не оканчивающуюся нулем.

1
ответ дан 30 November 2019 в 17:28
поделиться