LINUX.ORG.RU

Избранные сообщения crutch

Продление жизни rvalue

Форум — Development

Привет.

#include <iostream>
using namespace std;
struct S{
  ~S() {cout << "destr\n";}
};
int main(){
  S &&r = (S &&) S{};
  // const S &r = (S &&) S{}; // аналогично
  cout << "-------------\n";
}
Вообще я думал, что жизнь временных объектов продливается лишь единожды - при первой инициализации ссылки им, быстрый взгляд в справочник говорит о том же. А у нас здесь две инициализации ссылки, т.е. объекту стоило бы уничтожиться после двоеточия. Но запустив тест получается, что объект переживает cout, компилятор не ругается (clang, gcc). Вопрос - будет ли жить временный объект до тех пор, пока живёт r, вообще он живёт, но насколько это по правилам?

In general, the lifetime of a temporary cannot be further extended by «passing it on»: a second reference, initialized from the reference to which the temporary was bound, does not affect its lifetime.

 

pavlick
()

Накидайте книжек по теории типов

Форум — Talks

TaPL в процессе, есть что-нибудь ещё?
Желательно вместе с примерами на каком-нибудь Coq/Agda/etc
И ещё, что нужно вкуривать перед HoTT?

 , , ,

Unununij
()

Как избежать race в epoll edge-triggered режиме

Форум — Development

Коллеги, я немного не понял вот какой момент.

Допустим, у меня есть сокет, который в неблокирующем режиме.

Я сделал epoll_wait, узнал что он активен. Читаю из него до EWOULDBLOCK, после чего сразу ухожу в epoll_wait.

Между последним чтением и вызовом epoll_wait мне приходят данные, но из-за edge-triggered режима я не получаю нотификацию (как мне кажется), потому что данные пришли до вызова epoll_wait.

Я правильно проинтерпретировал документацию? Если да, то как избежать этого race condition?

 , ,

max_lapshin
()

Ускорить ретрансмиты TCP SYN

Форум — Development

Есть клиентское ПО, оно пытается установить TCP соединение с сервером. У клиентов иногда бывают проблемы с сетью, и система долго устанавливает соединение. Основная проблема в том что в случае если до сервера не дошел первый SYN пакет система отправляет следующий с некоторой задержкой, 3й пакет отправится еще с большей задержкой, и ретрансмит интервал очень быстро вырастает до 10 секунд и более. Можно ли както через ioctl,setsockopt (или еще как) задать максимальное время ретрансмита для сокета (скажем максимум 2 секунды, чтобы каждые 2 секунды система слала SYN пакет) ?

 ,

zaz
()

Стек технологий для реверсинга

Форум — Development

Для начала, посоветуйте современные свободные/открытые аналоги IDA и PVS-Studio. Которые еще и могут работать не только под винду, но и под линукс. И под 64 бита. Неплохо бы из асма какой-то си-подобный псевдокод или прям си. А для поисковщика ошибок ориентацию на C++.

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

Хотелось бы понять, на чем сейчас сидят реверсеры нативного кода (особенно реверсеры под линукс), какой стек технологий

 , , ,

stevejobs
()

Шаблоны, почему не работает?

Форум — Development

Есть две (почти одинаковых) фунуции с шаблонным параметром:

#include <iostream>
#include <string>

template <typename String = std::string, typename Char = typename String::value_type>
void test1(const std::basic_string<Char>& s) {
  std::cout << "test1<Char> = " << s << std::endl;
}

template <typename String = std::string>
void test2(const std::basic_string<typename String::value_type>& s) {
  std::cout << "test2<typename String::value_type> = " << s << std::endl;
}

int main() {
    test1("test1");
    test2("test2");
}

Обьясните пожалуйста, почему test1 не компилируется (в то время как test2 проходит)?

P.S. g++ 6.2 говорит:

cbegin.cpp: In function ‘int main()’:
cbegin.cpp:85:18: error: no matching function for call to ‘test1(const char [6])’
     test1(«test1»);
                  ^
cbegin.cpp:73:6: note: candidate: template<class String, class Char> void test1(const std::__cxx11::basic_string<Char>&)
 void test1(const std::basic_string<Char>& s) {
      ^~~~~
cbegin.cpp:73:6: note:   template argument deduction/substitution failed:
cbegin.cpp:85:18: note:   mismatched types ‘const std::__cxx11::basic_string<Char>’ and ‘const char [6]’

 , ,

KennyMinigun
()

Вопрос про потоки и мьютексы (си)

Форум — Development

Здравствуйте. Скажите пожалуйста...

Есть приложение, в нём несколько потоков (выполняют одну и ту же функцию со своими локальными переменными), эти потоки обращаются к глобальной переменной, но не изменяют её, а только читают. Нужно ли в этом случае ставить pthread_mutex_lock() ?

 

stD
()

cmake, gcc, linux: Слинковаться с одной из библиотек статически.

Форум — Development

Допустим имеется программа, зависящая от liba, libb, libd. Какой является рекомендованный и самый простой способ слинковаться с liba и libb динамически, а с libd статически?

Все библиотеки установлены в системе пакетным менеджером, информация о флагах получается из pkg-config, порядок линковки может быть любой. Из pkg-config даже если передаем --static мы чаще всего получаем флаг линковки вида -ld, ничем не отличающийся от динамической линковки. Оный необходимо либо обернуть будет в -Wl,-bstatic -Wl,bdynamic.

Тогда вопрос вырождается в то, что совершенно непонятно, как заставить CMake передать компилятору такое заклинание и не наплодить говногода в CMakeLists.txt (В идеале не отказываясь от target_link_libraries)

Или лучше линковаться с libd.a просто добавляя этот файл к add_executable(blah main.c /path/to/libd.a). Но тогда не понятно, как от pkg-config получить путь и имя .a файла и какие предположения можно делать, чтобы было максимально переносимо между дистрибутивами.

 , ,

ncrmnt
()

А что, на 64-х битной архитектуре int остался 32-х битным?

Форум — Development

http://alexanius-blog.blogspot.co.ke/2015/12/c.html#more

Говорят что для языка Си int остался 32-х битным в gcc.

Это правда?

 

Xintrea
()

nasm, стек, 64 бита

Форум — Development

Доброго времени суток. Не могу разобраться, подскажите пожалуйста. Если я хочу поместить в стек что либо отличное от 64 бит мне выдает ошибку когда я собираю программу. решил сделать по умному и записать 32 бита в eax, сдвинуть влево регистр rax на 32 бита, и положить еще раз в eax значение 32 бита. Но получается что когда я ложу в регистр eax значение старшая часть rax обнуляется. Пытался найти что либо в гугле, т.к. не я первый и не я последний кто с этим сталкивается, но не могу сформулировать нормально запрос чтобы найти что меня интересует. Подскажите в какую сторону копать, где что можно почитать чтобы найти ответы.

 , ,

SmilePlz
()

система для сборки с зависимостями для C++

Форум — Development

Нужна система для сборки с зависимостями для C++

В других технологиях есть альтернативы:
Maven - Java
Pip & Eggs - Python
Gems - Ruby
CPAN - Perl
cabal - Haskell
CTAN - TeX

Попробовал найти что-то подобное для Крестов, но с первого захода не осилил :(

Хотелось бы что-то Maven-like: XML с декларативным описанием зависимостей (исходников и бинарников) и описанием настроек сборки.

Важно:
- кроссплатформенность (Lin, Win, OSX) и возможность запускать из голой консоли
- зависимости должны лежать в интернете
- в том числе пред-собранные, без исходников, отдельно для каждой платформы/компилятора/...
- сборка через что-нибудь адекватное типа cmake
- удобная настройка выхлопа под разные дистрибутивы (на лине - использование системных либ, на шиндовсе и маке - «всё своё тащу с собой»)
- очень желательна искоробочная работа с гитхабом и другими подобными источниками (чтобы не поднимать свой сервер для работы с непубличными артефактами)

В качестве точки отсчёта, предлагаю считать за компиляторы только GCC-Linux, Clang-OSX и MSVS-Windows в «текущей» версии стандарта C++ (общяя часть для всех этих компиляторов) c cmake в качестве бэкенда сборки - всё остальное ненужно.

Спасибо за годные советы! С меня как всегда - ничего :3

 , ,

stevejobs
()

Вызов ассемблерной функции с аргументами в стеке

Форум — Development

Пробую написать функцию суммирования двух целых чисел, которая бы работала под Windows и под Linux (Yasm):

	BITS 64
	SECTION .text
	global L3
L3:
	MOV EBP,ESP
	MOV EAX,[EBP+4]
	MOV ECX,[EBP+8]
	ADD EAX,ECX
	RET

#include <stdint.h>
#include <stdio.h>
extern __attribute__((stdcall,noinline)) uint32_t L3(uint32_t a, uint32_t b);
int main() {
	uint32_t c = L3(2,2);
	printf("2+2=%d\n",c);
	return 0;
}
@C:\TDM-GCC-64\bin\gcc.exe -c -o test.obj test.c
@D:\UTILS\yasm.exe -f coff -m amd64 -o addon.obj addon.asm
@C:\TDM-GCC-64\bin\gcc.exe test.obj addon.obj -o test.exe

Однако, при попытке запуска выдается:

2+2=1
Укажите пожалуйста на ошибку. С параметром fastcall программа работает (asm-вставка у меня там суммирует ECX и EDX).

Ссылки по теме
1) http://stackoverflow.com/questions/5612492/how-to-link-elf32-assembly-and-c-f...
2) http://habrahabr.ru/sandbox/26864/

 , ,

pacify
()

Добавить секцию в готовый elf бинарник

Форум — Development

Мне надо добавить новую секцию с исполняемым кодом в уже готовый elf бинарник и поменять entry point чтобы выполнение начиналось именно с нее. Попробовал сделать это через objcopy, секцию оно добавляет, но пишет ворнинг:

$ objcopy --add-section .mytext=my_asm.bin --set-section-flags .mytext=readonly,code,alloc --change-section-address .mytext=66666666 test test2
BFD: test2: warning: allocated section `.mytext' not in segment
readelf показывает такую картину:
Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .text             PROGBITS         00000000004000b0  000000b0
       0000000000000034  0000000000000000  AX       0     0     16
  [ 2] .data             PROGBITS         00000000006000e4  000000e4
       000000000000000e  0000000000000000  WA       0     0     4
  [ 3] .mytext           PROGBITS         0000000003f940aa  001940aa
       0000000000000350  0000000000000000  AX       0     0     1
  [ 4] .shstrtab         STRTAB           0000000000000000  001943fa
       000000000000002f  0000000000000000           0     0     1
  [ 5] .symtab           SYMTAB           0000000000000000  001945f0
       0000000000000108  0000000000000018           6     7     8
  [ 6] .strtab           STRTAB           0000000000000000  001946f8
       000000000000002a  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
....

 Section to Segment mapping:
  Segment Sections...
   00     .text 
   01     .data 

Как(чем) мне добавить секцию .mytext в этот Section to Segment mapping? (Чем поменять entry point я как-нибудь сам разберусь, в крайнем случае через hex редактор это сделаю)

 , ,

SZT
()