Является ли область mmap-объекта «единым объектом» и могу ли я сравнить указатели внутри него? - PullRequest
3 голосов
/ 12 марта 2019

Я работаю над реализацией malloc в качестве школьного упражнения, используя mmap.

Я бы хотел вычислить размер моего блока памяти в моем свободном списке, используя адрес метаданных.

Но я не уверен, что это решение было бы хорошо определено в стандарте C, я не нашел ссылку на то, считается ли выделенная область mmap «объектом» в значении этой части C стандарт:

§6.5.8.5 (цитата взята из , которая отвечает на несколько связанный вопрос):

Когда сравниваются два указателя, результат зависит от относительного расположения в адресном пространстве указанных объектов. Если два указателя на объект или незавершенные типы оба указывают на один и тот же объект, или оба указывают один за последним элементом одного и того же объекта массива, они сравниваются одинаково. Если указанные объекты являются членами одного и того же агрегатного объекта, указатели на элементы структуры, объявленные позже, сравниваются больше, чем указатели на элементы, объявленные ранее в структуре, а указатели на элементы массива с большими значениями нижнего индекса сравниваются больше, чем указатели на элементы того же массива с более низкими значениями индекса. Все указатели на члены одного и того же объекта объединения сравниваются одинаково. Если выражение P указывает на элемент объекта массива, а выражение Q указывает на последний элемент того же объекта массива, выражение указателя Q+1 сравнивается больше, чем P. Во всех остальных случаях поведение не определено.

Другими словами, могу ли я считать область mmap массивом байтов (или char) в стандарте?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Стандарт C описывает только семантику указателей, сформированных определенным образом.Реализации свободны назначать любую семантику, которую они считают подходящей, указателям, сформированным другими способами.По мнению авторов Стандарта, Дух C включает в себя фундаментальный принцип «Не мешайте программисту делать то, что должно быть сделано», и они предположительно предполагали, что качественная реализация, предназначенная для решения различных задач, должна избегать навязывания ненужныхпрепятствия для программистов, пытающихся выполнить эти задачи.Это предполагает, что если качественная реализация определяет способы создания указателей на области хранения, которые не связаны с объектами статической, автоматической или выделенной продолжительности, она должна обрабатывать такие указатели с пользой, даже если стандарт не требует этого.

К сожалению, разработчики компиляторов не всегда понимают, для каких целей их компиляторы подходят для различных конфигураций.Существует много ситуаций, когда компиляторы описывают поведение категории действий более подробно, чем требуется стандартом, но стандарт будет характеризовать перекрывающуюся категорию действий как вызывающую UB.Некоторые авторы компиляторов считают, что UB просто означает, что Стандарт не предъявляет никаких требований, но поведенческие описания, которые выходят за рамки требований, требуемых Стандартом, не должны быть затронуты.Другие считают, что действие вызывает UB как переопределение всех других поведенческих описаний.

Действия с адресами, которые распределены способами, которые реализации не понимают, будут определены только в той степени, которая описана реализациями.,В некоторых реализациях тот факт, что Стандарт будет характеризовать, например, сравнения, включающие несвязанные указатели как UB, следует рассматривать как неактуальный, поскольку Стандарт ничего не говорит о том, как будут вести себя такие указатели.На других, однако, тот факт, что стандарт характеризует некоторые действия как UB, будет доминировать.К сожалению, трудно понять, какой сценарий применим в любой конкретной ситуации.

1 голос
/ 12 марта 2019

Да, вы можете сделать это разумно, так как изначально объект не имеет действительного типа - иначе системный вызов mmap будет совершенно бесполезным и . ожидайте , что компилятор C, нацеленный на систему POSIX, не должен делать mmap бесполезным ...

...