Действительно ли безопасно использовать getenv () в статических инициализаторах, то есть, прежде основной ()?

Некоторые играют в data.table и повторно используют свою существующую substr() логику:

library(data.table)
setDT(testdata)
cols <- paste0("v", 11:13)
new_cols <- paste0(rep(cols, 2), rep(c("a", "b"), each = length(cols)))
extra <- function(x) substr(x, 1, 4)
extrb <- function(x) substr(x, 5, 8)
testdata[, (new_cols) := c(lapply(.SD, extra), lapply(.SD, extrb)), .SDcols = cols]

> testdata
        v11      v12      v13 v11a v12a v13a v11b v12b v13b
1: 00240031 00000000 00310064 0024 0000 0031 0031 0000 0064
2: 00310028 00000000 00180058 0031 0000 0018 0028 0000 0058
12
задан Ciro Santilli 新疆改造中心法轮功六四事件 13 July 2015 в 08:17
поделиться

3 ответа

Я думаю, что можно запустить программу с набором LD_DEBUG для наблюдения точного порядка:

LD_DEBUG=all <myprogram>

Править: Если Вы смотрите на исходный код компоновщика во время выполнения (glibc 2.7), конкретно в файлах:

  • sysdeps/unix/sysv/linux/init-first.c
  • sysdeps/i386/init-first.c
  • csu/libc-start.c
  • sysdeps/i386/elf/start. S

Вы будете видеть, что argc, argv и окружают (псевдоним для __окружите), установлены, прежде чем любых глобальных конструкторов вызывают (функции init). Можно следовать за выполнением стартовое право от _start, фактическая точка входа (запустить. S). Поскольку Вы заключили Stevens в кавычки "Массив строк, названный средой, сделан доступным, когда процесс начинается", предполагая, что присвоение среды происходит в самом начале инициализации процесса. Поддержанный кодом компоновщика, который делает то же, должен дать Вам достаточное душевное спокойствие :-)

РЕДАКТИРОВАНИЕ 2: Также стоящий упоминания, это окружает, установлен достаточно рано, что даже компоновщик во время выполнения может запросить его, чтобы определить, произвести ли verbosely (LD_DEBUG).

8
ответ дан 2 December 2019 в 21:24
поделиться

По моему опыту, библиотека времени выполнения C инициализируется, прежде чем время выполнения вызывает инициализаторы Ваших статических переменных (и таким образом, Ваши инициализаторы могут назвать библиотечные функции времени выполнения C).

1
ответ дан 2 December 2019 в 21:24
поделиться

Учитывая, что и установка среды и вызов статических инициализаторов являются функциями, которые должно выполнить время выполнения языка, прежде основной () вызывается, я не уверен, что Вы найдете гарантию здесь. Таким образом, я не знаю о конкретном требовании здесь, что это должно работать и что порядок гарантируется до основного () на, скажем, языке ANSI и спецификациях библиотеки или чем-либо...., но я не проверял для проверки также.

В то же время я не знаю о конкретном требовании, которое ограничивает, какие функции библиотеки времени выполнения могут быть вызваны от статического инициализатора. И, главное, было бы похоже на ошибку во время выполнения (мне), если Вы не могли бы получить доступ к среде от одной.

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

4
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: