Более безопасные альтернативы стандартной библиотеке C

Во-первых, вы говорите:

Поскольку данные отслеживаются в двух отдельных состояниях с разными участниками, это необходимо будет сделать в двух транзакциях.

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

Начиная с Corda 4, платформа не обеспечивает многоядерных гарантий атомарности. Не существует встроенного способа гарантировать, что данная транзакция фиксируется только в том случае, если зафиксирована другая транзакция (но см. Пункт P.S. ниже).

Так что ни один из ваших вариантов не гарантирует атомарность нескольких транзакций. Я все еще верю, что вариант 1 был бы предпочтительнее, поскольку вы получаете гарантии структуры потока, что транзакция будет вызвана. Вы обеспокоены тем, что респондентом будет вызван поток, создающий вторую транзакцию, даже если первая транзакция не удалась Этого можно избежать, используя waitForLedgerCommit, чтобы убедиться, что транзакция 1 зафиксирована до начала потока для создания второй транзакции:

class CustomerIssueFlowResponder(val otherPartyFlow: FlowSession) : FlowLogic<SignedTransaction>() {
    @Suspendable
    override fun call(): SignedTransaction {
        val signTransactionFlow = object : SignTransactionFlow(otherPartyFlow) {
            override fun checkTransaction(stx: SignedTransaction) = requireThat {
                val output = stx.tx.outputs.single().data
                "This must be an CustomerState." using (output is CustomerState)
            }
        }
        // signing transaction 1
        val stx = subFlow(signTransactionFlow)
        val customerState = stx.tx.outputs.single().data as CustomerState
        // initiating transaction 2 once transaction 1 is committed
        waitForLedgerCommit(stx.id)
        subFlow(CustomerIssueOrUpdateFlow(customerState))

        return stx
    }
}

P.S. Один из возможных способов достижения многозаходности - использование обременений следующим образом:

  • Представьте, что у нас есть две транзакции: Tx1, которая выводит S1, и Tx2, которая выводит S2
  • As часть Tx1, обременяет S1, так что он может быть израсходован только в том случае, если вы знаете подпись нотариуса над Tx2, или возвращается в исходное состояние по истечении некоторого периода времени
  • Как часть Tx2, обременять S2, чтобы он мог тратиться только в том случае, если вы знаете подпись нотариуса над Tx1 или возвращается в исходное состояние по истечении некоторого периода времени

Однако одна атака, которая приходит на ум, это вызывающая сторона FinalityFlow для Tx1, но не распространение подписи нотариуса по Tx1, позволяя им требовать Tx2, не отказываясь от Tx1. Это было бы решено, если бы нотариус опубликовал все свои подписи на какой-нибудь доске объявлений вместо того, чтобы полагаться на звонящего из FinalityFlow для их распространения.

13
задан 2 revs 10 August 2009 в 21:50
поделиться

7 ответов

Я пользуюсь библиотекой GLib, она имеет много хороших стандартных и нестандартных функций.

См. https://developer.gnome.org/glib/stable/

и возможно Вы влюбляетесь... :)

Например:

https://developer.gnome.org/glib/stable/glib-String-Utility-Functions.html#g-strdup-printf

объясняет, что g_strdup_printf:

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

8
ответ дан 1 December 2019 в 22:58
поделиться

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

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

4
ответ дан 1 December 2019 в 22:58
поделиться

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

3
ответ дан 1 December 2019 в 22:58
поделиться

Как пример того, что я говорю о, D.J. Bernstein, более известный как djb, автор djbdns и qmail, создал djblib, который обеспечивает быструю, трудную, безопасную альтернативу многим стандартным библиотечным функциям C.

3
ответ дан 1 December 2019 в 22:58
поделиться

Возможно, первый вопрос спросить состоит в том, если Ваш действительно нуждаются в плоскости C? (возможно, язык как .NET или Java является опцией - затем, например, переполнение буфера больше не является действительно проблемой),

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

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

0
ответ дан 1 December 2019 в 22:58
поделиться

Для Windows существует 'безопасная' библиотека C/C++.

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

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

Является ли это действительно хорошей идеей, несколько спорно, но существует TR24731, опубликованный стандартным комитетом C - для более безопасного набора функций C. Там существует определенно некоторый хороший материал. Посмотрите этот вопрос: Вы используете TR 24731 Безопасные Функции в Вашем коде C?, который включает ссылки на технический отчет.

0
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

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