Кодирование Стандартов для чистого C (не C++)

Не существует прямого решения для вашего упомянутого сценария с точки зрения протокола OAuth и OpenID Connect.

Но из того, что вы объяснили, у вас есть службы, защищенные токеном доступа OAuth 2.0 в service A. Кроме того, A выступает в роли провайдера идентификации (с поддержкой OpenID Connect). Если это так, я считаю, что вы контролируете процесс выдачи токенов и проверки.

Один из вариантов - включить службы из B, которые защищены от маркеров доступа OAuth 2.0. Что похоже на то, что у вас уже есть в A. И чтобы использовать эти сервисы, у вас будут некоторые реализации сервис / клиент, связанные с A. Что они будут делать, так это получить токены из самого A для связи с B. Это может следовать предоставлению клиентских учетных данных из OAuth 2.0 , поскольку нет участия конечного пользователя (сценарий включает взаимодействие между сервисами).

Это предлагаемое решение аналогично использованию ключа API, но с дополнительным преимуществом протокола OAuth 2.0. Это позволяет генерировать токены доступа с ограниченным сроком службы и при необходимости обновлять их. Кроме того, если вы хотите, чтобы службы B использовались другим клиентом, то все будет просто.

31
задан skaffman 20 March 2012 в 14:22
поделиться

10 ответов

Возможно, вы захотите хорошенько взглянуть на исходный код ядра Linux ... Кстати, это не самый простой кусок кода, с которого можно начать, но, поскольку вы являетесь программистом, это может помочь ... Как объектно-ориентированный программист, вы, в частности, можете найти обработку ошибок в C трудной задачей. Может быть, это поможет ---> http://www.freetype.org/david/reliable-c.html

2
ответ дан Gabriel Devillers 27 November 2019 в 21:52
поделиться

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

Например:

/** foo.c */
static void foo_helper() {...} /* foo_helper cannot be called by name 
                                  outside of foo.c */
static int local_state;        /* local state is visible at file scope,
                                  but is not exported to the linker */
1
ответ дан John Bode 27 November 2019 в 21:52
поделиться

Если Вы интересуетесь стандартами важной среды, то MISRA C мог представлять интерес для Вас. Я нашел это полезным.

можно получить MISRA C 2004 здесь .

Краткий обзор обновленного MISRA C 2012 здесь .

0
ответ дан 27 November 2019 в 21:52
поделиться

Возможно, вам будет интересно проверить ответы на аналогичный вопрос , который я задал не так давно. Более того, если вас интересуют руководства по стилям C, вы можете взглянуть на эту страницу , поскольку это репозиторий руководств по стилям C (и C ++). Если вы настроены посмеяться , взгляните на Руководство по стилю НАСА C . В частности, взгляните на массивный комментарий ... вы поймете, о каком я говорю. Пожалуйста, не пишите подобные комментарии.

Я лично рекомендую Indian Hill C Style Guide с некоторыми изменениями. Кроме того, вы можете приобрести книгу Интерфейсы и реализации C , если вы:

31
ответ дан 27 November 2019 в 21:52
поделиться

Честно говоря, я не думаю, что сколько-нибудь ответов на StackOverflow научат вас разрабатывать и писать хорошо структурированные программы на C. Вам нужно прочитать хорошую книгу, и очевидная из них - это Язык программирования C Керниган и Ричи.

15
ответ дан 27 November 2019 в 21:52
поделиться

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

В противном случае я вижу типичную идиому, позволяющую избежать конфликтов пространств имен, - это добавить к имени какой-то идентификатор объекта. Например, все в foo.c может называться foo _ *

8
ответ дан 27 November 2019 в 21:52
поделиться

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

Во-первых, прочтите книгу по программированию и стилю на C, K&R в порядке. Во-вторых, я бы рекомендовал ознакомиться с Стандарт программирования CERT . Несмотря на то, что этот сайт в первую очередь ориентирован на «безопасные» стандарты кодирования, большая часть содержимого здесь представляет собой общие стандарты качества кода, которым должен следовать каждый. Выполнение упомянутых здесь действий улучшит ваше качество, устранит надоедливые ошибки и, как побочный эффект,

3
ответ дан 27 November 2019 в 21:52
поделиться

У меня нет профессионального опыта работы с C (только с C ++), поэтому не воспринимайте мои советы, уловки и подсказки слишком серьезно, поскольку они «объектно-ориентированы».

Почти объект C?

Имитировать базовые объектно-подобные функции можно легко:

В заголовке вперед объявите свой тип, определите его тип и объявите «методы». Например:

/* MyString.h */

#include <string.h>

/* Forward declaration */
struct StructMyString ;

/* Typedef of forward-declaration (note: Not possible in C++) */
typedef struct StructMyString MyString ;

MyString *       MyString_new() ;
MyString *       MyString_create(const char * p_pString) ;
void             MyString_delete(MyString * p_pThis) ;
size_t           MyString_length(const MyString * p_pThis) ;

MyString *       MyString_copy(MyString * p_pThis, const MyString * p_pSource) ;
MyString *       MyString_concat(MyString * p_pThis, const MyString * p_pSource) ;

const char *     MyString_get_c_string(const MyString * p_pThis) ;
MyString *       MyString_copy_c_string(MyString * p_pThis, const char * p_pSource) ;
MyString *       MyString_concat_c_string(MyString * p_pThis, const char * p_pSource) ;

Вы увидите, что каждая функция имеет префикс. Я выбираю имя «структуры», чтобы убедиться, что не будет столкновения с другим кодом.

Вы также увидите, что я использовал «p_pThis», чтобы сохранить идею OO-подобия.

В исходном файле определите свой тип и определите функции:

/* MyString.c */

#include "MyString.h"

#include <string.h>
#include <stdlib.h>

struct StructMyString
{
   char *      m_pString ;
   size_t      m_iSize ;
} ;

MyString * MyString_new()
{
   MyString * pMyString = malloc(sizeof(MyString)) ;

   pMyString->m_iSize = 0 ;
   pMyString->m_pString = malloc((pMyString->m_iSize + 1) * sizeof(char)) ;
   pMyString->m_pString[0] = 0 ;

   return pMyString ;
}

/* etc. */

Если вам нужны «частные» функции (или частные глобальные переменные), объявите их статическими в исходном коде C. Таким образом, они не будут видны снаружи:

static void doSomethingPrivate()
{
   /* etc. */
}

static int g_iMyPrivateCounter = 0 ;

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

Разное. Советы

Избегайте множественных кодовых путей.

Например, множественный возврат рискован. Например:

void doSomething(int i)
{
   void * p = malloc(25) ;

   if(i > 0)
   {
      /* this will leak memory ! */
      return ;
   }

   free(p) ;
}

Избегайте неконстантных глобальных переменных

Сюда входят «статические» переменные (которые не являются статическими функциями).

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

Избегайте конфликта имен

Выберите «пространство имен» для ваших функций и для ваших определений. Это может быть:

#define GROOVY_LIB_x_MY_CONST_INT 42

void GroovyLib_dosomething() ;

Остерегайтесь определений

Определений нельзя избежать в C, но они могут иметь побочные эффекты!

#define MAX(a, b) (a > b) ? (a) : (b)

void doSomething()
{
   int i = 0, j = 1, k ;
   k = MAX(i, j) ;   /* now, k == 1, i == 0 and j == 1 */
   k = MAX(i, j++) ; /* now, k == 2, i == 0 and j == 3, NOT 2, and NOT 1 !!! */
}

Инициализируйте свои переменные

Избегайте объявления переменных без их инициализации:

int i = 42 ; /* now i = 42 */
int j ;      /* now j can have any value */
double k ;   /* now f can have any value, including invalid ones ! */

Неинициализированные переменные вызывают болезненные ошибки.

Знайте все API C

Список функций C API, описанный в K&R, вполне небольшой. Вы прочтете весь список за 20 минут. Вы должны знать эти функции.

Хотите немного опыта?

Перепишите C API. Например, попробуйте написать свою собственную версию функции string.h, чтобы увидеть, как это делается.

9
ответ дан 27 November 2019 в 21:52
поделиться

Работайте с другими хорошими программистами на C. Попросите их проверить код. Не только позволяйте им смотреть на ваш код, но и вы смотрите на их код.

и если все частные функции и данные классов объявлены статическими . Вы создаете конструкторы с помощью malloc () для получения памяти и явной инициализации полей данных.

Конструктор для объекта с полностью закрытыми элементами данных может предоставлять непрозрачный указатель (набранный void * даже, или как указатель на неполный тип, если требуется безопасность типа). Если вы хотите иметь только общедоступные элементы данных, тогда хорошо подойдет указатель на публично определенную структуру .

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

Конечно, есть и другие способы хорошо спроектировать на чистом C, но если объектно-ориентированный подход работает для вас, вы не должны не нужно отказываться от него полностью.

Вы создаете конструкторы с помощью malloc () для получения памяти и явной инициализации полей данных.

Конструктор для объекта с полностью закрытыми элементами данных может предоставлять непрозрачный указатель (набранный void * даже, или как указатель на неполный тип, если требуется безопасность типа). Если вы хотите иметь только общедоступные элементы данных, тогда хорошо подойдет указатель на публично определенную структуру .

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

Конечно, есть и другие способы хорошего проектирования на чистом C, но если объектно-ориентированный подход работает для вас, вы не не нужно отказываться от него полностью.

Вы создаете конструкторы с помощью malloc () для получения памяти и явной инициализации полей данных.

Конструктор для объекта с полностью закрытыми элементами данных может предоставлять непрозрачный указатель (набранный void * даже, или как указатель на неполный тип, если требуется безопасность типа). Если вы хотите иметь только общедоступные элементы данных, тогда хорошо подойдет указатель на публично определенную структуру .

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

Конечно, есть и другие способы хорошо спроектировать на чистом C, но если объектно-ориентированный подход работает для вас, вы не должны не нужно отказываться от него полностью.

Конструктор для объекта с полностью закрытыми элементами данных может предоставлять непрозрачный указатель (набранный void * even, или как указатель на неполный тип, если требуется безопасность типа). Если вы хотите иметь только общедоступные элементы данных, тогда хорошо подойдет указатель на публично определенную структуру .

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

Конечно, есть и другие способы хорошо спроектировать на чистом C, но если объектно-ориентированный подход работает для вас, вы не должны не нужно отказываться от него полностью.

Конструктор для объекта с полностью закрытыми элементами данных может предоставлять непрозрачный указатель (набранный void * even, или как указатель на неполный тип, если требуется безопасность типа). Если вы хотите иметь только общедоступные элементы данных, тогда хорошо подойдет указатель на публично определенную структуру .

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

Конечно, есть и другие способы хорошо спроектировать на чистом C, но если объектно-ориентированный подход работает для вас, вы не должны не нужно отказываться от него полностью.

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

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

Конечно, есть и другие способы хорошо спроектировать на чистом C, но если объектно-ориентированный подход работает для вас, вы не должны не нужно отказываться от него полностью.

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

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

Конечно, есть и другие способы хорошо спроектировать на чистом C, но если объектно-ориентированный подход работает для вас, вы не должны не нужно отказываться от него полностью.

1
ответ дан 27 November 2019 в 21:52
поделиться

После двух недель охоты на диких гусей я не смог найти ни одной комбинации изменений кода, которая позволила бы использовать этот метод потоковой передачи документов PDF, Excel или Word, когда ' Не сохранять зашифрованные страницы на диск 'опция включена.

Microsoft заявила, что такое поведение является преднамеренным в ряде статей базы знаний и частных электронных письмах. Похоже, что когда включена опция « Не сохранять зашифрованные страницы на диск », IE ведет себя правильно и выполняет то, что ему велят делать. поскольку в кеш ничего не сохраняется, даже это 1-байтовое изображение в формате gif, которое десятки раз используется на странице, должно каждый раз загружаться с веб-сервера. Что еще хуже, некоторые действия пользователя могут потерпеть неудачу, например, загруженные файлы будут удалены, а при открытии PDF-документов не удастся назвать несколько сценариев ».

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

«Использовать 'Пустую папку временных файлов Интернета при закрытии браузера'. Каждый раз, когда браузер закрывает все файлы, все файлы удаляются из кеша при условии, что файл не заблокирован другим экземпляром браузера или каким-либо внешним приложением.

Перед использованием необходимо уделить много внимания » Не сохраняйте зашифрованные страницы на диск ».

4
ответ дан 27 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

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