Методы, чтобы обернуть getenv() и аналогичные без утечек или условий гонки в C
Указатель, возвращаемый getenv, не должен храниться, так как будущие вызовы getenv могут изменить его (или вызовы setenv и т. Д.). Я пытаюсь написать вспомогательную оболочку для getenv, которая возвращает значение по умолчанию, если переменная окружения не найдена. Я бы предпочел не пропускать память.
Варианты, которые я подумал:
Попросите функцию-оболочку скопировать строку, возвращаемую getenv, используя malloc и strcpy или strdup (это в POSIX-совместимой системе). Это работает и позволяет обрабатывать ошибки, но требует, чтобы вызывающая сторона помнила, чтобы освободить указатель. Это создает место для утечки памяти.
Не пытайтесь кешировать значение, пусть каждый звонящий сделает это. Это позволяет легко оставить условие гонки. Используйте глобальную переменную для хранения копии строки, возвращаемой getenv. Это позволило бы избежать необходимости освобождения памяти вызывающими программами, но могло бы поставить под угрозу условия гонки, такие как только getenv, если я не добавлю какие-либо блокировки / атомарные обновления.
Используйте статическую переменную в функции для кэширования значения. Это, вероятно, лучший вариант, так как он повторно использует память для последующих вызовов, но может привести к условиям гонки.
Я вполне уверен, что что-то упустил.
1 ответ
Это неправда:
Указатель, возвращаемый getenv, не должен храниться, так как будущие вызовы getenv могут изменить его
Следующее является:
(или звонки в сетенв и тд...
Тем не менее, вывод здесь просто, что вы не можете использовать setenv
(или что-либо, что изменяет среду) в многопоточном процессе. Это также делает потокобезопасным любую стандартную функцию, которая использует среду.
Итак, используйте getenv
и обрабатывать строки, на которые указывают возвращаемые значения, как неизменяемые.