LINUX.ORG.RU

Сообщения PPP328

 

Коды ошибок при многомодульном приложении

Форум — Development

Есть основной модуль, у него свой набор основных ошибок:

    /*        Name                Code              Description             */ \
    /* No error                                                             */ \
    SML(SUCCESS             , (0x00),        "Successfull                   ") \
    /* System general errors                                                */ \
    SML(SYSTEM_GENERALERROR , (0x01),        "Generic error                 ") \
    SML(SYSTEM_MISUSEOFBLTNS, (0x02),        "Misuse of shell built-ins     ") \
    /* Memory errors                                                        */ \
    SML(USER_BADALLOC       , (0x10 + 0x01), "Memory allocation failed      ") \
    /* Checking errors                                                      */ \
    SML(USER_BADPOINTER     , (0x20 + 0x01), "Bad pointer provided          ") \
    SML(USER_BADVALUE       , (0x20 + 0x02), "Bad value provided            ") \
    SML(USER_BADTYPE        , (0x20 + 0x03), "Bad type provided             ") \
    /* System errors                                                        */ \
    SML(SYSTEM_CANNOTEXECUTE, (0x7E),        "Command invoked cannot execute") \
    SML(SYSTEM_NOTFOUND     , (0x7F),        "Command not found             ") \
    SML(SYSTEM_INVALIDEXIT  , (0x80),        "Invalid argument to exit      ") \
    /* System signals                                                       */ \
    SML(SYSTEM_SIGHUP       , (0x80 + 0x01), "Hangup                        ") \
    SML(SYSTEM_SIGINT       , (0x80 + 0x02), "Interrupt                     ") \
    SML(SYSTEM_SIGQUIT      , (0x80 + 0x03), "Quit                          ") \
    SML(SYSTEM_SIGILL       , (0x80 + 0x04), "Illegal Instruction           ") \
    SML(SYSTEM_SIGTRAP      , (0x80 + 0x05), "Trace/Breakpoint Trap         ") \
    SML(SYSTEM_SIGABRT      , (0x80 + 0x06), "Abort                         ") \
    SML(SYSTEM_SIGEMT       , (0x80 + 0x07), "Emulation Trap                ") \
    SML(SYSTEM_SIGFPE       , (0x80 + 0x08), "Arithmetic Exception          ") \
    SML(SYSTEM_SIGKILL      , (0x80 + 0x09), "Killed                        ") \
    SML(SYSTEM_SIGBUS       , (0x80 + 0x0A), "Bus Error                     ") \
    SML(SYSTEM_SIGSEGV      , (0x80 + 0x0B), "Segmentation Fault            ") \
    SML(SYSTEM_SIGSYS       , (0x80 + 0x0C), "Bad System Call               ") \
    SML(SYSTEM_SIGPIPE      , (0x80 + 0x0D), "Broken Pipe                   ") \
    SML(SYSTEM_SIGALRM      , (0x80 + 0x0E), "Alarm Clock                   ") \
    SML(SYSTEM_SIGTERM      , (0x80 + 0x0F), "Terminated                    ") \
    SML(SYSTEM_SIGUSR1      , (0x80 + 0x10), "User Signal 1                 ") \
    SML(SYSTEM_SIGUSR2      , (0x80 + 0x11), "User Signal 2                 ") \
    SML(SYSTEM_SIGCHLD      , (0x80 + 0x12), "Child Status                  ") \
    SML(SYSTEM_SIGPWR       , (0x80 + 0x13), "Power Fail/Restart            ") \
    SML(SYSTEM_SIGWINCH     , (0x80 + 0x14), "Window Size Change            ") \
    SML(SYSTEM_SIGURG       , (0x80 + 0x15), "Urgent Socket Condition       ") \
    SML(SYSTEM_SIGPOLL      , (0x80 + 0x16), "Socket I/O Possible           ") \
    SML(SYSTEM_SIGSTOP      , (0x80 + 0x17), "Stopped (signal)              ") \
    SML(SYSTEM_SIGTSTP      , (0x80 + 0x18), "Stopped (user)                ") \
    SML(SYSTEM_SIGCONT      , (0x80 + 0x19), "Continued                     ") \
    SML(SYSTEM_SIGTTIN      , (0x80 + 0x1A), "Stopped (tty input)           ") \
    SML(SYSTEM_SIGTTOU      , (0x80 + 0x1B), "Stopped (tty output)          ") \
    SML(SYSTEM_SIGVTALRM    , (0x80 + 0x1C), "Virtual Timer Expired         ") \
    SML(SYSTEM_SIGPROF      , (0x80 + 0x1D), "Profiling Timer Expired       ") \
    SML(SYSTEM_SIGXCPU      , (0x80 + 0x1E), "CPU time limit exceeded       ") \
    SML(SYSTEM_SIGXFSZ      , (0x80 + 0x1F), "File size limit exceeded      ") \
    SML(SYSTEM_SIGWAITING   , (0x80 + 0x20), "All LWPs blocked              ") \
    SML(SYSTEM_SIGLWP       , (0x80 + 0x21), "VI Interrupt for T. Library   ") \
    SML(SYSTEM_SIGAIO       , (0x80 + 0x22), "Asynchronous I/O              ") \
                                                                               \
    SML(SYSTEM_OUTOFRANGE   , (0xFF),        "Exit status unknown           ") \
    /* Maximum is 255, as this index will be sent to exit() function        */

И есть пара модулей, каждый из которых делает какую-нибудь свою вещь, абсолютно не связанную (или наследованный от другого) с другим модулем. Выполнены в виде .so либ. К примеру модуль работы с иксами. У него свои коды ошибок:


    /* X-Server errors                                                      */ \
    SML(USER_XBADINIT       , (0x30 + 0x01), "Bad X-Server initialisation   ") \
    SML(USER_XBADVALUE      , (0x30 + 0x02), "Bad X-Resource value          ") \
    SML(USER_XBADWINDOW     , (0x30 + 0x03), "Bad X-Window                  ") \
    SML(USER_XBADPIXMAP     , (0x30 + 0x04), "Bad X-Pixmap                  ") \
    SML(USER_XBADATOM       , (0x30 + 0x05), "Bad X-Atom                    ") \
    SML(USER_XBADCURSOR     , (0x30 + 0x06), "Bad X-Cursor                  ") \
    SML(USER_XBADFONT       , (0x30 + 0x07), "Bad X-Font                    ") \
    SML(USER_XBADMATCH      , (0x30 + 0x08), "Bad X-Match                   ") \
    SML(USER_XBADDRAWABLE   , (0x30 + 0x09), "Bad X-Drawable                ") \
    SML(USER_XBADACCESS     , (0x30 + 0x0A), "Bad X-Access                  ") \
    SML(USER_XBADALLOC      , (0x30 + 0x0B), "Bad X-Alloc                   ") \
    SML(USER_XBADCOLOUR     , (0x30 + 0x0C), "Bad X-Colour                  ") \
    SML(USER_XBADGC         , (0x30 + 0x0D), "Bad X-GC                      ") \
    SML(USER_XBADID         , (0x30 + 0x0E), "Bad X-ID                      ") \
    SML(USER_XBADNAME       , (0x30 + 0x0F), "Bad X-Name                    ") \
    SML(USER_XBADLENGTH     , (0x30 + 0x10), "Bad X-Length                  ") \
    SML(USER_XBADIMPLEMENT  , (0x30 + 0x11), "Bad X-Implement               ") \

Ну для примера, возьмем еще один модуль, модуль юза шаред памяти, у него скажем тоже будет пара своих ошибок ну и пр.

И, собственно, архитектурный вопрос (с ЯП не связанный): как лучше сделать функцию, возвращающую описание ошибки по коду? У каждого модуля своя? А если он также может вернуть какую-нибудь generic ошибку? Типа bad pointer из главного модуля. Или лучше сделать функцию RegisterError(int code, char * desc), вызываемую при ините модуля? И тогда юзать единую функцию из главного модуля? А что если ошибок понадобится > 255? Сейчас модулей уже 8 штук, каждый хочет 5-8 кодов, а все это дело я хочу возвращать в совместимом с exit(code) виде (0..255).

Ну, собственно, сабж. Есть какое-нибудь общепринятое решение?

 

PPP328
()

Инициализация модуля с наименьшим оверхедом в си

Форум — Development

Есть либа (A-Library), предоставляющая некоторые функции. Она коннектится к другой либе (B-Library) и получает некую структуру:

typedef struct
{
   int a;
   int b;
   ...
   char z[256];
} AAA;

# In A-Library
int SomeFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do stuff
}

int SomeMoreFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do more stuff
}

int SomeEvenMoreFunc()
{
  AAA * aaa = GetAAAFromB();

  /// Do even more stuff
}

Понятно, что може например вынести ее глобально (как вариант через static):

# In A-Library
AAA * aaa = NULL;

int SomeFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do stuff
}

int SomeMoreFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do more stuff
}

int SomeEvenMoreFunc()
{
  if (!aaa) aaa = GetAAAFromB();

  /// Do even more stuff
}

Вопрос - как с наименьшим оверхедом проинициализировать ее? Нужно:
1. Обойтись без LibraryAInit функции
2. Обойтись без компиляторого-зависимых решений (need c89)
3. Обойтись без костылей в виде проверки в каждой функции, функций много и выглядит костыльно.
4. Представить что GetAAAFromB выполняется долго.

Может как-то намутить с адресами на функцию? Типа сначала адрес на GetAAAFromB, а потом на func() { return aaa; } ? Какие еще есть идеи?

 

PPP328
()

Чем чревата прямая инкапусляция структур в си?

Форум — Development
#include <stdlib.h>
#include <stdio.h>

typedef struct
{
   int a;
   char b;
   char c[20];
} TypeA;

typedef struct
{
  TypeA ta;
  int d;
} TypeB;

int main(void)
{
   /* Без проверок на аллокацию, суть не в них */
   TypeA * ta = malloc(sizeof(TypeA));
   ta->a = 5;   

   TypeB * tb = realloc(ta, sizeof(TypeB));
   tb->ta.b = 6;

   printf("%d, %d\n", tb->ta.a, tb->ta.b);

   free(tb);

   return 0;
}

UB?

 

PPP328
()

Как сделать run.sh для QtCreator в режиме редактора чтобы поддерживался дебаг?

Форум — Development

Если запускать средствами QtCreator (сам он используется тупо как редактор) - то дебаг поддерживается (он при этом спросит какой бинарь я хочу запускать). Хочу сделать чтобы у меня был run.sh, который будет запускать QtCreator и чтобы при этом можно было например поставить брякпоинт на конкретную строку и gdb понял что я от него хочу.

Осуществимо?

 ,

PPP328
()

Бага в libxml2?

Форум — Development

Пишу свой парсер, сверяюсь с libxml2 как образцом. сейчас подобрался к парсингу префиксов-неймспейсов. Ощущение что libxml2 не умеет с ними корректно работать вообще:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <aaa xmlns:de="http://www.dolby.com/dcinema/ws/smi/v11/SPL"        atr="abc"       xmlns:fe="http://somewhere">
   some text
   <de:bbb atr1="abb"  atr2="baa" >aaa</de:bbb>
   <de:ccc>aaa</de:ccc>
   <fe:ddd>bbb</fe:ddd>
   some more text
  </aaa>

XML валидный, проверено.

Что я получаю в итоге у себя (не обрабатываю неймспейсы пока):
space - text
* - attribute
$ - PI
+ - node
} - namespace definition
{ - namespace use

{
    '$xml' => {
        '*version' => '1.0',
        '*encoding' => 'UTF-8',
        '*standalone' => 'yes',
        ' xml' => '\x0A  ',
    },
    '+aaa' => {
        '*xmlns:de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
        '*atr' => 'abc',
        '*xmlns:fe' => 'http://somewhere',
        ' aaa' => '\x0A   some text\x0A   ',
        '+de:bbb' => {
            '*atr1' => 'abb',
            '*atr2' => 'baa',
            ' de:bbb' => 'aaa',
        },
        ' aaa' => '\x0A   ',
        '+de:ccc' => {
            ' de:ccc' => 'aaa',
        },
        ' aaa' => '\x0A   ',
        '+fe:ddd' => {
            ' fe:ddd' => 'bbb',
        },
        ' aaa' => '\x0A   some more text\x0A  ',
    },
},

Что я получаю у libxml2:

{
    '+aaa' => {
        ' aaa' => '\x0A   some text\x0A   ',
        '+bbb' => {
            ' bbb' => 'aaa',
            '*atr1' => 'abb',
            '*atr2' => 'baa',
            '}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   ',
        '+ccc' => {
            ' ccc' => 'aaa',
            '}de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   ',
        '+ddd' => {
            ' ddd' => 'bbb',
            '}fe' => 'http://somewhere',
        },
        ' aaa' => '\x0A   some more text\x0A  ',
        '*atr' => 'abc',
        '{de' => 'http://www.dolby.com/dcinema/ws/smi/v11/SPL',
        '{fe' => 'http://somewhere',
    },
},
Обратите внимание, что он пририсовал bbb сразу два неймспейса, пририсовал ccc сразу два неймспейса и пририсовал один (правильно) неймспейс для ddd.

ЧЯДНТ? Бага? Фича?

 

PPP328
()

Проясните по TLS

Форум — Development

Добрый день!

Разрабытываю либу общения с устройством, там бинарны протокол через веб-сокеты. Попалось такое же устройство, но которое еще и оборачивает все это дело в TLS. Известны параметры ключа, все дела, протокол остается якобы тот же.

До этого дел с шифрованием не имел, в сортах криптографии не разбираюсь.

Подскажите, как мне имплементировать поддержку TLS в мою либу (pure C), чтобы это было мЕньшим геморроем? Ну то есть у меня есть внутри алгоритмы вычленения пакета, проверки, и пр. и пр, причем там для ряда устройст серии разные ветки и проверки.

Как мне все это дело обернуть в этот ваш TLS? Как это вообще выглядит в канале? TCP?

 , ,

PPP328
()

Библиотека трансляции Perl Storable <-> C struct

Форум — Development

https://github.com/codemeow/camelion

Умеет:

  • Читать\писать perl storable
  • Читать\писать perl nfreezed binary
  • Самостоятельно создавать\редактировать структуры для трансляции

Дополнительно позволяет использовать себя как считыватель настроект для С-программы - кладем настройки в perl-storable и в файл и считываем либой. Поддерживает хэши любой вложенности, массивы, строки, инты.

 ,

PPP328
()

Модуль для слежения за аллоцируемой памятью

Форум — Development

Старый лоровский акк потерял (Edible), запилил этот.

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

[C-TH][        07_all_coloured.c:0009] Malloc :              0x00000190 B (0x09A9C008) : Success
[C-TH][        07_all_coloured.c:0013] Realloc: (0x09A9C008) 0x00000320 B (0x09A9C028) : Success
[C-TH][        07_all_coloured.c:0017] Free   : (0x09A9C028)                           : Success
[C-TH][        07_all_coloured.c:0019] Calloc :              0x00000080 B (0x09A9C008) : Success
[C-TH][        07_all_coloured.c:0022] Free   : (0x09A9C008)                           : Success

Может стрелять в stdout/stderr/файл. Может убрать необходимость проверять на null, может красить выхлоп с помощью ANSI-кодов.

https://github.com/codemeow/c-heetah

Берите, кому надо.

 , , ,

PPP328
()

Chrome + ZenMate = ERR_SPDY_PROTOCOL_ERROR

Форум — Desktop

Пробовал менять сервера, пробовал флюшить сокеты, ребутить браузер и роутер.

Что можно с этим еще поделать? Опера свой впн для линукса еще не включила, фурефокс жрет почти все мои 2ГБ памяти.

 ,

PPP328
()

RSS подписка на новые темы