Статьи из рубрики «c-cpp» RSS

Советы и программы на C/C++ для разных операционных систем.

Дочерние рубрики:

C или C++?

Задача: программа должна вывести строку «С++», если скомпилирована на С++ и «С», если на С. Далее »

Автор: , опубликовано в: C/C++, комментариев: 3
19
Апр
2009

Сколько будет i++ + ++i?

Вопрос для собеседования на вакансию -программиста:

int i = 5, j = i++ + ++i; – чему равно i и j?

Ответ вида «За такое нужно руки отрывать», не подходит, ибо автор вопроса считает, что знает правильный ответ — i=7, j=12. Но так ли это? Далее »

Автор: , опубликовано в: C/C++, комментариев: 5
13
Апр
2009

GCC: извращения с вращением

Неоднократно встречаю такие объявления в заголовочных файлах (это особенно характерно для всяких «домашних» криптографических библиотек):

[-]
View Code C
inline uint32_t rol(uint32_t x, uint8_t shift)
{
#if defined(__GNUC__) && defined(__i386__)
    __asm__("roll %%cl,%0" :"=r" (x) :"0" (x),"c" (shift));
    return x;
#else
    return (x < < shift) | (x >> (32 - shift));
#endif
}

Так вот: так делать не надо. Далее »

Автор: , опубликовано в: C/C++, комментариев: 1
22
Мар
2009

Практическая польза fast-типов

В данной статье речь пойдёт о типах int_fastXX_t/uint_fastXX_t из stdint.h.

Мне было интересно потестировать параллельную реализацию шифрования алгоритмом ГОСТ 28147–89 на многоядерных процессорах (с использованием , но это тема для отдельной статьи).

Как известно, ГОСТ 28147–89 — , оперирующий 64-битными (uint64_t) блоками. При выполнении зашифрования в режиме простой замены открытый текст разбивается на две половины (uint32_t). В принципе, это всё, что пока нужно знать :-)

Те, кто знакомы с особенностями архитектур 32- и 64-битных процессоров, знают, что 32-битные процессоры быстрее обрабатывают 32-битные числа, а 64-битные — соответственно, 64-битные.

В стандарте C99 языка C в файле <stdint .h></stdint> определены так называемые "быстрые типы": int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t и uint_fast64_t. Далее »

Автор: , опубликовано в: C/C++, комментариев: 4
20
Мар
2009

OpenMP: установка маски соответствия процессоров в Linux

Специалисты Intel рекомендуют задавать маску соответствия процессоров (известную как CPU affinity mask) для потоков , чтобы привязать поток к определённому процессору (или ядру процессора, что в данном случае одно и то же). Как утверждается, это позволяет минимизировать миграцию потоков и снизить стоимость переключения контекста между процессорами.
Далее »

Автор: , опубликовано в: C/C++, Linux, OpenMP, комментариев: 4
16
Мар
2009

Почему важно использовать setsid()

Для того, чтобы процесс стал демоном, программисты используют вызов fork(), например, следующим образом:

[-]
View Code C
chdir("/");
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

pid_t pid = fork();
switch (pid) {
    case 0:
        // Child code — hello from the daemon
        break;

    case -1:
        perror("fork");
        exit(EXIT_FAILURE);

    default:
        exit(EXIT_SUCCESS);
}

Код рабочий, но с точки зрения безопасности не самый лучший. Далее »

Автор: , опубликовано в: C/C++, Безопасность, комментариев: 1
8
Мар
2009

va_list и Segmentation Fault

Недавно пришлось вспомнить молодость и программирование на C. В результате столкнулся с одной очень неочевидной ошибкой.

Те, кто программируют под /, вероятно, знают о функции vsyslog. Её приятной особенностью является то, что вместо переменного количества аргументов она берет фиксированное количество, последним из которых является аргумент типа va_list. Недостаток функции — она не входит в стандарты POSIX (то есть в коде её можно использовать на свой страх и риск — и не забыть добавить проверку на её существование в autoconf). Далее »

Автор: , опубликовано в: C/C++, комментариев: нет
3
Мар
2009

GCC и throw-спецификация у автоматически сгенерированного виртуального деструктора

Имеется кусок кода:

[-]
View Code C++
#include <string>

class Base {
public:
    Base(void) {}
    virtual ~Base(void) throw() {}
};

class Derived : public Base {
public:
    ::std::string s;
};

int main(int, char**)
{
    return 0;
}
</string></pre>

При компиляции в GCC выдает интересную ошибку:
<pre lang="bash">
g++ test.cpp
test.cpp:9: error: looser throw specifier forvirtual Derived::~Derived()
test.cpp:6: error:   overriding ‘virtual Base::~Base() throw ()

Самое интересное, что если сделать Derived::s типа, например, int, то исчезнет.

В чем же дело? Далее »

Автор: , опубликовано в: C/C++, Всё подряд, комментариев: нет
22
Май
2008

Криптография, C++ и безопасное освобождение памяти

Разбираясь с деталями реализации распределителей памяти (allocator) в C++, я решил вспомнить своё криптографическое прошлое :-) Не в том плане, что я эксперт в криптографии, а в том, что приходилось читать соответствующую литературу (до сих порэтот гигабайт на винте валяется), разбираться с ней, анализировать алгоритмы, оценивать их с точки зрения безопасности и в том же духе. Но это не важно. Разбираясь с деталями реализации, я вспомнил интересную статью Питера Гутмана, «Secure Deletion of Data from Magnetic and Solid-State Memory». Еще в то время, когда я этим всем активно занимался и читал, мне в голову прочно врезалась фраза, смысл которой сводился к тому, что очень немногие криптографические библиотеки действительно заботятся о конфиденциальности чувствительной информации (например, ключи шифрования). Ведь информацию можно «вытащить» и из памяти выключенного компьютера; или с жесткого диска, даже если информация была переписана. Всех, кому интересна практическая реализация восстановления информации, отсылаю к статье Питера Гутмана (ссылка приведена выше).

Итак, сегодня выдалось очень подходящее настроение для копания в чужом C++ коде. Вот что из этого получилось. Далее »

Автор: , опубликовано в: C/C++, Безопасность, комментариев: 3
21
Май
2008

Наш ответ libresolv

Недавно мне пришлось заняться изучением интерфейса библиотеки , отвечающей за формирование -запросов и получение и разбор ответов (хотя разбор — это громко сказано). Так получилось, что нормальной внятной документации по API-функциям с примерами использования я найти не смог (может, я не там искал). И хотя код — лучшая документация, окончательно разобраться с форматом возвращаемых данных я смог только после изучения RFC, посвященных DNS. Далее »

Автор: , опубликовано в: C/C++, Linux, комментариев: 4
6
Май
2008