Статьи из рубрики «c-cpp»
Советы и программы на C/C++ для разных операционных систем.
- Qt (3)
C или C++?
Задача: программа должна вывести строку «С++», если скомпилирована на С++ и «С», если на С. Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 3Апр
2009
Сколько будет i++ + ++i?
Вопрос для собеседования на вакансию C/C++-программиста:
int i = 5, j = i++ + ++i; – чему равно i и j?
Ответ вида «За такое нужно руки отрывать», не подходит, ибо автор вопроса считает, что знает правильный ответ — i=7, j=12. Но так ли это? Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 5Апр
2009
GCC: извращения с вращением
Неоднократно встречаю такие объявления в заголовочных файлах (это особенно характерно для всяких «домашних» криптографических библиотек):
{
#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
}
Так вот: так делать не надо. Далее »
Автор: Vladimir, опубликовано в: C/C++, комментариев: 1Мар
2009
Практическая польза fast-типов
В данной статье речь пойдёт о типах int_fastXX_t/uint_fastXX_t из stdint.h.
Мне было интересно потестировать параллельную реализацию шифрования алгоритмом ГОСТ 28147–89 на многоядерных процессорах (с использованием OpenMP, но это тема для отдельной статьи).
Как известно, ГОСТ 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. Далее »
Мар
2009
OpenMP: установка маски соответствия процессоров в Linux
Специалисты Intel рекомендуют задавать маску соответствия процессоров (известную как CPU affinity mask) для потоков OpenMP, чтобы привязать поток к определённому процессору (или ядру процессора, что в данном случае одно и то же). Как утверждается, это позволяет минимизировать миграцию потоков и снизить стоимость переключения контекста между процессорами.
Далее »
Мар
2009
Почему важно использовать setsid()
Для того, чтобы процесс стал демоном, программисты используют вызов fork(), например, следующим образом:
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);
}
Код рабочий, но с точки зрения безопасности не самый лучший. Далее »
Автор: Vladimir, опубликовано в: C/C++, Безопасность, комментариев: 1Мар
2009
va_list и Segmentation Fault
Недавно пришлось вспомнить молодость и программирование на C. В результате столкнулся с одной очень неочевидной ошибкой.
Те, кто программируют под Linux/UNIX, вероятно, знают о функции vsyslog. Её приятной особенностью является то, что вместо переменного количества аргументов она берет фиксированное количество, последним из которых является аргумент типа va_list. Недостаток функции — она не входит в стандарты POSIX (то есть в коде её можно использовать на свой страх и риск — и не забыть добавить проверку на её существование в autoconf). Далее »
Мар
2009
GCC и throw-спецификация у автоматически сгенерированного виртуального деструктора
Имеется кусок кода:
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 for ‘virtual Derived::~Derived()’
test.cpp:6: error: overriding ‘virtual Base::~Base() throw ()’
Самое интересное, что если сделать Derived::s типа, например, int, то ошибка исчезнет.
В чем же дело? Далее »
Автор: Vladimir, опубликовано в: C/C++, Всё подряд, комментариев: нетМай
2008
Криптография, C++ и безопасное освобождение памяти
Разбираясь с деталями реализации распределителей памяти (allocator) в C++, я решил вспомнить своё криптографическое прошлое
Не в том плане, что я эксперт в криптографии, а в том, что приходилось читать соответствующую литературу (до сих порэтот гигабайт на винте валяется), разбираться с ней, анализировать алгоритмы, оценивать их с точки зрения безопасности и в том же духе. Но это не важно. Разбираясь с деталями реализации, я вспомнил интересную статью Питера Гутмана, «Secure Deletion of Data from Magnetic and Solid-State Memory». Еще в то время, когда я этим всем активно занимался и читал, мне в голову прочно врезалась фраза, смысл которой сводился к тому, что очень немногие криптографические библиотеки действительно заботятся о конфиденциальности чувствительной информации (например, ключи шифрования). Ведь информацию можно «вытащить» и из памяти выключенного компьютера; или с жесткого диска, даже если информация была переписана. Всех, кому интересна практическая реализация восстановления информации, отсылаю к статье Питера Гутмана (ссылка приведена выше).
Итак, сегодня выдалось очень подходящее настроение для копания в чужом C++ коде. Вот что из этого получилось. Далее »
Автор: Vladimir, опубликовано в: C/C++, Безопасность, комментариев: 3Май
2008
Наш ответ libresolv
Недавно мне пришлось заняться изучением интерфейса библиотеки libresolv, отвечающей за формирование DNS-запросов и получение и разбор ответов (хотя разбор — это громко сказано). Так получилось, что нормальной внятной документации по API-функциям с примерами использования я найти не смог (может, я не там искал). И хотя код — лучшая документация
, окончательно разобраться с форматом возвращаемых данных я смог только после изучения RFC, посвященных DNS. Далее »
Май
2008
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.

