Потокобезопасность C11 в отношении функций, возвращающих указатели на статические буферы.

Рассмотрим такие функции, как localtime в стандартной библиотеке C, которые возвращают указатель на (исторически) статический буфер. Делает ли C11 эти буферы локальными для потока?

Согласно 7.1.4 в C11:

Если в последующих подробных описаниях явно не указано иное, библиотечные функции должны предотвращать гонку данных следующим образом: Библиотечная функция не должна прямо или косвенно обращаться к объектам, доступным для потоков, отличных от текущего потока, за исключением случаев, когда доступ к объектам осуществляется прямо или косвенно через аргументы функции. . Библиотечная функция не должна прямо или косвенно изменять объекты, доступные для потоков, отличных от текущего потока, за исключением случаев, когда доступ к объектам осуществляется прямо или косвенно через неконстантные аргументы функции. Реализации могут совместно использовать свои внутренние объекты между потоками, если объекты не видны пользователям и защищены от гонок данных.

Рассмотрим, например, localtime. struct tm, на который указывает его возвращаемое значение, похоже, не квалифицируется как "внутренний объект", поскольку он доступен вызывающей стороне, поэтому кажется, что вызов localtime в другом потоке может не стереть результат, ранее возвращенный в первом потоке. Это будет означать, что localtime должен использовать другой буфер для каждого потока.

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

Единственный способ, которым я могу найти, что реализация может соответствовать всем требованиям, - это утечка памяти повсюду, что, безусловно, не то, что предполагалось. Я упускаю что-то очевидное, или отношение C11 к потокобезопасности по отношению к устаревшим интерфейсам действительно плохо продумано?


person R.. GitHub STOP HELPING ICE    schedule 04.02.2012    source источник


Ответы (1)


... unless explicitly stated otherwise: во вводной главе 7.27.3 Time conversion functions прямо говорится, что эти функции не предназначены для предотвращения гонок данных. (Как и в случае со многими другими библиотечными функциями.)

Существуют производные функции с суффиксом _s в расширении проверки границ в нормативном приложении K, которые предназначены для предотвращения условий гонки.

person Jens Gustedt    schedule 04.02.2012
comment
ОК, я посмотрел в специальной документации функции, но не интро. Похоже, вы нашли то, что мне не хватало. - person R.. GitHub STOP HELPING ICE; 04.02.2012
comment
Вы можете добавить, что приложение является необязательным, реализации редки, несовместимы и/или неэффективны, и есть веские причины отклонить их, даже если они исправят эти нарушители условий сделки. См. также tr24731. - person Deduplicator; 14.04.2018