Кодирование фиктивных переменных и условных операторов в R [duplicate]

1 - Отражение (как концепция) действительно ортогонально безопасности / безопасности.

В дизайне java большое внимание уделялось дизайну java, чтобы сделать его безопасной платформой со статической типизацией, менеджером безопасности, дисциплинированное использование загрузчика классов, а также отсутствие возможности наведения указателей / памяти. Вы можете прочитать интервью Джеймса Гослинга в Учреждениях программирования , что интересно об этом.

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

Но возможны и более тонкие вещи. Например, загрузчики классов, которые можно рассматривать как рефлексивный крючок в системе, были неправильно разработаны в ранней версии Java, что привело к потенциальной замене типа. Статья Загрузка динамического класса в JVM, Гиладом Брахой, проницательна по таким вопросам.

Отражение нельзя полностью отключить; всегда можно задуматься о своих собственных общественных полях / методах. Однако отражение в частных структурах с AccessibleObject.setAccessible может быть отключено, поскольку оно прерывает инкапсуляцию. Доступ к закрытым полям и т. Д. Возможен осмотр и изменение внутренних данных. Это может привести к различным вредоносным атакам, например.

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

Наконец, есть другой механизм, который ставит под угрозу безопасность, особенно sun. misc.Unsafe , который дает прямой доступ к указателям памяти.

2 - Теперь вопрос заключается в том, приведет ли отражение (на практике) к множеству рисков.

Я прочитал ссылку, указанную @dbyrne но это в основном около .net. Также я точно не знаю, что отключено для приложения Google. Это только ReflectPermission или другое разрешение диспетчера безопасности? Одна опасность заключается в том, чтобы получить доступ к файловой системе и беспорядок.

Проблема доступа к конфиденциальным данным и прерывания инкапсуляции может быть доказана на практике. Написание защищенного кода действительно чрезвычайно сложно, и даже без изменения модификатора доступа вы можете подклассифицировать классы неприемлемым образом - если они не являются final или даже лучше, закрыты - и передают их. Это, например, то, что защитное копирование пытается защитить.

Тип-безопасность также в любом случае угрожает ошибкой во время выполнения из-за downcast, поэтому этот аргумент также может быть аргументирован.

В общей / размещенной среде безопасность относительна. На уровне языка вы можете, например, не мешать модульной форме, потребляющей 100% процессора, или потребляющей всю память до OutOfMemoryException .

Таким образом, мой личный ответ был бы следующим: отражение - это риск безопасности, но не такой большой в по сравнению с другими потенциальными атакующими векторами.

24
задан Julius Vainora 5 January 2013 в 13:25
поделиться

5 ответов

Возможно, вы хотите ifelse:

a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)

 [1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
 [9] 0.250 0.250
40
ответ дан user1317221_G 16 August 2018 в 03:40
поделиться

Просто добавив точку в целом дискуссию о том, почему это предупреждение появляется (раньше мне это не было ясно). Причина, по которой это делается, как упоминалось ранее, заключается в том, что «a» в этом случае является вектором, а неравенство «a> 0» создает другой вектор TRUE и FALSE (где «a» -> 0 или нет).

Если вы хотите вместо этого проверить, есть ли какое-либо значение 'a> 0', вы можете использовать функции - «any» или «all»

Best

9
ответ дан Atesh 16 August 2018 в 03:40
поделиться

if оператор не векторизован. Для векторизованных операторов if вы должны использовать ifelse. В вашем случае достаточно написать

w <- function(a){
if (any(a>0)){
  a/sum(a)
}
  else 1
}

или короткую векторную версию

ifelse(a > 0, a/sum(a), 1)

. Это зависит от того, что вы хотите использовать, потому что первая функция дает выходной вектор длина 1 (в остальной части) и ifelse дает выходной вектор длины, равный длине a.

32
ответ дан jem77bfp 16 August 2018 в 03:40
поделиться
  • 1
    почему о, почему, если все остальное в R-стране векторизовано ... «если» нет? Smdh. – Matt O'Brien 18 August 2015 в 02:23

Как я решал этот вопрос, когда я пытался сделать что-то подобное, когда я определял функцию, и он вызывался с массивом, как другие указывали

. Вы могли бы сделать что-то вроде этого, однако для эти сценарии менее элегантны по сравнению с методом Свена.

sapply(a, function(x) afunc(x))

afunc<-function(a){
  if (a>0){
    a/sum(a)
  }
  else 1
}
0
ответ дан rlhull6 16 August 2018 в 03:40
поделиться

Вот простой способ без ifelse:

(a/sum(a))^(a>0)

Пример:

a <- c(0, 1, 0, 0, 1, 1, 0, 1)

(a/sum(a))^(a>0)

[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25
15
ответ дан Sven Hohenstein 16 August 2018 в 03:40
поделиться
  • 1
    Это превосходит ifelse примерно в 7 раз (на массиве элементов 100000). – Matthew Lundberg 5 January 2013 в 16:24
  • 2
    Полезно знать, @Arun +1 – Sven Hohenstein 5 January 2013 в 18:24
  • 3
    Не могли бы вы рекомендовать краткое объяснение / документацию этого оператора ^ (например, то, что он назвал и как он работает). Предпочтительно что-то более прямое, чем документация арифметических операторов ... – theforestecologist 13 November 2017 в 03:35
  • 4
    @theforestecologist Оператор ^ используется для возведения в степень. Команда x ^ y означает: x поднята до значения y. Код 2 ^ 3 будет вычислять 2 * 2 * 2. – Sven Hohenstein 13 November 2017 в 21:19
Другие вопросы по тегам:

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